关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
! q( X, r; r& U+ w' {解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
) G9 ? q) J9 [- w( _9 f% s
3 Q( U2 P( ?( {$ |$ N- c
6 h( |& p. Q: X. dPHP
: ~) l7 c* e+ V/ N$ N! Z- private function _xss_check() {
7 k# \ O' Z' {' S: U; g' }& T - static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
) J I# ~- y3 e" i/ Z- P - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
0 `4 ]9 s0 ^7 {% l! ] - system_error('request_tainting');
; l. O6 ^7 v2 s; g- M - }
h6 |8 v% K% x# V) Q5 n9 O - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
1 _& \3 N* F4 u/ \; o - $temp = $_SERVER['REQUEST_URI'];/ Y% E; c @/ O/ d$ O. T9 E X
- } elseif(empty ($_GET['formhash'])) {, U! f4 N1 }& s v9 A- U
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');1 `1 v4 |8 w6 \! {8 ^: e* d
- } else {" j8 I. a/ J3 P x5 e l) w0 ~
- $temp = '';7 ~. d: B; b0 J7 Q
- }
) V- L0 }) [. ~* y: g0 |6 @& j - if(!empty($temp)) {& y9 R j W7 D: j
- $temp = strtoupper(urldecode(urldecode($temp)));( u7 e$ j& l+ K& |
- foreach ($check as $str) {
+ W0 f5 H4 b+ g+ s - if(strpos($temp, $str) !== false) {
3 r9 e+ M) ?$ d& d1 q - system_error('request_tainting');. q/ z' h8 f: y* P% ^9 i
- }
2 O7 X) s. w8 F4 Q% ` - }
6 q1 P4 |* \3 z/ p9 k - }
6 [1 i0 h' D2 [/ c - return true;
4 p: Z8 X' G6 w. H* H, V j2 o - }
复制代码 替换为
$ K3 M9 Y( [* r9 L- private function _xss_check() {
0 e: Y8 c# f! h6 ^- T8 \# H - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
& J- k' g8 F3 ]# | J8 s& B% e( n - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
/ Z* A/ e! h2 Z ~" Y+ B - system_error('request_tainting');0 O/ g) Q, O$ N& g* l0 y! m) Y( h
- }4 Y8 [. e% _ ?6 ^
- return true;7 ^6 [& R" M" S: C
- }
复制代码
+ j& ~; |7 D5 ]3 V3 v" [+ x4 g: B7 X5 N5 s/ F# h
& H1 m r6 A- P
$ ^+ y/ b( \# U, |) O+ M7 ]- \3 U+ m+ ?) Y) ^- Z! }- q
|