【问题标题】:PDO Query - Is this safe from SQL Injection?PDO 查询 - 这对 SQL 注入安全吗?
【发布时间】:2011-02-05 18:59:21
【问题描述】:

我一直在阅读并提出一个关于 SQL 注入安全查询的问题,每个人都说我应该使用 PDO,所以我只启用了我的 MYSQL PDO 扩展并进行了一个简单的查询。

这是我的代码:

public static function Add($catName, $catDescr = "", $catImgURL = "", $catSubLevel = 0, $catSubID = 0)
{

    try
    {
        include_once "db_config.php";
        $DBH = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
        $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );  
        $STH = $DBH->prepare("INSERT INTO cat (catName, catDescr, catImg, catSubLevel, catSubID)
                              VALUES ('$catName', '$catDescr', '$catImgURL', $catSubLevel, $catSubID)");

        $STH->execute();
    }
    catch (PDOException $e)
    {
        echo $e->getMessage();
    }
}

所以一切正常并且看起来很安全,但是当我做这样的事情时:

Cat::Add("Test Cat", "' OR 1==1 --");

它给了我

警告:PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]:语法错误或 访问冲突:1064 你有一个 SQL 语法错误;检查 对应于您的 MySQL 的手册 正确语法的服务器版本 在 '==1 --', '', 0, 0)' 附近使用 2 在 www\mCat.php 上线 25

我想是因为我添加了$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 以便查看我何时有错误。

不管怎样,主要问题是 - 这种方法对 SQL 注入安全吗?

【问题讨论】:

  • 如果你一直把它当作 mysql_query 对待,那么仅仅使用 PDO 是不安全的。
  • 等等,什么?您使用的是 PDO 不绑定参数吗?这显然不安全。

标签: php pdo sql-injection


【解决方案1】:

不,不是 - 否则您的实验不会出现错误消息。 PDO 并不神奇地知道哪些字符来自变量以及哪些构成查询。相反,您应该这样做:

    $STH = $DBH->prepare('INSERT INTO cat ' .
        '(catName, catDescr, catImg, catSubLevel, catSubID) ' .
        'VALUES (?, ?, ?, ?, ?)');
    $values = array($catName, $catDescr, $catImgURL, $catSubLevel, $catSubID);
    $STH->execute($values);

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2016-11-11
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多