2015-12-06 30 views
1

现在我有一个网站,我需要从基本的SQL注入攻击安全。该网站是非常基本的,只是一个登录表单和产品搜索页面。现在我有一个文件,我在网站上保留了我所有的功能。下面是几个例子他们看起来像:创建参数来停止sql注入

function createUser($userName,$userPass){ 
$query = <<<STR 
INSERT INTO Users (userName,userPass,userTypeID) 
VALUES ('$userName','$userPass',2) 
STR; 
return executeQuery($query); 
} 

或者

function getProductByName($productName){ 
$query = <<<STR 
SELECT productID,productName, productPic,productDesc 
FROM Products 
WHERE productName LIKE '%$productName%' 
STR; 


return executeQuery($query); 
} 

我要改变这些,让他们充分利用准备好的发言的,但我无法理解如何,我可以将它们转换。我发现的例子是利用bindParam的像这样的:

$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City) 
VALUES (:nam, :add, :cit)"); 
$stmt->bindParam(':nam', $txtNam); 
$stmt->bindParam(':add', $txtAdd) 
$stmt->bindParam(':cit', $txtCit); 
$stmt->execute(); 

我可以将bindparam到我的功能不知何故?任何线索都会很棒。

回答

1

将它们转换,只是做了prepare()bindParam()部分在显示功能,并在executeQuery()功能​​这样

function createUser($userName,$userPass,$dbh) { 
    $stmt = $dbh->prepare("INSERT INTO Users (userName, userPass, userTypeID) VALUES (:name, :pass, :id)"); 
    $stmt->bindParam(':name', $userName); 
    //etc 
    return executeQuery($stmt); 
} 

function executeQuery($stmt) { 
    $stmt->execute(); 
} 

如果你不想注入$dbh,您可以使用global $dbh;或函数中的类似方法(并且不必更改您现有的代码库)。

但是,当然这将是非常重复的,因为您需要编写多个bindParam()语句。更简单的方式,假设你使用的PDO,将是一个数组传递给​​(as shown in the manual

function createUser($userName,$userPass,$dbh) { 
    $stmt = $dbh->prepare("INSERT INTO Users (userName, userPass, userTypeID) VALUES (:name, :pass, :id)"); 
    $params = array(
     ':name' => $userName, 
     //etc 
    ); 
    return executeQuery($stmt, $params); 
} 

function executeQuery($stmt, $params) { 
    $stmt->execute($params); 
} 

要详细一点:的bindParam()真正的力量来当你)要使用的$data_type$length参数(What are those?)或b)当您使用多个​​语句,例如批量插入

$stmt = $dbh->prepare("INSERT INTO users (name) VALUES (:name)"); 
$stmt->bindParam(":name", $name); 
for (...) { 
    $name = ... 
    $stmt->execute(); 
} 
+0

感谢您的信息。这可能是一个愚蠢的问题,但有一件事我很困惑的是这里这一行: '$ stmt = $ dbh-> prepare(“INSERT INTO users(name)VALUES(:name)”);' 什么是$ dbh在做什么?这是否应该在其他地方宣布?这是数据库连接吗?我看到有些人在线声明为 ''??php $ dbh = new PDO('mysql:host = localhost; dbname = test',$ user,$ pass); ?>' 是这样吗? – SheepCity

+0

@SheepCity它是“db处理程序”,因此它保存关于连接的信息,正确。你发布的代码看起来是正确的,欲了解更多信息,请阅读[官方手册](http://php.net/pdo)。为什么这是必要的?你可能有多个数据库,所以你可以区分它们。以前PHP假设,现在你需要明确地告诉它 – kero