关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
; h. P! U) |$ P, B解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换 # c5 W# s# @* F4 f2 p7 c) [+ u4 \
$ u9 D2 J5 _8 r) P
, Z$ H4 g7 Y4 d O5 \( E& zPHP
$ N" M1 x, @" b+ ~$ z- private function _xss_check() {: y; K m$ V+ l2 L4 F T. z% W
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
* X$ }' ]* I1 O1 { U$ | - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {6 W* v' Y) p' P' @: p
- system_error('request_tainting');; {' p1 f" K% \; ~9 Y
- }
~4 l, d1 i/ S; C6 T- o& d4 } - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {3 |9 F, H9 O* ~, R7 _
- $temp = $_SERVER['REQUEST_URI'];
7 m% w' [- i3 V+ w/ M5 c- { - } elseif(empty ($_GET['formhash'])) {) e' x7 f! g2 @0 U# f
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');2 Y N! k' ?: g; ], o
- } else {
3 X) p* g2 f+ F. v% ]$ d - $temp = '';3 G9 S; H( t" u6 h
- }
1 v' d3 h& Y& [9 v6 x - if(!empty($temp)) {* h& ]3 i+ @2 ]% @
- $temp = strtoupper(urldecode(urldecode($temp)));
8 z: P3 t0 y& U7 f3 z, j% ^5 b } - foreach ($check as $str) {
' C9 c8 K1 ^! p - if(strpos($temp, $str) !== false) {, s; F. a5 h j( _5 I2 ? ?/ K$ E% t
- system_error('request_tainting');2 h0 L1 l n% i" N$ A+ Q
- }
3 s5 x3 ?6 y, I; d; ]; x+ @& F - }
. }% ~) }* f* _" N% O - }6 K" ~" P+ ~7 U) K4 R& d
- return true;
7 Q: ~5 n1 g. a. N+ N0 i( F - }
复制代码 替换为
~/ n- n& `# g$ e- E# r1 M9 L- private function _xss_check() {6 B) V r# }' t# Z* J) x. R
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI']))); V; J1 |, F9 G$ h5 ?( ~
- if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
$ K7 _3 s# V, c! ]* f' C& o( c6 e - system_error('request_tainting');
7 i9 I# d2 p6 g0 h- P1 } - }3 a; C% ]$ ? V% G0 ^0 X
- return true;
1 G/ Z* H7 K1 \0 X - }
复制代码
0 S* _0 j- a; M9 `' W" ^, ^
& A R( T' K( l% M
0 x. E/ y Z. _7 Q6 s7 a( O5 N9 q! `' n; ^/ N' j) S/ o& v& c
) S' j! c) V+ [% T7 I5 A
|