Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决方案' j6 Q7 N% |! ~) S# o3 m, _5 I8 `! Y
PHP Debug* I7 |* \1 I; r) g" {# w
3 \' P6 y; q% I4 k" e1 f
PHP Debug
+ h, K- \8 m0 l7 B
; k1 C/ f* \! k% u Z6 ]$ a[Line: 0022]search.php(discuz_application->init)
$ N6 p: s6 ^* l5 ^) c[Line: 0072]source/class/discuz/discuz_application.php(discuz_application->_init_misc)5 R y E7 x" j# H4 A- z% W, c' \
[Line: 0596]source/class/discuz/discuz_application.php(discuz_application->_xss_check)
7 ^5 h; \9 e. W9 F& `$ {[Line: 0372]source/class/discuz/discuz_application.php(system_error): y: g* B' `3 B$ u$ A6 }* Z) u; @3 [
[Line: 0023]source/function/function_core.php(discuz_error::system_error)
5 A' `0 m9 D5 P5 B$ R% {[Line: 0024]source/class/discuz/discuz_error.php(discuz_error::debug_backtrace) 9 A. C) \8 C8 T; Q1 }
3 S& t6 Q0 E. t* y
关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。
( @! S7 I/ k- H( W2 e1 ^' S$ y; m' O" s4 B9 F0 ?$ g+ ^: O) w9 M
出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。3 M9 T+ Y; J( k/ {3 Y% V
# v9 t+ W2 D, s8 l. ]解决方案如下:" t- y% }% `* o
6 @7 n1 Q3 K' G\source\class\discuz的discuz_application.php+ `+ i) @+ v) O& S
! v2 d# R$ D- Z7 z+ k. {
查找如下代码(在360行左右),并替换
K2 k) W$ Q y. T% n$ h: G* e9 c, o
2 E, K5 s! l$ j+ [% v- T
3 p3 m2 C$ }( c $ a+ Q% o, b6 m' t. ~8 N# z3 r. u
9 R. \; q$ k9 v! f' v7 ]4 k* t7 _6 nPHP代码:+ f' m7 Q6 k) e& P' `" ^& l) m
9 U, `3 y: e- u3 D! M. h
* Y6 v0 f9 s0 c
private function _xss_check() {
, ~* E1 k Z1 N+ I0 L3 Wstatic $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
) k' d; ?5 E* tif(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {! N9 {7 p! A1 L8 L
system_error('request_tainting');; O7 k& X7 r5 r n
}
* B# {5 f9 W bif($_SERVER['REQUEST_METHOD'] == 'GET' ) {! c6 r; q# P5 U, b; b
$temp = $_SERVER['REQUEST_URI'];
% r# V' W0 C; Q} elseif(empty ($_GET['formhash'])) {
0 p Y7 W f9 B, n; B' s$temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
1 V! |8 T. _* X} else {
+ n9 q5 k, P' v' V# k$temp = '';
, S8 m; G5 I6 `4 y}# `; z; j" }8 j2 }3 W* B6 E6 u
if(!empty($temp)) {
, u+ X- G" A: K! s$temp = strtoupper(urldecode(urldecode($temp)));
% L8 x) N1 w# P! {, b# pforeach ($check as $str) {- k3 q( m. i& M$ M ~ R( N
if(strpos($temp, $str) !== false) {) J% ~: i' {& n6 v/ ]% [
system_error('request_tainting');! A7 t3 i% Y! q+ f
}9 z; f5 Z3 M5 [; M# V
}7 Z3 Y# q( c$ @: G0 @2 P9 f
}2 d C1 q7 ?$ I% a m
return true;
# b/ ~8 v8 a' [* N) ]( E |}
; x4 Y% F% e# t
3 W/ t& b0 b6 u- |& ~: z
, V X6 @6 d5 S3 o3 B% m, ?替换为:
; n6 r2 r4 y5 D( s# r- v& ~. q6 M- C: {- i" ~: }1 h! z
PHP代码:1 ]. `+ @7 a& K
/ m7 e: _. ~+ h6 q m" w1 ~8 @# ^3 L; w" s- e# }
private function _xss_check() {
* F. c: n) k* E$temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));3 m+ C$ \2 Z; R6 s7 ]) u* e
if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {: k0 e- R6 U% p5 ]% U" [9 b" f
system_error('request_tainting');
5 ?9 a% D4 r. u8 w6 _( }3 {1 |}
/ ~7 Z) v% Q/ s4 [% B$ x' ^return true;) G) B* Y/ ^$ D; W( ^; k9 o$ W9 e. M
}% |& X% w3 \0 }
$ \1 N4 f' }' d. _+ `
4 N; I) c% n8 g6 T: H8 }4 L$ F: U1 ]
|