PDO准备语句如何帮助防止SQL易受攻击的语句?

时间:2015-06-20 05:23:05

标签: sql pdo

我很困惑或者说我很喜欢,soooooooooo与pdo预备语句相混淆。我知道准备好的声明是保护数据免受黑客攻击的最佳方式。

来自:How can prepared statements protect from SQL injection attacks?

  

我们首先将程序发送到服务器

     

$ db-> prepare(“SELECT * FROM users where id =?”);数据在哪里   由一些名为“占位符”的变量代替。

     

请注意,发送到服务器的查询完全相同,没有任何查询   数据在里面!然后我们用第二个请求发送数据,   完全与查询本身分开:

     

$ DB->执行($数据);

查询 -

$query=$db->prepare("SELECT * FROM USERS WHERE username=?");
$query->execute(array($tex));
$tex=blah; DROP TABLE users;--

那么它就像 - SELECT * FROM USERS WHERE username = blah; DROP TABLE用户; -

准备语句如何帮助我完成上面这个例子?

如果这个问题含糊不清,我真的很抱歉。任何帮助,将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

预准备语句处理程序将确保绑定值始终用作有效的SQL值/文字(即SQL字符串或数字),从不作为'原始SQL文本' 1

这就是占位符值不能用作列名或表名等标识符或充当其他SQL关键字的原因;并且无法生成虚假的易受攻击的查询。相反,它被视为以下内容:

WHERE username='blah; DROP TABLE users;--'
            --^ placeholder ensures valid SQL string value is used
            --  (note automatic/implicit addition of SQL quotes)

即使绑定“更棘手”的数据:

$tex = "blah'; DROP TABLE users;--";  // embedded SQL quote character

它仍然是安全的:

WHERE username='blah''; DROP TABLE users;--'
            --^ placeholder STILL ensures valid SQL string value is used

因此,在使用占位符时,不可能生成易受攻击的SQL(以这种方式)。

对于SQL Injection,查询的“形状”(包括关键字和标识符,但排除值)本身必须由输入更改。

1 技术上占位符值也可以通过单独的数据通道发送(取决于适配器/驱动程序),因此可能甚至不会出现在原始SQL查询本身中。

然而,一个简单的方法来思考为什么占位符是安全的,或者它们是如何工作的:

使用占位符时,适配器确保“sql真正安全转义”的等价物和适用的引用始终用于每个绑定的文本值 - 因此不可能意外忘记。