Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这个PDO代码如何防止SQL注入?_Php_Mysql_Sql_Security_Pdo - Fatal编程技术网

Php 这个PDO代码如何防止SQL注入?

Php 这个PDO代码如何防止SQL注入?,php,mysql,sql,security,pdo,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->("INS

所以我研究了整个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)"); #没有占位符-适合SQL注入! $STH=$DBH->(“插入人(姓名、地址、城市)值($name、$addr、$city)”); #未命名占位符 $STH=$DBH->(“插入人(姓名、地址、城市)值(?,?); #命名占位符 $STH=$DBH->(“插入人(姓名、地址、城市)值(:姓名、地址、城市)”; 这是我从网站上得到的链接,以备你阅读参考。

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

PDO在幕后所做的工作远不止用参数化数据替换占位符。数据库引擎可能会接受类似于这是您的语句,这是占位符,我将告诉您每个占位符中的内容”。SQL引擎知道参数不是要执行的原始代码,而是仅作为数据处理。

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

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

PDO将负责正确地转义它。因此,SQL注入将不起作用。

因为带有绑定参数的准备语句是一个已经完成查询分析的语句,而字符串或int的位置只能是striongs或int。没有对语句进行新的分析,因此没有给定的参数可以作为rel进行分析默认为SQL,并且永远不会作为SQL进行分析。

(第2行中有一个错误;字符串未终止。添加一个
)
到最后,您应该没事。它也在您链接到的页面上,所以这是他们的错。当然,您还需要提供替换问号的值,然后在得到任何结果之前实际运行查询。)

总之,说到点子上。PDO查找
:name
标记,并用指定的值替换它们(分别按顺序或按名称)。当这些值被插入到查询字符串中时,首先对它们进行处理,以逃避可能用于注入攻击的任何内容


它类似于在查询中使用某个值之前对该值使用
mysql\u real\u escape\u string()
(或较弱的
addslashes()
),但PDO会自动执行此操作,并且在这方面做得更好。

…如果数据库不支持类似的操作,然后,该数据库的PDO库将知道如何适当地转义数据本身。+1。这一点非常重要。在几乎所有情况下,替换都是由数据库引擎本身完成的。这意味着永远不会有像mysql\u escape\u string VS.mysql\u real\u escape\u string VS.mysql\u escape\u string,我是说,这一次我们会遇到类似的情况。它们只是非常草率的例子。他们甚至不跑。它们缺少
->query
->prepare
方法调用等,因为命令和数据是分开传输的。(对于支持它的后端/启用时。)