此PDO代码如何防止SQL注入?

时间:2011-08-02 16:17:46

标签: php mysql sql security pdo

所以我正在调查整个PDO的事情,当我遇到这个代码时,我正在阅读这个博客教程,解释是如果我使用PDO进行数据绑定 - 用户将无法添加SQL注入。这是如何工作的?

# no placeholders - ripe for SQL Injection!  
$STH = $DBH->("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)");  

# unnamed placeholders  
$STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?); 

# named placeholders 
$STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");  

这是我从中获得的网站的链接,如果您想阅读它以供参考。 http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

5 个答案:

答案 0 :(得分:4)

PDO在幕后做的不仅仅是用参数化数据替换占位符。数据库引擎可以接受类似于“这是您的声明,这里是占位符的形式的查询,我将告诉您每个占位符的内容”。 SQL引擎知道参数不是要执行的原始代码,而是仅被视为数据。

答案 1 :(得分:3)

(第二行有一个错误;字符串没有终止。添加");到最后,你应该没问题。它也在你链接的页面上,所以它的错你当然还需要提供代替问号的值,然后在得到任何结果之前实际运行查询。)

无论如何,到了这一点。 PDO查找?:name标记,并使用您指定的值替换它们(按顺序或按名称分别)。当值插入到查询字符串中时,它们首先被处理以转义可能用于注入攻击的任何内容。

它类似于在查询中使用mysql_real_escape_string()(或较弱的addslashes())之前使用它,但PDO会自动执行该操作,并且效果更好。

答案 2 :(得分:0)

因为PDO知道在使用预准备语句时如何正确地将值插入到查询中。

答案 3 :(得分:0)

当您将值绑定到占位符时,例如

$sth->bindValue(':name', $name, PDO::PARAM_STR);

PDO会妥善处理它。因此,SQL注入将无效。

答案 4 :(得分:0)

因为带有绑定参数的预准备语句是已经完成查询分析的语句,而字符串或整数的位置只能是striongs或ints。没有对语句进行新的分析,因此不能将给定的参数分析为与SQL相关的内容,也不会将其作为SQL进行分析。