关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
# {/ D1 b: x4 l; U( i解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换 7 J. ?1 m$ K# t
) b s0 N+ E, d' Y* K! w# T! p6 A4 n5 U. ^# X* ~! y( S
PHP
1 I) ^1 l6 o0 b1 Z' J% ?- private function _xss_check() {# q7 n7 @% ^6 g: O0 y' W
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');7 }5 B) l5 P2 E9 s
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
% U* K" t; S5 `8 K" _5 i3 R( t/ Q) T - system_error('request_tainting');
; v; i8 @" g4 K+ d$ N3 { - }
* l3 h5 ~# b) \: t% X8 a - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
$ t# H$ u% q" u# @ - $temp = $_SERVER['REQUEST_URI'];! L$ ?- W/ g1 y) ^9 v
- } elseif(empty ($_GET['formhash'])) {
& \& B: @7 s' V - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
- c1 ]7 x$ R' [& A2 \ - } else {' U) Y6 T+ |& p1 v, P& c) x
- $temp = '';, f2 O9 o" a k* l" n9 P# d+ O! r
- }
3 r+ }2 H; Z0 e2 b. c0 I - if(!empty($temp)) {
6 P' B" d" A' _3 ^- P - $temp = strtoupper(urldecode(urldecode($temp)));9 [1 p! ?, ~' a. T$ U6 A8 Q; }
- foreach ($check as $str) {
* }: f3 |, d) ^ - if(strpos($temp, $str) !== false) {! _. F' T" u3 Z! @8 ^! ^5 B
- system_error('request_tainting');, D6 ~0 g. R* t$ E8 z. m
- }1 A8 E5 A/ c8 ~0 v
- }
1 h- G+ _+ V- Z; Y. U5 L - }
, h h. }- A @( {; I- M8 ` - return true;: D% ]0 N# ]- N/ m. H
- }
复制代码 替换为2 n2 |5 {. m8 n3 {( H( r
- private function _xss_check() {
: t; V/ }4 X/ i6 Q! R$ Y; x# W/ t - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
B+ G6 C6 S: m7 X _' y* ~+ l; M" k - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {1 H7 Z. c4 W; Z/ M/ D
- system_error('request_tainting');3 g* U F$ ]( m8 Q' _$ i: d7 z; ]2 x, l
- }( C8 t) r6 e1 L M' G3 ^. w; w* I
- return true;
1 `2 z$ r( s7 Z6 Q. T - }
复制代码
8 g* h/ F/ l* _ V
; R6 E2 c" @- B% f( L" k9 k8 V6 U$ G$ {" c. K. R: f* u
/ z2 j q& D5 `6 C
- \9 o/ W; m/ |9 B
|