#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