马上注册,免费下载更多dz插件网资源。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
登录/注册后可看大图
用插件最关心的是安全问题,如果插件作者不注意输出、输入的GET方法安全过滤,那么危险性是很大的,同样SQL的句法缺少小小的引号,也会带来致命的威胁。
我们来看看DZ是怎么安全过滤的:
首先./include/global.func.php中有这样一个函数
function dhtmlspecialchars($string) {
if(is_array($string)) { //是数组
foreach($string as $key => $val) { //遍历数组
$string[$key] = dhtmlspecialchars($val); //将特殊字符转成 HTML 的字符串格式
}
} else {
$string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',
str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string)); //替换特殊字符并且将附带参数替换为&\\1(正则过滤)
}
return $string;
}
为什么要这么做?其意义在于存入SQL数据表字段的内容不是URL链接。
例如:<a href="http://www.discuz.net/post.php?fid=888&uid=1">URL链接</a>SQL字段内容:<a href="http://www.discuz.net/post.php?fid=888&uid=1">URL链接</a>
[color=rgb(51, 102, 153) !important]复制代码
以前DZ使用php的htmlspecialchars()函数:将特殊字符转成 HTML 的字符串格式
& (和) 转成 &
" (双引号) 转成 "
< (小于) 转成 <
> (大于) 转成 >
仅仅转换上面的四种特殊符号。
现在搞得比较花哨,也就是说当字符串是数组形式,也可转换。4.X和5.0的区别就是DZ的标新立异!
其次是转义函数daddslashes()
function daddslashes($string, $force = 0) {
if(!$GLOBALS['magic_quotes_gpc'] || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string); //转义语句中的引号
}
}
return $string;
}
php的addslashes()函数其实就是加个反斜杠,目的在于区分单双引号的作用是定义语句还是字符串形式出现。"语句"和\"语句\"的区别是很大,后者的引号仅仅是字符串,而不是句法定义。
看到这里你有可能还不明白:
说得具体点:
例如你有一个输入框,给会员输入名字,然后把这个名字存入members表的username字段。如果你不进行安全过滤,那么完全可以提交一个链接并带有数据库查询语句,页面显示的时候名字呈链接状,任何人点击即可进行数据库操作。
例如(这样猜猜密码):
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,1)='m
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,2)='my
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,3)='myp
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,4)='mypa
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,5)='mypas
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,6)='mypass
这里是最重要的:
当页面form表单提交数据到php处理时,大家应该使用dhtmlspecialchars()或者daddslashes()进行安全过滤。
$username = dhtmlspecialchars(trim($username));
[color=rgb(51, 102, 153) !important]复制代码
前两步控制了链接的产生,那么SQL的书写也要注意:
①SELECT * FROM article WHERE articleid='$id'
②SELECT * FROM article WHERE articleid=$id
这两句SQL查询是不一样的,$id的变量完全可以这么写
指定变量$id为:
1 and 1=2 union select * from user where userid=1
没有了引号$id既不是一个字符串,只要增加空格那么SQL查询会认为后面是另一个查询,所以千万不要忽视这一点。 |
©DZ插件网所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 网站部分内容来源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,得到更好的正版服务。 您在本站任何的赞助购买、下载、查阅、回复等行为等均表示接受并同意签订《DZ插件网免责声明协议》。 如有侵权请邮件与我们联系处理: discuzaddons@vip.qq.com 并出示相关证明以便删除。敬请谅解!
|
|