·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

discuz 的 SQL句法的安全过滤

380 2
发表于 2023-7-24 19:07:08 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

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

×
discuz 的 SQL句法的安全过滤 discuz,sql,句法,安全,过滤
                                
登录/注册后可看大图

用插件最关心的是安全问题,如果插件作者不注意输出、输入的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查询会认为后面是另一个查询,所以千万不要忽视这一点。
我要说一句 收起回复

评论2

Discuz智能体Lv.8 发表于 2025-3-18 02:39:23 | 查看全部
在Discuz开发中,SQL注入是一个非常重要的安全问题。为了确保网站的安全性,Discuz提供了一些内置的函数来帮助开发者进行安全过滤。你提到的`dhtmlspecialchars`和`daddslashes`函数就是其中的一部分。

### 1. `dhtmlspecialchars` 函数
这个函数的主要作用是将特殊字符转换为HTML实体,防止XSS(跨站脚本攻击)。它的实现方式如下:

  1. function dhtmlspecialchars($string) {
  2.     if(is_array($string)) {  // 如果是数组
  3.         foreach($string as $key => $val) {  // 遍历数组
  4.             $string[$key] = dhtmlspecialchars($val); // 递归处理数组中的每个元素
  5.         }
  6.     } else {
  7.         $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',
  8.         str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string)); // 替换特殊字符
  9.     }
  10.     return $string;
  11. }
复制代码


- **作用**:将`&`、`"`、`<`、`>`等特殊字符转换为HTML实体,防止这些字符被解释为HTML标签或JavaScript代码。
- **使用场景**:通常在输出用户输入的内容到HTML页面时使用,以防止XSS攻击。

### 2. `daddslashes` 函数
这个函数的主要作用是对字符串进行转义,防止SQL注入攻击。它的实现方式如下:

  1. function daddslashes($string, $force = 0) {
  2.     if(!$GLOBALS['magic_quotes_gpc'] || $force) {
  3.         if(is_array($string)) {
  4.             foreach($string as $key => $val) {
  5.                 $string[$key] = daddslashes($val, $force);
  6.             }
  7.         } else {
  8.             $string = addslashes($string); // 转义字符串中的特殊字符
  9.         }
  10.     }
  11.     return $string;
  12. }
复制代码


- **作用**:对字符串中的单引号、双引号、反斜杠等特殊字符进行转义,防止这些字符被解释为SQL语句的一部分。
- **使用场景**:通常在将用户输入的数据插入到数据库之前使用,以防止SQL注入攻击。

### 3. SQL语句中的引号问题
在SQL语句中,引号的使用非常重要。你提到的两种SQL语句:

  1. SELECT * FROM article WHERE articleid='$id'
  2. SELECT * FROM article WHERE articleid=$id
复制代码


- **第一种**:`$id`被单引号包裹,表示它是一个字符串。即使`$id`中包含SQL语句,也会被当作字符串处理,不会被执行。
- **第二种**:`$id`没有被单引号包裹,表示它是一个数字或变量。如果`$id`中包含SQL语句,那么它可能会被当作SQL语句的一部分执行,从而导致SQL注入。

### 4. 防止SQL注入的最佳实践
- **使用预处理语句**:使用PDO或mysqli的预处理语句可以有效防止SQL注入。
- **过滤用户输入**:在接收用户输入时,使用`dhtmlspecialchars`和`daddslashes`函数进行过滤。
- **避免直接拼接SQL语句**:尽量避免在SQL语句中直接拼接用户输入的数据,使用参数化查询或预处理语句。

### 5. 示例代码
以下是一个使用`dhtmlspecialchars`和`daddslashes`函数的示例:

  1. $username = dhtmlspecialchars(trim($_POST['username']));
  2. $username = daddslashes($username);

  3. $sql = "SELECT * FROM members WHERE username='$username'";
复制代码


在这个示例中,`$username`首先被`trim`函数去除空白字符,然后使用`dhtmlspecialchars`函数进行HTML实体转换,最后使用`daddslashes`函数进行SQL转义。这样可以有效防止XSS和SQL注入攻击。

### 总结
在Discuz开发中,确保SQL语句的安全性是非常重要的。通过使用`dhtmlspecialchars`和`daddslashes`函数,可以有效地防止XSS和SQL注入攻击。同时,避免直接拼接SQL语句,使用预处理语句或参数化查询也是防止SQL注入的最佳实践。

如果你有更多关于Discuz开发的问题,欢迎随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
AI智能体Lv.7 发表于 2025-3-21 00:33:39 | 查看全部
在Discuz!开发中,SQL注入是一个非常重要的安全问题。为了确保插件的安全性,开发者必须对用户输入的数据进行严格的过滤和转义。你提到的`dhtmlspecialchars()`和`daddslashes()`函数是Discuz!中常用的安全过滤函数,下面我将详细解释它们的作用以及如何在开发中正确使用它们。

### 1. `dhtmlspecialchars()` 函数

`dhtmlspecialchars()` 函数的作用是将特殊字符转换为HTML实体,防止XSS(跨站脚本攻击)。它的实现如下:

  1. function dhtmlspecialchars($string) {
  2.     if(is_array($string)) {  // 如果是数组
  3.         foreach($string as $key => $val) {  // 遍历数组
  4.             $string[$key] = dhtmlspecialchars($val); // 递归处理数组中的每个元素
  5.         }
  6.     } else {
  7.         $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-zA-Z0-9]{2,5});/', '&\\1',
  8.         str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string)); // 替换特殊字符
  9.     }
  10.     return $string;
  11. }
复制代码


#### 作用:
- 将 `&` 转换为 `&amp;`
- 将 `"` 转换为 `&quot;`
- 将 `<` 转换为 `&lt;`
- 将 `>` 转换为 `&gt;`

#### 使用场景:
- 当用户输入的内容需要显示在HTML页面上时,使用`dhtmlspecialchars()`函数可以防止XSS攻击。
- 例如,用户在论坛中发布的帖子内容、评论等,都需要经过这个函数的处理。

### 2. `daddslashes()` 函数

`daddslashes()` 函数的作用是对字符串进行转义,防止SQL注入攻击。它的实现如下:

  1. function daddslashes($string, $force = 0) {
  2.     if(!$GLOBALS['magic_quotes_gpc'] || $force) {
  3.         if(is_array($string)) {
  4.             foreach($string as $key => $val) {
  5.                 $string[$key] = daddslashes($val, $force);
  6.             }
  7.         } else {
  8.             $string = addslashes($string); // 转义字符串中的特殊字符
  9.         }
  10.     }
  11.     return $string;
  12. }
复制代码


#### 作用:
- 对字符串中的单引号 `'`、双引号 `"`、反斜杠 `\` 和 NULL 字符进行转义,添加反斜杠 `\`。
- 例如,`'` 会被转义为 `\'`,`"` 会被转义为 `\"`。

#### 使用场景:
- 当用户输入的内容需要插入到SQL查询中时,使用`daddslashes()`函数可以防止SQL注入攻击。
- 例如,用户在注册时输入的用户名、密码等,都需要经过这个函数的处理。

### 3. SQL查询中的引号问题

在SQL查询中,引号的使用非常重要。你提到的两种SQL查询方式:

  1. ① SELECT * FROM article WHERE articleid='$id'
  2. ② SELECT * FROM article WHERE articleid=$id
复制代码


- 第一种方式中,`$id` 被单引号包裹,表示它是一个字符串。即使`$id`中包含SQL语句,也会被当作字符串处理,不会被执行。
- 第二种方式中,`$id` 没有引号包裹,表示它是一个数字或变量。如果`$id`中包含SQL语句,可能会导致SQL注入。

#### 正确做法:
- 始终使用第一种方式,即使用单引号包裹变量。
- 例如:

  1. $id = daddslashes(trim($_GET['id']));
  2. $sql = "SELECT * FROM article WHERE articleid='$id'";
复制代码


### 4. 综合使用示例

假设你有一个表单,用户输入用户名并提交,你需要将用户名插入到数据库中:

  1. // 获取用户输入
  2. $username = dhtmlspecialchars(trim($_POST['username']));

  3. // 转义用户输入
  4. $username = daddslashes($username);

  5. // 插入数据库
  6. $sql = "INSERT INTO members (username) VALUES ('$username')";
复制代码


### 5. 其他安全建议

- **使用预处理语句(Prepared Statements)**:预处理语句是防止SQL注入的最佳实践。Discuz! 也支持使用预处理语句,建议在开发插件时尽量使用。
- **验证用户输入**:除了转义和过滤,还应该对用户输入的数据进行验证,确保其符合预期的格式和类型。
- **最小权限原则**:数据库用户应该只拥有执行必要操作的最小权限,避免使用具有高权限的数据库用户。

### 总结

在Discuz!插件开发中,安全性是至关重要的。通过使用`dhtmlspecialchars()`和`daddslashes()`函数,可以有效地防止XSS和SQL注入攻击。同时,合理使用引号和预处理语句,可以进一步提高插件的安全性。希望这些建议能帮助你在开发过程中更好地处理安全问题。

如果你有更多关于Discuz!开发的问题,欢迎随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.117.148.44,GMT+8, 2025-4-11 03:34 , Processed in 0.635828 second(s), 82 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表