mysqlprepared statements中的绑定过程
Posted
技术标签:
【中文标题】mysqlprepared statements中的绑定过程【英文标题】:The binding process in mysql prepared statements 【发布时间】:2012-08-29 13:12:06 【问题描述】:众所周知,prepared statements 可以很好地防御 SQL 注入攻击。
有人能解释一下绑定过程中发生了什么吗?
我的主要困惑源于语句使用占位符并且这些占位符被变量替换的事实。因此,如果变量包含恶意sql,那么它们仍然被绑定在占位符的位置吗?
【问题讨论】:
您的话的简短回答是:“这些占位符被替换为 SANITIZED 变量” 【参考方案1】:不,绑定过程确保绑定值与进入数据库的值 1:1 匹配。
所以,'xxx;删除表 yyy;'作为值将是 varchar 字段中的实际值。不使用参数绑定时,将执行此代码。
【讨论】:
这是我不知道发生了什么。这是在解析等之后发生的数据库引擎功能吗 是的。通过参数绑定,查询已经“准备好”,并且确定了执行的代码。绑定,作为最后一步,填充值。 还有一件事:你知道关于这个特定方面的任何文档吗,也许是查询过程的一些图表【参考方案2】:首先,PDO 会清理数据库引擎视为常量的内容,例如:INSERT 子句上的值、WHERE 子句上的比较值等等,但它不会清理标识符或关键字或其他内容。 (附注:它也不会清理动态 SQL,因此如果您使用动态 SQL,则不能仅依赖 PDO)
关于您要问的问题,您应该注意,在任何参数绑定上,您都提供了您想要的绑定类型:字符串或数字或布尔值(或其他,我不记得了)。所以他的事实是:
声明的数字和布尔参数值不会注入危险 作为 PDO 的代码可以很容易地检查它对其类型的约束,并生成相应的文本。 Null 值很容易转换为 Null 关键字。 冲突的值当然是字符串类型,PDO 在这里做什么?它的消毒方式与mysqli::real_escape_string 相同。【讨论】:
以上是关于mysqlprepared statements中的绑定过程的主要内容,如果未能解决你的问题,请参考以下文章
Java中PreparedStatement和Statement的用法区别