Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[展示] DZ探秘:输出、输入、SQL句法的安全过滤

[复制链接]
泡哥 发表于 2007-1-23 03:41:52 | 显示全部楼层 |阅读模式
用插件最关心的是安全问题,如果插件作者不注意输出、输入的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('&amp;', '&quot;', '&lt;', '&gt;'), $string)); //替换特殊字符并且将附带参数替换为&\\1(正则过滤)
        }
        return $string;
}


为什么要这么做?其意义在于存入SQL数据表字段的内容不是URL链接。
  1. 例如:<a href="https://discuz.dismall.com/post.php?fid=888&uid=1">URL链接</a>
  2. SQL字段内容:&lt;a href=&quot;https://discuz.dismall.com/post.php?fid=888&amp;uid=1&quot;&gt;URL链接&lt;/a&gt;
复制代码


以前DZ使用php的htmlspecialchars()函数:将特殊字符转成 HTML 的字符串格式

& (和) 转成 &amp;
" (双引号) 转成 &quot;
< (小于) 转成 &lt;
> (大于) 转成 &gt;


仅仅转换上面的四种特殊符号。

现在搞得比较花哨,也就是说当字符串是数组形式,也可转换。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()进行安全过滤。

  1. $username = dhtmlspecialchars(trim($username));
复制代码


前两步控制了链接的产生,那么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查询会认为后面是另一个查询,所以千万不要忽视这一点。

这里说得是一些简单的安全问题,我看过很多插件都不太注意这些。虽然探秘这两个函数有点小儿科,不过总会有人不知道所以说说。特别看了一下小水水的《辩论插件》呵呵,还没抓到漏洞否则我就攻击一下!

评分

4

查看全部评分

squaly 发表于 2007-1-23 03:50:24 | 显示全部楼层
沙发~~~~
回复

使用道具 举报

squaly 发表于 2007-1-23 03:50:47 | 显示全部楼层
好久不见了泡哥:)
回复

使用道具 举报

 楼主| 泡哥 发表于 2007-1-23 03:53:26 | 显示全部楼层
呵呵 最近股票很好 天天数钱手酸!!
回复

使用道具 举报

肯得基 发表于 2007-1-23 04:46:56 | 显示全部楼层
原帖由 泡哥 于 2007-1-23 03:53 发表
呵呵 最近股票很好 天天数钱手酸!!


呵呵,这么好。

[ 本帖最后由 肯得基 于 2007-1-23 04:48 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

chinaoy 发表于 2007-1-23 08:38:52 | 显示全部楼层
顶上去
回复

使用道具 举报

苦涩咖啡 发表于 2007-1-23 08:47:15 | 显示全部楼层
顶了。。。。。。
回复

使用道具 举报

TaRot! 发表于 2007-1-23 08:48:50 | 显示全部楼层
泡哥,分分。。。挖哈哈。。学习。。
回复

使用道具 举报

苦涩咖啡 发表于 2007-1-23 09:05:59 | 显示全部楼层
;P
回复

使用道具 举报

M55 发表于 2007-1-23 09:11:00 | 显示全部楼层

顶起先………………

泡,好久没见了哦…………

哈哈!股市一红就看不到你了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-17 10:32 , Processed in 0.041787 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表