共有两种方法可以屏蔽掉SQL注入
一种是官方推荐的,使用where条件表达式
还有一种是刚刚想出来的,自己测试能屏蔽单引号这些(没全部测试,因为我懒)
下面就简单讲讲这两种方法:
第一种(WHERE条件表达式)
格式:$map[‘字段名’] = array(‘表达式’, ‘操作条件’);
简介: 这需要解释什么吗?字段名,表达式,操作条件,看不懂的看下面的例子
TP运算符 | SQL运算符 | 例子 | 实际查询条件 |
---|---|---|---|
eq | = | $map[‘id’] = array(‘eq’,100); | 等效于:$map[‘id’] = 100; |
neq | != | $map[‘id’] = array(‘neq’,100); | id != 100 |
gt | > | $map[‘id’] = array(‘gt’,100); | id > 100 |
egt | >= | $map[‘id’] = array(‘egt’,100); | id >= 100 |
lt | < | $map[‘id’] = array(‘lt’,100); | id < 100 |
elt | <= | $map[‘id’] = array(‘elt’,100); | id <= 100 |
like | like | $map<‘username’> = array(‘like’,’Admin%’); | username like ‘Admin%’ |
between | between and | $map[‘id’] = array(‘between’,’1,8′); | id BETWEEN 1 AND 8 |
not between | not between and | $map[‘id’] = array(‘not between’,’1,8′); | id NOT BETWEEN 1 AND 8 |
in | in | $map[‘id’] = array(‘in’,’1,5,8′); | id in(1,5,8) |
not in | not in | $map[‘id’] = array(‘not in’,’1,5,8′); | id not in(1,5,8) |
and(默认) | and | $map[‘id’] = array(array(‘gt’,1),array(‘lt’,10)); | (id > 1) AND (id < 10) |
or | or | $map[‘id’] = array(array(‘gt’,3),array(‘lt’,10), ‘or’); | (id > 3) OR (id < 10) |
xor(异或) | xor | 两个输入中只有一个是true时,结果为true,否则为false,例子略。 | 1 xor 1 = 0 |
exp | 综合表达式 | $map[‘id’] = array(‘exp’,’in(1,3,8)’); | $map[‘id’] = array(‘in’,’1,3,8′); |
例子:
-
$model = M('Users');
-
$map['uid'] = $uid;
-
$model->where($map)->find();
使用where表达式后,TP会自动拼接where条件,并将条件中的恶意字符进行转义
第二种(WHERE条件中使用双引号):
举个栗子先:
-
$model = M('Users');
-
$where = "uid = "%{$uid}%"";
-
$model->where($where)->find();
这种方式肯定是会存在注入的,但是TP中有一个方法:
-
I('get.uid');
这个方法会自动将一些特殊字符转义为html实体字符.所以改造下:
-
$uid = I('get.uid');
-
$model = M('Users');
-
$where = "uid = "%{$uid}%"";
-
$model->where($where)->find();
我自己测试uid中加单引号时没有转义,但是SQL语句并没有出错
uid中加入双引号时,I方法将双引号转换为了实体字符,所以SQL语句也没有出错
但是我没有测试其他的什么编码能不能绕过,因为我懒
本文始发于微信公众号(飓风网络安全):Thinkphp中防止SQL注入的两个办法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论