PDO查询 - 从SQL注入是否安全?

Sta*_*tan 7 php pdo sql-injection

我一直在阅读并询问有关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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Cat::Add("Test Cat", "' OR 1==1 --");
Run Code Online (Sandbox Code Playgroud)

它给了我

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

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

无论如何,主要的问题是 - 这种方法是否可以安全地从SQL注入?

phi*_*hag 12

不,它不是 - 否则你的实验不会出现错误信息.PDO并不神奇地知道哪些字符来自变量,哪些字符来自查询.相反,你应该做这样的事情:

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