[doc格式] 也谈PHP程序SQL注入防范
也谈PHP程序SQL注入防范
适合读者:网管脚本爱好者
前置知识PHP
.CLUB
liuliu(~hackercorn.)栏目编辑)刘流)cl?誓
也谈PHP程序
SQL注入防范
文/图非零解&周琳
目前,PHP安全问题已经成为PHP领域的一
个热门话题.要想确定脚本是安全的,必须从
最基本之处开始——一输入的过滤和安全的输
出.如果不充分的做好这些基本工作的话,你
的脚本将会一直存在安全问题.本文将从输入
的过滤讨论对PHP程序的SQL注入的防范.
对字符型注入的防范
当脚本的输入出自于其他地方,输入肯定
是不安全的.常见的危险脚本有$一P0ST,
$一
GET,$一REQUEST;~EI$一SERVER.这些都是看起
来安全,实际上都存在一定危险的隐患.面对
这些外来脚本,在做进一步的工作之前,你首
先要做的是使它合法化,同时有效的过滤它.
确认脚本里面包含有你需要的就足够了.就像
如果你想申请一个电子邮箱,仅仅只需要确定
它是一个有效的电子邮箱就行.下面举个例子
进行说明.
通过检查这些数据,我们要尽可能拒绝将
危险的数据写入脚本里面.即使我们可以确定
数据是比较安全的了,也不代表着工作就完成
了.我们还需要确定它被插入的时候也是安全
的.PHP有一个
函数,mYSqI—reaI一
.
符串中的特殊字符.
LImT
y
中
ing
考虑到了连接的当前字符集,用法为:String
mysql——
re&l_esc&pe_string(stringunesc&ped——string[,resour
ce
link—identifier]),其功能是将unesc&ped—string中的特
殊字符转义,并计算连接的当前字符集,因此
可以安全用于mysql_query(),mysql—re&l_esc&pe—string
()并不转义”%”和”一”.
因此,上面的例子,我们可以把它转换成
如下形式.
现在这些数据就完全安全了,可以放心地
插入数据库.为了避免一些错误和增加代码的
可读性,我们通常会对其加前缀.
用这种
的话,它总是以固定的前缀
“d一
“出现.当你插入一个危险的数据时,.也可以使
用mysql—escape_string().~mysql可用addslashes
().同样可以把用户提交上来的非数字数据进
行转义(使用方法与mysqI_real—escape—string()
类似).如果字符串中只允许字母数字.可使
用函数ctype—alnum().
ctype_
8,嘉鬟
(stringUnescaped—String);.口果字符串
unescs,ped_string..~_.X包含字母或数字,这个函数
就会返回TrUe.
对数字型注入的防范
上面的过滤可以防止字符型注入.对于数
字型的注入.我们可以用其他的函数来对提交
的数据进行检查或者处理.以下面的SQL语句
为例,SQL语句对userid没有经过任何过滤就可
以被构造SQL注入.
在这里的uSerid是接受数字用的,可以用
iSint(),iS—integer(),is,Iong(),is,numeric
()和ctype—digit()等函数判断接受的数据是不
是数字.
.
如果vs,r是integer则返回TI~UE,否则返~FALSE.
2.is—numeric()函数,用法为boolis—numeric
(mixed$var).如果变量是数字,或者是包含数
字及符号,小数点,指数的字符串,这个函数
就会返回TrUe.
5.ct~e_digit()函数,用法)bctype一~gil;($string).
如果字符串里只包含字符”0”到”9”,函数
就会返回TrUe.注意,不允许有小数点.
先前的例子经过以上函数is—numeric()处理
后.我们把它转换成这样:
上面的S—userid表示数据是安全的,增加了
代码的可读性(虽然我在编写程序的时候也时
常忘记这样,但是很值得推荐).这样用判断
数字的函数有效地检查了输入的数据.我们还
可以在程序中使用类型设置函数SettYPe()和
intval()把输入的数据转换成数字.
使用函数SettYPe()来处理上面输入的数
据.可以采用下面的形式.
…
1.in
.
tvs,l()~蝴
$bs,se])o~It”
进制转换(默认十进制),返回变量Var的数
值.var可以是任何标量类型.in~;vs,l()不能用于
8,rrs,y或object.注意,除~Izvs,r参数是字符串,否
则intvs,I()的base参数不会有效果.
2.~ttype()函数,用法为boolsettype(mixed$var,
string$type).将变量vs,r的类型设置成type.type的
可能值为”boolean”(或为”bool”,PHP4.2.0以
上),”integer”(或为”int”,PHP4,2.0以
上),”fIos,t”(只在PHP4.2,0之后可以使
用,对于旧版本中使用的”d0UbIe”现已停用),
如果成功则返回TEUE,失败则返~FALSE.
编写过滤输入的西致
用PHP本身的函数就把输入过滤得很严格.
但是在实际编写代码的时候.会有很多的问题
出现.比如我们必须考虑每个变量用什么函数
来过滤.这要建立一个安全的抽象层.能自动
的过滤输入.就可以把过滤的方法建立在一个
函数或者封装在一个类里面.
在PHP中.一般常用两个函数对字符型的输
II霆l;阻,03羹北京市保安总公司网络安全保安分公司协办
„CLU
liuliuhackercQm
日
ca誓>栏目编辑>刘流>@i强鲑盈_一????盏置??溷
入进行过滤addsIashes()和mYsqI—reaI—
escaPe—string().这两个函数适用于不同的
PHP版本,mysql—real—escape—string()是PHP>=4,
3.0中才开始使用.对于PHP+MYSOL编写的程
序,我们不知道用户使用的PHP版本的话,可以
写函数进行相应的判断.
我们用上面编写的sqI—quote()函数对输入
的字符串进行过滤
没有使用整个函数的时候,我们可以用
OR1=1绕过用户的验证,SQL语句变为:
使用sqI—quote()函数后SOL语句变为
„从而使得这条语句变安全了,攻击者单从
这条语句绕过验证的话就不可能了.
本文主要讨论了PHP对SOL注入攻击的防
范,参考了<<PHPSecurityBasicPHPSecurity
及其他文章,经过翻译整理后而成.如果读者
:有兴趣的话,可以翻看原文((PHPSecurity:
BasicPHPSecurity)),地址为
net/article/php,security—basic/.J
j适合
前盘
.童一
豢,曩
读者网管一
知识:无
?
_
l:利用ARPKiller
轻松突破网络执法官
更一,k&w&ru999
网络执法官是一款网管软件,可用于管理
局域网,能禁止局域网任意机器连接网络.对
于网管来说,这个功能自然很不错,但如果局
域网中有别人也使用该功能那就麻烦了.因为
这样轻则会导致别人无法上网,重则会导致整
个局域网瘫痪.有什么解决办法呢7那就看看
下面的招数和实现原理吧.
网络抻法官简介
我们可以在局域网中任意,台机器上运行
网络执法宫的主程序NetRobocop.exe.它可以穿
透防火墙,实时监控,记录整个局域网用户上
线情况,可限制各用户上线时所用的jP,时段.
并可将非法用户踢下局域网.该软件适用范围
为局域网内部,不能对网关或路由器外的机器
进行监视或管理,适合局域网管理员使用.
在网络执法官中,要想限制某台机器上
网只要点击网卡”菜单中的权限”,选
择指定的网卡号或在用户列表中点击该网卡所
在行,从右键菜单中选择”权限”,在弹出的
北京市保安总公司网络安全保安分公司协办www.ha
200803.骶圈?爨客防线鼍融盟?一
一纛