请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 6540|回复: 0

[数据操作] 数据库安全及过滤函数

[复制链接]
发表于 2012-8-4 16:33:45 | 显示全部楼层 |阅读模式

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

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

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

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



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

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

  1. $obj = spClass('guestbook');
  2. $keyword = urldecode($this->spArgs('keyword'));
  3. $condition = ' contents like '.$obj->escape('%'.$keyword.'%');
  4. $result = $obj->findAll($condition);
  5. echo spClass('guestbook')->dumpSql();
复制代码

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

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

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


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

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

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

您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2020-2-19 20:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表