浅生 发表于 2021-4-20 17:20:44

Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决方案

关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。
出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了社区安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
解决方案如下:
\source\class\discuz的discuz_application.php
查找如下代码(在360行左右),并替换
private function _xss_check() {      static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');      if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {                        system_error('request_tainting');      }      if($_SERVER['REQUEST_METHOD'] == 'GET' ) {                        $temp = $_SERVER['REQUEST_URI'];      } elseif(empty ($_GET['formhash'])) {                        $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');      } else {                        $temp = '';      }      if(!empty($temp)) {                $temp = strtoupper(urldecode(urldecode($temp)));                foreach ($check as $str) {                              if(strpos($temp, $str) !== false) {                                                system_error('request_tainting');                              }                }      }      return true;}替换为:
private function _xss_check() {      $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));      if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {                        system_error('request_tainting');      }      return true;}

Discuz智能体 发表于 2025-3-21 01:04:46

在Discuz!系统中,`_xss_check()`函数用于防止XSS攻击,它会检查用户提交的数据中是否包含一些特殊字符或潜在的恶意代码。当系统检测到这些字符时,会拒绝请求并提示“您当前的访问请求当中含有非法字符,已经被系统拒绝”。

对于您提到的问题,特别是在使用工具(如火车头采集器)批量发布文章时,由于文章内容中可能包含特殊符号(如`&`、`/`等),导致系统误判为非法字符而拒绝请求。为了解决这个问题,您可以尝试以下方法:

### 方法一:修改`_xss_check()`函数
您可以修改`_xss_check()`函数,放宽对某些字符的限制。具体步骤如下:

1. 打开文件:`source/class/discuz/discuz_application.php`
2. 找到`_xss_check()`函数,通常在360行左右。
3. 修改或注释掉对某些字符的检查。例如,如果您希望允许`&`和`/`字符,可以将相关代码注释掉或删除。

修改前的代码:
private function _xss_check() {
    static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
    foreach($check as $str) {
      if(strpos($this->var['post'], $str) !== false) {
            system_error('request_tainting');
      }
    }
}

修改后的代码:
private function _xss_check() {
    static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
    foreach($check as $str) {
      if(strpos($this->var['post'], $str) !== false) {
            // 允许某些特殊字符
            if ($str == '&' || $str == '/') {
                continue;
            }
            system_error('request_tainting');
      }
    }
}

### 方法二:使用HTML实体编码
如果您不想修改系统核心文件,可以在发布文章之前,将内容中的特殊字符转换为HTML实体编码。例如:
- `&` 转换为 `&amp;`
- `<` 转换为 `&lt;`
- `>` 转换为 `&gt;`
- `"` 转换为 `&quot;`
- `'` 转换为 `&#39;`

这样,系统在检查时就不会将这些字符视为非法字符。

### 方法三:使用插件或扩展
如果您不想修改系统文件,也可以考虑使用第三方插件或扩展来处理这个问题。您可以在DZ插件网(https://www.dz-x.net/)上搜索相关的插件,看看是否有现成的解决方案。

### 注意事项
1. **安全性**:修改`_xss_check()`函数可能会降低系统的安全性,因此请确保您了解潜在的风险,并在修改后仔细测试。
2. **备份**:在修改任何系统文件之前,请务必备份原始文件,以便在出现问题时可以恢复。

如果您有其他问题或需要进一步的帮助,请随时联系我!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-21 01:05:12

在Discuz!系统中,`_xss_check()`函数用于防止XSS(跨站脚本攻击)攻击,它会检查用户提交的数据中是否包含一些特殊字符或潜在的恶意代码。当系统检测到这些字符时,会拒绝请求并提示“您当前的访问请求当中含有非法字符,已经被系统拒绝”。

对于你提到的问题,当使用工具(如火车头采集器)批量发布文章时,如果文章内容中包含特殊字符(如`&`、`/`等),可能会触发`_xss_check()`函数的检查机制,导致请求被拒绝。

### 解决方案

你可以通过修改`_xss_check()`函数的代码来放宽对某些字符的限制。以下是具体的修改步骤:

1. **找到`discuz_application.php`文件**:
   该文件位于Discuz!的`source/class/discuz/`目录下。

2. **修改`_xss_check()`函数**:
   在`discuz_application.php`文件中,找到`_xss_check()`函数(通常在360行左右),并修改其内容。

   原始代码可能如下:
   private function _xss_check() {
       static $check = array('"', '>', '<', '\'', '%3C', '%3E', '%22', '%27', '%3c', '%3e');
       foreach($check as $str) {
         if(strpos($this->var['post'], $str) !== false) {
               return false;
         }
       }
       return true;
   }

   你可以将`$check`数组中的某些字符移除,或者根据你的需求调整。例如,如果你希望允许`&`和`/`字符,可以将它们从`$check`数组中移除:

   private function _xss_check() {
       static $check = array('"', '>', '<', '\'', '%3C', '%3E', '%22', '%27', '%3c', '%3e');
       // 移除 '&' 和 '/' 的检查
       foreach($check as $str) {
         if(strpos($this->var['post'], $str) !== false) {
               return false;
         }
       }
       return true;
   }

3. **保存文件并测试**:
   保存修改后的`discuz_application.php`文件,然后重新尝试发布包含特殊字符的文章,看看问题是否解决。

### 注意事项

- **安全性**:修改`_xss_check()`函数可能会降低系统的安全性,因此请确保你了解这些修改的潜在风险。如果你放宽了对某些字符的限制,可能会使网站更容易受到XSS攻击。

- **备份**:在进行任何代码修改之前,请务必备份原始文件,以便在出现问题时可以快速恢复。

- **测试**:在正式环境中应用这些修改之前,建议在测试环境中进行充分的测试,确保修改不会引入新的问题。

如果你有其他问题或需要进一步的帮助,请随时联系我!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决方案