Php mysql语句中的绑定过程
众所周知,准备好的语句可以很好地抵御SQL注入攻击 有人能解释一下在绑定过程中发生了什么使这一点成为可能吗Php mysql语句中的绑定过程,php,mysql,pdo,sql-injection,Php,Mysql,Pdo,Sql Injection,众所周知,准备好的语句可以很好地抵御SQL注入攻击 有人能解释一下在绑定过程中发生了什么使这一点成为可能吗 我的主要困惑源于这样一个事实:语句使用占位符,而这些占位符被变量替换。因此,如果变量包含恶意sql,那么它们仍然会被绑定以代替占位符?否,绑定过程会检测绑定值是否与进入数据库的值1:1匹配 所以,"xxx,;删除表yyy;'因为值将是varchar字段中的实际值。当不使用参数绑定时,将执行此代码 首先,PDO清理DB引擎视为常量的内容,例如INSERT子句上的值、WHERE子句上的比较值等
我的主要困惑源于这样一个事实:语句使用占位符,而这些占位符被变量替换。因此,如果变量包含恶意sql,那么它们仍然会被绑定以代替占位符?否,绑定过程会检测绑定值是否与进入数据库的值1:1匹配
所以,"xxx,;删除表yyy;'因为值将是varchar字段中的实际值。当不使用参数绑定时,将执行此代码 首先,PDO清理DB引擎视为常量的内容,例如INSERT子句上的值、WHERE子句上的比较值等等,但它不清理标识符、关键字或其他内容。(旁注:它既不能净化动态SQL,也不能净化动态SQL,因此如果使用动态SQL,就不能只依赖PDO) 关于您要问的问题,您应该注意,在任何参数绑定上,您都提供了您想要的绑定类型:字符串、数字或布尔(或者其他,我不记得了)。因此,他的事实是:
- 声明的数值和布尔参数值不存在任何错误 作为PDO的代码可以很容易地检查它对其类型的约束,并生成相应的文本李>
- 空值很容易转换为空关键字李>
- 冲突值当然是string类型的,那么PDO在这里做什么呢?它以同样的方式进行消毒