【问题标题】:SQL injection prevention on dynamic parameters动态参数的 SQL 注入预防
【发布时间】:2015-06-20 23:46:22
【问题描述】:

我有一个有趣的问题:

我有一个通过 GET 发送的表单,我想保护数据库。

问题是有 8 个带有参数的选择框可以在表单中传递给页面,但它们不必在那里。

我目前正在检查选择框是否发送默认值,如果不是,我将其存储在数组中。之后我循环槽数组并将搜索参数添加到字符串:

$searchString = "WHERE Aktivno = 1";
foreach($pretragaArray as $key => $item){
    $searchString = $searchString." AND";
    $searchString = $searchString." ". $key ." = " . $item;
}

最后我得到这样的搜索字符串查询

WHERE Aktivno = 1 AND IDVrstaOglasa = 1 

WHERE Aktivno = 1 AND IDOpstina = 15 AND IDGrad = 11 AND IDVrstaOglasa = 1 AND Broj_soba = 3 AND IDKategorijaNekretnine = 5

我正在使用 PDO php 类来查询数据库。

我的问题是,有没有办法转义以这种方式生成的字符串,如果没有,是否有更好的方法在 WHERE 子句中使用动态属性数查询数据库。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您可以使用动态数量的参数生成参数化查询,如下所示:

    $searchString = "WHERE Aktivno = 1";
    $params = array();
    $paramNum = 1;
    
    foreach($pretragaArray as $key => $item)
    {
        $paramName = ':param' . $paramNum++;
        $searchString = $searchString." AND";
        $searchString = $searchString." ". $key ." = " . $paramName;
        $params[$paramName] = $item;
    }
    
    $db = new PDO("...");
    $statement = $db->prepare("SELECT * FROM some_table " . $searchString);
    $statement->execute($params);
    $row = $statement->fetch(); // or fetchAll()...
    

    【讨论】:

    • 谢谢,感谢您的回答,我能够修改我的查询并显示结果
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2017-12-17
    • 2012-12-21
    • 1970-01-01
    • 2016-11-08
    • 2012-11-23
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多