Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql语句中的绑定过程_Php_Mysql_Pdo_Sql Injection - Fatal编程技术网

Php mysql语句中的绑定过程

Php mysql语句中的绑定过程,php,mysql,pdo,sql-injection,Php,Mysql,Pdo,Sql Injection,众所周知,准备好的语句可以很好地抵御SQL注入攻击 有人能解释一下在绑定过程中发生了什么使这一点成为可能吗 我的主要困惑源于这样一个事实:语句使用占位符,而这些占位符被变量替换。因此,如果变量包含恶意sql,那么它们仍然会被绑定以代替占位符?否,绑定过程会检测绑定值是否与进入数据库的值1:1匹配 所以,"xxx,;删除表yyy;'因为值将是varchar字段中的实际值。当不使用参数绑定时,将执行此代码 首先,PDO清理DB引擎视为常量的内容,例如INSERT子句上的值、WHERE子句上的比较值等

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

有人能解释一下在绑定过程中发生了什么使这一点成为可能吗


我的主要困惑源于这样一个事实:语句使用占位符,而这些占位符被变量替换。因此,如果变量包含恶意sql,那么它们仍然会被绑定以代替占位符?

否,绑定过程会检测绑定值是否与进入数据库的值1:1匹配


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

首先,PDO清理DB引擎视为常量的内容,例如INSERT子句上的值、WHERE子句上的比较值等等,但它不清理标识符、关键字或其他内容。(旁注:它既不能净化动态SQL,也不能净化动态SQL,因此如果使用动态SQL,就不能只依赖PDO)

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

  • 声明的数值和布尔参数值不存在任何错误 作为PDO的代码可以很容易地检查它对其类型的约束,并生成相应的文本
  • 空值很容易转换为空关键字
  • 冲突值当然是string类型的,那么PDO在这里做什么呢?它以同样的方式进行消毒

正是因为这样,我不确定发生了什么。这是在解析之后发生的数据库引擎特性,等等。通过参数绑定,查询已经“准备好”,执行的代码已经确定。绑定,作为最后一步,填充值。还有一件事:你知道关于这个特定方面的任何文档吗,也许查询所经历的过程的一些图表。简短的回答是:“这些占位符被净化的变量替换”