繁体   English   中英

创建参数以停止SQL注入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM