关于PDO防御sql注入

  • Jesse
  • 2017-12-04 14:57:00
  • 3635

不要对已经被 magic_quotes_gpc或者htmlspecialchars 转义过的字符串使用 addslashes(),因为这样会导致双层转义,或会引起其他问题。

 如果使用的是PDO,最好不要使用addslashes来达到sql的防注入目的,因为PDO本身就可以防御sql注入。

PDO有一项参数:(参考官方手册)

PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。 有些驱动不支持或有限度地支持本地预处理。使用此设置强制PDO总是模拟预处理语句(如果为 TRUE ),或试着使用本地预处理语句(如果为 FALSE)。如果驱动不能成功预处理当前查询,它将总是回到模拟预处理语句上。 需要 bool 类型。 

有网友做过测试: 传送门

使用模拟预处理语句(PDO::ATTR_EMULATE_PREPARES = true), php会将会将变量自动替换占位符, 然后将sql语句交给mysql server执行 

使用本地预处理语句(PDO::ATTR_EMULATE_PREPARES = false), php会将会将变量和带占位符的sql语句分别发送给mysql server去处理后再执行, 

所以要避免sql注入,应使用PDO方式连接 

使用php5.3.6+ 以上版本, 设置PDO::ATTR_EMULATE_PREPARES参数为false


本文出自 亮有一技,转载时请注明出处及相应链接。