用于动态创建DB2查询的PHP和清理字符串
我对DB2forIBMI比较陌生,我想知道如何在PHP中为动态生成的查询正确地清理数据 例如,如果编写一个处理所有数据库交互的PHP类,就必须传递表名等,其中一些不能使用用于动态创建DB2查询的PHP和清理字符串,db2,php,ibm-midrange,sql-injection,Db2,Php,Ibm Midrange,Sql Injection,我对DB2forIBMI比较陌生,我想知道如何在PHP中为动态生成的查询正确地清理数据 例如,如果编写一个处理所有数据库交互的PHP类,就必须传递表名等,其中一些不能使用db2\u bind\u param()传入。db2\u prepare()是否自行清理结构化查询?或者是否有可能在db2\u prepare()调用中“执行”格式错误的查询?我知道有db2\u execute(),但是数据库正在db2\u prepare()中做一些事情,我不确定是什么(只是语法验证?) 我知道,如果传递的值不
db2\u bind\u param()
传入。db2\u prepare()
是否自行清理结构化查询?或者是否有可能在db2\u prepare()
调用中“执行”格式错误的查询?我知道有db2\u execute()
,但是数据库正在db2\u prepare()
中做一些事情,我不确定是什么(只是语法验证?)
我知道,如果传递的值不受用户输入结果的影响,那么应该不会有太大问题,但是如果希望在查询中使用数据之前清理数据(不使用db2\u prepare()/db2\u execute()
),db2的检查表是什么?我唯一能找到的就是通过在单引号前面加上另一个单引号来转义单引号。这真的是需要注意的全部吗 调用db2\u prepare()
时,不会发生神奇的“清理”——它只会尝试将传递的字符串编译为单个SQL语句。如果它不是有效的DB2SQL语句,那么将返回错误。与db2\u exec()
相同,只需在一次调用中执行db2\u prepare()
和db2\u execute()
分别执行的操作
编辑(以解决OP中的进一步问题)
每个SQL语句的执行分为三个阶段:
db2_prepare()
、db2_bind_param()
和db2_execute()
分别对应于步骤1、2和3db2_exec()
结合了步骤1和3,跳过步骤2并假设没有参数标记
现在,谈到参数安全性,绑定步骤确保提供的参数值与预期的数据类型约束相对应。例如,在包含类似于…WHERE MyIntCol=?
的查询中,如果我尝试将字符值绑定到该参数,它将生成一个错误
相反,如果我使用db2_exec()
,并编写如下语句:
$stmt = "SELECT * FROM MyTab WHERE MyIntCol=" . $parm
我可以很容易地将
“0或1=1”之类的内容作为$parm
的值传递,这将生成一个完全有效的SQL语句,只有这样才能由db2_exec()
成功地解析、准备和执行 为了澄清这个问题,您并不是要清理DB2数据,而是要对用户输入做一些事情,以便动态创建SQL语句。对吗?对,对。抱歉造成混淆。大多数消息来源建议使用db2\u prepare()
和db2\u execute()
而不是db2\u exec()。你是说他们这样说是不对的吗?不,@mustacio并不是在暗示,而是指出db2\u exec()
导致了一个prepare隐式发生。那么db2\u prepare()
和db2\u execute()
在幕后做了什么,而db2\u exec()
没有?为什么认为使用前者比后者“更安全”?我试图找出在db2\u prepare()
和db2\u execute()
中采取的过滤步骤,这样我就可以在不实际使用它们的情况下重新创建相同的过滤功能。prepare()使用参数标记。exec()将字符串视为SQL语句。我不确定我是否会称之为过滤或净化,但参数标记会阻止注入攻击,因为execute()不会像对待SQL一样对待注入的SQL—它会像对待参数值一样对待注入的SQL。除非您编写自己的成熟SQL解析器,否则我怀疑您能否实现您认为需要的目标。