Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决方案
& o- l6 r# ]2 _' r+ h% v8 \PHP Debug
* S" {: n N3 J% b8 u8 {; j) [
! g5 ~; ?; I# \, `; V. \PHP Debug: }9 {7 ~0 c( H- |3 F
9 j, N! e" ^/ Q+ h$ V V
[Line: 0022]search.php(discuz_application->init)6 f- t) O4 P4 [# [/ n& J
[Line: 0072]source/class/discuz/discuz_application.php(discuz_application->_init_misc)
! V. j' e7 f6 @! u, ^/ o! w[Line: 0596]source/class/discuz/discuz_application.php(discuz_application->_xss_check)5 I( M, h5 h! g+ {0 u# e6 S
[Line: 0372]source/class/discuz/discuz_application.php(system_error)
+ H" L, x' Z8 ]0 N0 P, } B6 O$ g[Line: 0023]source/function/function_core.php(discuz_error::system_error)
3 b; m4 X( d% y& ~) w0 b/ ~[Line: 0024]source/class/discuz/discuz_error.php(discuz_error::debug_backtrace) % }8 s5 Y+ ^8 d6 [- `
+ m. R" }" @ c, V- z关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。9 g3 D) {& N6 y" ~* a8 ]
0 d+ G4 b( x8 Z7 O1 d! c出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。& `1 p0 s6 j I) }6 _4 ~
! C% g8 |9 N# t/ a; ~+ K3 d
解决方案如下:
) F6 ?" n" Q, r3 V u @1 }
, x, x) D% r' q3 m/ _, U0 m\source\class\discuz的discuz_application.php
- u( e: P- [$ P8 _8 G$ f5 t
' S& y% W- [% _% P查找如下代码(在360行左右),并替换
8 T0 k1 d1 x% f" a3 S8 P0 E4 j! ^, H. x( ~9 o- ?4 b
6 J( v6 a1 d: s+ N: d8 Y! a
9 s. j& L3 X n0 s
2 T/ N0 z4 m. H! [
PHP代码:/ O# P6 {- Z& K+ s& e" U- t
$ y0 G5 m |! j' U$ U4 W. O, x) [* H. y5 {( _
private function _xss_check() {, G# \8 U9 v; r
static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');( }' L6 i+ u6 {8 B: D! M
if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {" M. e4 C+ t W4 z
system_error('request_tainting');$ W5 K1 w% v' }
}
( \5 {2 j, J7 I7 q7 Lif($_SERVER['REQUEST_METHOD'] == 'GET' ) {: j! K: `/ z$ A$ I$ I# P8 ?
$temp = $_SERVER['REQUEST_URI'];' Q# d$ h; ^ o7 @4 Y0 R
} elseif(empty ($_GET['formhash'])) {- I. i- h4 ~% h$ K9 x: q
$temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');8 K1 k; P# ?' C4 w1 W6 m
} else {7 a7 C' s; l* a% e' N+ ?
$temp = '';
& H5 p. T! Z" n}
4 w/ [3 o. t$ ?if(!empty($temp)) {
/ Z$ h- W Y) U% ?7 z, S! k+ F$temp = strtoupper(urldecode(urldecode($temp)));3 O7 O7 p6 d/ A4 X1 \/ w' Q5 c, ]
foreach ($check as $str) {6 ^& o; J( z3 {6 f
if(strpos($temp, $str) !== false) {
$ Y7 e+ b$ n# l$ C" y/ I" D ?system_error('request_tainting');' @; w5 O R& I0 o7 G
}6 c8 m- z; _: c! a* _
}
( \ T" Y0 D1 J}+ G5 F1 O N+ E0 W) U4 n f
return true;
. J3 q& A! }" ~# s9 d8 u; _}
( w) }2 h: i6 F( v6 M* `5 h$ p+ z" t5 }) z2 ~/ B3 K
( a) O9 o4 D5 I替换为:
& G8 R. {, i0 z6 K2 {- Q3 }3 d0 N! k7 m& i O( R5 E4 i
PHP代码:0 s6 Y- [5 a9 x1 L- i* f3 {" w
: P; B* k; v7 N
% T, A6 X" H& {. d8 f- s) W: C
private function _xss_check() {
: r( ~' L4 u2 B: e1 i! F$temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
: ` L/ o& L- t2 K; j3 g% b/ X5 ]if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
# g& w" L( d: j- N% F* j4 f( K7 Bsystem_error('request_tainting');
4 }( v& t/ d3 F2 ~}6 O2 f6 y0 B* @2 \* ^) `" F7 Y
return true;$ C: C+ l/ f# `9 R4 V* v6 A
}! S# f+ }, ]1 A# T
]- a$ w+ r9 }! x9 t7 f: c+ C* N7 c; R! y2 y* s# Z' a+ n' K$ u2 X
|