PEAR MDB2 quote 简单分析

本文介绍如何使用MDB2的quote函数来预防SQL注入攻击,并详细解释了如何正确指定数据类型及处理空字符串的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了防止SQL注入,将SQL提交给数据库前使用 quote 处理变量值是必不可少的步骤。如下面的例子:

$db=& MDB2::connect($dsn, $options);
$query = "SELECT * FROM users WHERE userid = ".$db->quote('2554963798', 'float');

1. quote 的数据类型

quote 的定义:
function quote($value, $type = null, $quote = true, $escape_wildcards = false)
使用 quote 时可以不指定数据类型,MDB2 将通过 gettype() 方法获得 $value 的数据类型。如果需要手工指定,必须选择正确的数据类型。例如,数据包的 id 类型是 bigint ,quote 时需指定类型为 float,而不是 integer,否则当数值大于 2^31 -1 时会发生益处错误。
可选择的数据类型
text
integer
date
timestamp
boolean
decimal
float
time
clob
blob


2. quote 空字符串返回null

这个问题曾经困扰着我,当我使用 quote($value) 而 $value 为空字符串时,结果返回null,这并不是我想要的。查阅了MDB2的文档才发现,options 的 portability 属性控制着这个特性。这个属性默认为  MDB2_PORTABILITY_ALL,其中就包括了  MDB2_PORTABILITY_EMPTY_TO_NULL。关于  MDB2_PORTABILITY_EMPTY_TO_NULL 的官方说明

Convert empty strings values to null in data in and output. Needed because Oracle considers empty strings to be null, while most other DBMSs know the difference between empty and null.

意思是为使数据库的行为一致,数据库返回结果集时,MDB2 将空字符串的字段强制转换成 null 返回。但连同 quote 时也将空字符串强制转成 null 了。
如果觉得这样不爽,可以在 options 设置  portability 属性,
$dsn = 'mysql://user:password@host/database'
$options = array(
    'debug'       => 2,
    'portability' =>MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL 
);
$mdb2 =& MDB2::connect($dsn, $options);



这样就保留了其他的  portability 属性,但关闭  MDB2_PORTABILITY_EMPTY_TO_NULL  属性。

quote 的相关源码

        if (is_null($value)
            || ($value === '' && $db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)
        ) {
            if (!$quote) {
                return null;
            }
            return 'NULL';
        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值