马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决方案
2 L4 U4 e9 ]$ j) F5 j6 m( WPHP Debug) A u& W4 R$ s
7 g! R) B) w4 F+ gPHP Debug
1 {. b" E. ?! ~$ d& b( o) f1 b/ R8 R5 A2 o* _7 w
[Line: 0022]search.php(discuz_application->init)" T$ E+ D( y Y0 C
[Line: 0072]source/class/discuz/discuz_application.php(discuz_application->_init_misc)1 l9 d* [: l' A4 N
[Line: 0596]source/class/discuz/discuz_application.php(discuz_application->_xss_check)
8 b+ _1 z$ E; Y) k[Line: 0372]source/class/discuz/discuz_application.php(system_error)
7 {* J$ \/ h5 z4 z9 q[Line: 0023]source/function/function_core.php(discuz_error::system_error)
8 r( J. E' a- k7 E[Line: 0024]source/class/discuz/discuz_error.php(discuz_error::debug_backtrace) ! J @& D0 B4 g+ g/ r5 e6 f, ]/ Q
7 S7 `8 e6 b: G; W关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 Z5 q4 f/ {7 o5 s9 \# X0 ^
) q) D0 d* i$ K9 r, r! K: p0 ?
出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
1 a* T* h# U9 h/ N) D0 Z4 C. V8 N
+ j+ {* `2 \. L: R解决方案如下: I; v* B. }* K: `! R" x0 J
7 w2 X. \ x7 |$ P4 P9 ^\source\class\discuz的discuz_application.php
* n# D, j$ r0 F5 x ]! X6 M, L \2 T) [8 R$ D
查找如下代码(在360行左右),并替换1 v* B+ ?/ t3 M& o: c" s
* q: i5 q; J$ l: y1 U& s
' m Q I3 ?/ O8 U p : {; v) N1 {; s4 E# s4 ?! H' w' d
+ x W9 ^7 f; S0 J& n5 s
PHP代码:3 Y$ A4 V4 ^) t& P5 [) E
( W" p& U, ~7 {
5 Y n9 Q5 a' |: ]/ w2 @
private function _xss_check() {
5 M' W& Q0 d: v ~* x- Wstatic $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
& g% w2 T6 B w& kif(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {5 R+ H2 t# Q, t- X2 g# N+ R
system_error('request_tainting');8 N6 p/ _- X' C3 E, f0 c
}
8 t5 l* l7 Z* `if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
. U6 \1 P$ Z( \9 N+ |% D: X$temp = $_SERVER['REQUEST_URI'];6 \! \' z9 I. P; [8 s( R! i9 n
} elseif(empty ($_GET['formhash'])) {6 d% m4 m d0 o3 [6 m2 ?
$temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');, H: i {$ w' X+ M- Q
} else {
1 [" L* n. m+ B& P E3 R$temp = '';
" C. \! b. H) k/ a5 J6 }}
% I. _- {' F; a8 I6 Gif(!empty($temp)) {) q1 @ }" t9 |* q" L P/ B
$temp = strtoupper(urldecode(urldecode($temp)));
; V% u3 _" y2 H( l" j( }/ `, |foreach ($check as $str) {
' U( z9 L! q" L( ?2 w7 Vif(strpos($temp, $str) !== false) {
3 ]3 H0 X/ v& b8 I7 E8 X" Jsystem_error('request_tainting');9 B. D" Y1 R5 j% p8 ]
}' v7 a ?3 Y1 c# u; e
}8 N1 u% z+ t L7 D# |
}' k/ |# A- Q+ ?) J
return true;
% j% I \. \2 o3 i6 ^}9 Z) V: ]9 @1 c
% l1 x+ \2 |: Y: a. H6 F; A1 S
4 D; c/ F3 [- h' D m8 L' |替换为:5 N/ y- t+ x( \2 `
) Z- b6 t; B/ e* HPHP代码:$ Q) ?' Q& \/ Z0 @8 L# |' r) f
8 W/ L2 A. c1 L1 T, g- V" r2 }
8 U! C8 ~5 Q# [4 v
private function _xss_check() {
* b' W: d) H) P. c, E8 b$temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));' M' ~) O+ H+ M5 @! `6 `2 S. f8 H
if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
* X, B) e* I3 n/ Msystem_error('request_tainting');/ q* r& I% G9 G8 i/ \6 J- y
}
% Z- W0 O+ m& G) `return true;- y( V3 }, L9 \! z5 ]- @
}* `: [8 Z$ h2 ^' S+ D3 g: u- e
1 p# W5 v b. R# T5 ^/ H
' W" g6 R, V6 }2 a |