6

众所周知,准备好的语句可以很好地防御 SQL 注入攻击。

有人可以解释在绑定过程中发生了什么,这使得它如此。

我的主要困惑源于语句使用占位符并且这些占位符被变量替换的事实。因此,如果变量包含恶意 sql,那么它们仍然被绑定在占位符的位置吗?

4

2 回答 2

1

首先,PDO 对 DB 引擎视为常量的内容进行清理,例如:INSERT 子句中的值、WHERE 子句中的比较值等等,但它不会清理标识符或关键字或其他内容。(附注:它也不会清理动态 SQL,因此如果您使用动态 SQL,则不能仅依赖 PDO)

关于您要问的一点,您应该注意,在任何参数绑定上,您都提供了您想要的绑定类型:字符串或数字或布尔值(或其他,我不记得了)。所以他的事实是:

  • 声明的数字和布尔参数值不会注入危险代码,因为 PDO 可以轻松地检查它对其类型的约束,并生成相应的文本。
  • Null 值很容易转换为 Null 关键字。
  • 冲突的值当然是字符串类型的,PDO 在这里做什么?它以与mysqli::real_escape_string相同的方式进行清理。
于 2012-09-04T21:08:27.743 回答
1

不,绑定过程确保绑定值与进入数据库的值 1:1 匹配。

所以,'xxx; 删除表 yyy;' 作为值将是 varchar 字段中的实际值。不使用参数绑定时,将执行此代码。

于 2012-09-04T20:42:02.013 回答