关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
: c8 T; c3 k) g; _: a解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
, ?5 B. \6 e" w2 U& `! n7 X+ N z3 B7 X, i4 w( T1 _
4 @/ |0 ` E& n4 s* G4 v2 EPHP
" I; l* D1 \5 n& G7 X$ N0 ` w- private function _xss_check() {( {4 Z3 `! ?/ |7 |4 a
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');# N# @6 V; t( h3 O- W
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
1 g8 q9 g3 d. L - system_error('request_tainting');
, m6 H4 n$ X0 @" Z - }- I3 Q* |# V9 C+ F4 K
- if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
, `( G/ ^0 \0 Z6 s& G - $temp = $_SERVER['REQUEST_URI'];3 R; ~, L: i# Y7 H: y- Y/ e
- } elseif(empty ($_GET['formhash'])) {+ w3 j( y! U: Z. u6 h
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');( u+ l7 j6 a$ D( {3 z7 a
- } else {
3 @- K6 y7 H1 ?4 H7 R3 @! ^3 N3 I& J2 t - $temp = '';
& H: Q1 i/ ^6 H' z - }
0 p5 i' `& a: @" | - if(!empty($temp)) {) |6 `+ L' D- Y8 N& D
- $temp = strtoupper(urldecode(urldecode($temp)));
g5 ?6 C% _! P7 \) m - foreach ($check as $str) {
O2 F) B1 D7 ^6 \) n - if(strpos($temp, $str) !== false) {* n1 E: L2 j" j
- system_error('request_tainting');" E5 f- y; w6 u6 M% G
- }
) P5 H1 F1 z3 f/ s' c - }
% s5 D! \: k$ C* I - }* i" ]) l# i: q- f4 ? y8 [
- return true;
% Y' P- q0 }) Q: K6 D - }
复制代码 替换为4 O4 c' i3 g0 Y! T3 j' d( z% l; V- G
- private function _xss_check() {
. _- i/ ~- G8 m' @ - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
^. t- z% R# k$ W0 W - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
1 H$ ~: q$ Q1 `9 Y* M# u' J" s - system_error('request_tainting');
* N/ d; l/ V0 }! B4 a2 H: ~. }& y, N - }% i3 ?* v& t9 k9 {- b
- return true;
( ]& [7 E* Y, Y g - }
复制代码
! X( c' G, G n2 D8 B6 e4 @9 [# Q
4 P" _. f. F* T! q& l4 V% j+ b
5 A* d6 D, R% D; ?( G6 w8 ^. j8 Z# F0 z9 A
& ~9 h4 [7 d3 E" J: V9 e7 \3 B _' K
|