[英]Creating parameters to stop sql injection
现在我有一个站点,需要从基本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合并到我的函数中吗? 任何线索都很好。
要转换它们,只需在显示的函数中execute()
prepare()
和bindParam()
部分,并在executeQuery()
函数中execute()
,如下所示
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,更简单的方法是将数组传递给execute()
( 如手册中所示 )
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);
}
详细说明:当您a)要使用$data_type
或$length
参数( 那些是什么? )或b)当您使用多个execute()
语句(例如,批量插入)时, bindParam()
的真正功能就来了
$stmt = $dbh->prepare("INSERT INTO users (name) VALUES (:name)");
$stmt->bindParam(":name", $name);
for (...) {
$name = ...
$stmt->execute();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.