#1 jake

在SpeedPHP框架中,数据库防注入攻击主要采取了“安全过滤”的方式。安全过滤是针对从浏览器中提交的数据进行过滤操作,以防止SQL注入。

通常情况下,我们使用SpeedPHP的数据库操作——spModel的find/findAll/create/update/delete等多个函数的时候,条件condition均可以是数组形式和字符串形式两种。
数组形式将被自动过滤
$rows = array(
        'name' => "'jake'",
        'contents' => "大家好 AND 1=1",
);
$result = spClass('guestbook')->findAll($rows);
echo spClass('guestbook')->dumpSql();

输出:SELECT * FROM guestbook WHERE name = ''jake'' AND contents = '大家好 AND 1=1'

从上面代码可以看到findAll会自动将$rows数组内容,过滤成SQL语句可以接受的字符串。



字符串形式需要开发者手动过滤,使用spModel的escape函数

以下是一个模糊查找的例子:

$obj = spClass('guestbook');
$keyword = urldecode($this->spArgs('keyword'));
$condition = ' contents like '.$obj->escape('%'.$keyword.'%');
$result = $obj->findAll($condition);
echo spClass('guestbook')->dumpSql();

假设提交的keyword是“好”,那么输出是:

SELECT * FROM guestbook WHERE contents like '%好%'

我们看到,escape函数可以为字符串增加单引号,并转换字符串内部的单引号及其他一些符号为过滤状态。

spModel的自动过滤实际上也是使用了escape函数进行过滤。

一般而言,安全过滤是在SpeedPHP框架中默认存在的,所以只在以下情况下,需要手动来过滤:


  • 存在提交参数来需要进行数据库查找或插入、更新、删除数据。
  • 不能用数组形式的条件。

2012-08-04 16:33:45