PHP

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

字号+ 作者:wd0g 来源:转载 2016-12-17 08:51 我要评论( )

共有两种方法可以屏蔽掉SQL注入 一种是官方推荐的,使用where条件表达式 还有一种是刚刚想出来的,自己测试能屏蔽单引号这些(没全部测试,因为我懒) 下面就简单讲讲这......

共有两种方法可以屏蔽掉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语句也没有出错

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


本文来自: 蜗蜗侠's Blog-关注网络安全 http://blog.icxun.cn/Php/437.html

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评
暂时未开启评论功能~