PHP和清理字符串以用于动态创建的DB2查询

时间:2015-04-20 21:56:46

标签: db2 php ibm-midrange sql-injection

我对DB2 for IBMi相对较新,我想知道如何在PHP中为动态生成的查询正确清理数据的方法。

例如,如果编写处理所有数据库交互的PHP类,则必须传递表名等,其中一些不能使用db2_bind_param()传递。 db2_prepare()是否自行清理结构化查询?或者是否可以执行格式错误的查询"在db2_prepare()电话中?我知道有db2_execute()但数据库正在db2_prepare()中执行某些操作而且我不确定是什么(只是语法验证?)。

我知道如果传递的值不会受到用户输入结果的影响,那么不应该是一个问题,但是如果想要在查询中使用它之前清理数据(不使用{{ 1}})db2的清单是什么?我唯一能找到的是通过在前面加上另一个单引号来逃避单引号。这真的是值得注意的吗?

1 个答案:

答案 0 :(得分:2)

当您调用db2_prepare()时,没有发生神奇的“清理” - 它只会尝试将您传递的字符串编译为单个SQL语句。如果它不是有效的DB2 SQL语句,则将返回错误。与db2_exec()相同,只会在一次调用中执行db2_prepare()db2_execute()分别执行的操作。

编辑(以解决OP的进一步问题)。

每个SQL语句的执行都有三个阶段:

  1. 编译(或准备),在解析语句,语法和语义分析时,确定用户的权限,并创建语句执行计划。

  2. 参数绑定 - 只有在语句包含参数标记时才需要的可选步骤。在此阶段,验证每个参数数据类型以匹配语句文本基于准备所期望的内容。

  3. 执行正确,当步骤1中生成的查询计划由数据库引擎执行时,可选地使用步骤2中提供的参数(变量)值。语句结果(如果有)随后返回给客户端

  4. db2_prepare()db2_bind_param()db2_execute()分别对应于步骤1,2和3。 db2_exec()结合步骤1和3,跳过步骤2并假设缺少参数标记。

    现在,谈到参数安全性,绑定步骤确保提供的参数值对应于预期的数据类型约束。例如,在包含...WHERE MyIntCol = ?之类的查询中,如果我尝试将字符值绑定到该参数,则会生成错误。

    相反,如果我使用db2_exec()并撰写如下声明:

    $stmt = "SELECT * FROM MyTab WHERE MyIntCol=" . $parm
    

    我可以很容易地将"0 or 1=1"之类的内容作为$parm的值传递,这将生成一个完全有效的SQL语句,然后才能由db2_exec()成功解析,准备和执行。