mysql编写语句中的绑定过程

时间:2012-09-04 20:28:00

标签: php mysql pdo sql-injection

很好地宣传,准备好的语句可以很好地防御SQL注入攻击。

有人可以解释绑定过程中会发生什么事情。

我的主要困惑源于一个声明使用占位符并且这些占位符被变量替换的事实。因此,如果变量包含恶意sql,那么它们仍将被绑定以代替占位符吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

首先,PDO清理数据库引擎所看到的常量,例如:INSERT子句上的值,WHERE子句上的比较值等,但它不会清理标识符或关键字或其他内容。 (旁注:它不会消毒动态SQL,因此如果使用动态SQL,则不能仅依赖PDO)

关于你要问的问题,你应该注意,在任何参数绑定上,你提供了你想要的那种绑定:字符串或数字或布尔(或其他,我不记得了)。所以他的事实是:

  • 声明的数字和布尔参数值不会注入危险 代码作为PDO可以轻松检查它的类型约束,并生成相应的文本。
  • 空值很容易转换为Null关键字。
  • 冲突的值当然是字符串类型,PDO在这里做什么?它以与mysqli::real_escape_string相同的方式进行消毒。