Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决方案3 l9 q+ q' O) x! b
PHP Debug+ _/ i7 z# c2 ~$ ~
( Q" P4 ?+ r3 `& T
PHP Debug
# U) m# q7 q. B9 R# l' d5 F* x/ S' C+ ~/ n1 p
[Line: 0022]search.php(discuz_application->init)
& \( c A% H7 ?2 _% p4 _[Line: 0072]source/class/discuz/discuz_application.php(discuz_application->_init_misc)2 t; f! j6 D. l* L# \8 S( {
[Line: 0596]source/class/discuz/discuz_application.php(discuz_application->_xss_check)
* l- ^* l' P O[Line: 0372]source/class/discuz/discuz_application.php(system_error); Q7 ~- O9 _$ |. ?
[Line: 0023]source/function/function_core.php(discuz_error::system_error)
X' u: O( y( o- E[Line: 0024]source/class/discuz/discuz_error.php(discuz_error::debug_backtrace)
* b+ p# ? @/ R/ y4 M# t, Z) M5 p3 J5 ?8 x: D
关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。8 U+ C6 l1 L( e5 F& {
5 V% q- F, Y6 S2 N# Q: y
出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
) L7 w$ [/ b- s i$ b' R0 s4 |7 g& ^1 g3 g# o4 F' _
解决方案如下:" v" q0 C7 ]0 Y$ H7 s1 E
& X; i! N+ R ?$ `/ @) |\source\class\discuz的discuz_application.php
; T( l Z8 M& o/ z+ B+ F. V1 p, j& n: \) i% U) z/ `
查找如下代码(在360行左右),并替换5 D9 Z+ \$ @- M2 [
" ^0 o, K$ @3 Z/ a. A
& a( e9 W% q5 Y/ O 4 |# H F: j' i0 D2 O6 \
* \+ ?* j9 P6 R1 G; S! P0 @
PHP代码:) P/ r5 J3 {, d4 l) G% k
8 Q& H$ N# T8 y4 D0 T0 v1 b' u7 F5 V; z/ s. g
private function _xss_check() {
' N4 B7 W% c1 `9 D4 m8 Y( nstatic $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');3 B0 {' t" B5 y5 h6 X
if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
: V# t) X4 l! w: x# I4 msystem_error('request_tainting');4 x3 Q0 T0 A+ O. o: p( m% J; E1 p3 k
}+ m( ]2 G( f; f/ l4 h5 ?/ }
if($_SERVER['REQUEST_METHOD'] == 'GET' ) {7 V% _+ c$ }* ?& C' b9 P! ^) q: d* n
$temp = $_SERVER['REQUEST_URI'];, M) k) p0 D+ u$ D
} elseif(empty ($_GET['formhash'])) {# Y/ x+ }& s+ Q4 S4 X& @
$temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');9 D% n( K( v2 |
} else {
z- m1 |8 {1 k4 a1 x$temp = '';
; q1 t- s' c( f5 t) S}: C" Z9 t. x) O- C
if(!empty($temp)) {: o$ p) \. U8 Q3 l3 ?
$temp = strtoupper(urldecode(urldecode($temp)));. I! c8 T' }+ A' a8 A8 T# F
foreach ($check as $str) {( P8 V% O" d8 l
if(strpos($temp, $str) !== false) {
$ e% l$ k1 k3 {1 H$ u, R8 l+ fsystem_error('request_tainting');$ n l! \8 g, }, K" x7 i
}# _" b5 U: v5 }& c7 S
}) n# j; L: y3 Y! ?
}
2 \8 v$ C1 L+ S) |( c: E. breturn true;9 ]+ h8 v7 b2 [" p9 M3 K* O4 t3 c
}
4 k" h8 J: S2 U$ p! [
/ x% G! d. z2 s4 I+ u2 Y5 i. V/ j1 J
替换为:
. ~. t E7 a4 [1 [ X0 ?4 A9 u9 f5 c& ]
PHP代码:4 _7 a D+ L6 `4 U
% y5 E. Q+ L- ?2 H/ o6 L
- ]! `: E; I. E; p
private function _xss_check() {
, O# j0 I% j: R$temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
* x% g% l: v* T( ?# V5 _if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {5 A! g2 T+ A) s/ i- r& v1 w; X
system_error('request_tainting');
, a$ G o/ i3 {" D. V6 g: o, O}
8 O/ |" H( ^, xreturn true;
1 i# t: G8 @& n! w8 c}
6 s1 z' Y4 l- b) S( Y0 e) L# j: l) ^3 [7 A
, U3 [* y* W- V9 I8 j) Q$ a; y) b
|