蜗蜗侠's Blog-关注网络安全移动版

主页 > 编程语言 > PHP >

Thinkphp中防止SQL注入的两个办法

共有两种方法可以屏蔽掉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′);

例子:

使用where表达式后,TP会自动拼接where条件,并将条件中的恶意字符进行转义

第二种(WHERE条件中使用双引号):

举个栗子先:

这种方式肯定是会存在注入的,但是TP中有一个方法:

这个方法会自动将一些特殊字符转义为html实体字符.所以改造下:

我自己测试uid中加单引号时没有转义,但是SQL语句并没有出错

uid中加入双引号时,I方法将双引号转换为了实体字符,所以SQL语句也没有出错

但是我没有测试其他的什么编码能不能绕过,因为我懒

(责任编辑:蜗蜗侠)