码迷,mamicode.com
首页 > 数据库 > 详细

MySQL pdo预处理能防止sql注入的原因

时间:2016-11-12 13:57:18      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:src   webserver   创建   web服务   sql注入   span   调用   命令   作用   

MySQL pdo预处理能防止sql注入的原因:

1、先看预处理的语法

  $pdo->prepare(‘select * from biao1 where id=:id‘);

  $pdo->execute([‘:id‘=>4]);

2、语句一,服务器发送一条sql给mysql服务器,mysql服务器会解析这条sql。

语句二,服务器发送一条sql给mysql服务器,mysql服务器不会解析这条sql,只会把execute的参数当做纯参数赋值给语句一。哪怕参数中有sql命令也不会被执行,从而实现防治sql注入。

 

见图:

普通的sql,直接一条sql语句执行,web服务器自己拼凑sql的时候有可能会把危险的sql语句拼凑进去。

技术分享

 

PDO的sql,让mysql服务器自己拼凑,就算有危险的语句,也只会当做参数处理,不会执行。

技术分享

技术分享

 

注意:为了让mysql服务器去拼凑sql,而不是web server去拼凑,必须在创建pdo对象的时候加个参数:

这个参数叫模拟prepare,默认是TRUE,意思是让web server代替mysql去做prepare,达到模拟prepare的作用。(web server实现模拟prepare的原理其实也就是底层用系统函数自行拼凑sql,和手动拼凑没区别,所以还是会把危险的sql拼凑进去,然后给mysql服务器执行,依然会被sql注入)

所以必须设置为FALSE。

$this->_pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

 

PDO::ATTR_EMULATE_PREPARES

参数为TRUE时,就算调用prepare,execute等pdo函数,底层依旧和普通的mysql没区别,直接发送一条webserver拼凑好的sql语句给mysql server。如图:

技术分享

PDO::ATTR_EMULATE_PREPARES

设置为FALSE后,就会真的执行prepare,execute,如图:

技术分享

 

MySQL pdo预处理能防止sql注入的原因

标签:src   webserver   创建   web服务   sql注入   span   调用   命令   作用   

原文地址:http://www.cnblogs.com/alazalazalaz/p/6056393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!