手册 >> 数据操作 >> 安全过滤

安全过滤

在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框架中默认存在的,所以只在以下情况下,需要手动来过滤:

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