Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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
用于动态创建DB2查询的PHP和清理字符串_Db2_Php_Ibm Midrange_Sql Injection - Fatal编程技术网

用于动态创建DB2查询的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()中做一些事情,我不确定是什么(只是语法验证?) 我知道,如果传递的值不

我对DB2forIBMI比较陌生,我想知道如何在PHP中为动态生成的查询正确地清理数据

例如,如果编写一个处理所有数据库交互的PHP类,就必须传递表名等,其中一些不能使用
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语句的执行分为三个阶段:

  • 编译(或准备),当对语句进行解析、语法和语义分析时,确定用户的权限,并创建语句执行计划

  • 参数绑定——仅当语句包含参数标记时才需要的可选步骤。在此阶段,将根据准备情况验证每个参数数据类型是否与语句文本所期望的匹配

  • 当数据库引擎执行在步骤1生成的查询计划时,可以选择使用在步骤2提供的参数(变量)值,执行正确。然后将语句结果(如果有)返回给客户机

  • 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或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解析器,否则我怀疑您能否实现您认为需要的目标。