关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 : o1 v7 R; d. _5 R* J! T7 t+ ^
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
3 s6 C8 F; T' x5 X& c' \3 [" n3 q5 b9 q0 k0 I1 d+ K
( j$ [- X: }/ t8 i
PHP1 z% Q; r, {6 p' U' g
- private function _xss_check() {% n$ g( w+ R* K
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
, n: l& n+ L' M$ H- Z5 u1 Z* Z. F - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {2 v! _1 ?. g0 D; o/ Q1 ?
- system_error('request_tainting');
7 v+ W: ^: n: a6 w5 f4 o - }
# f: e4 K* Y: d* V0 E - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
" f7 X& F. @" g0 ^( x. a. j" d( e - $temp = $_SERVER['REQUEST_URI'];. {2 F4 n8 U* }
- } elseif(empty ($_GET['formhash'])) {
$ T* p, H- B8 h4 f8 s% i% [ - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');5 r# [0 c% Y b6 U% P4 b( v3 x3 j/ [3 A
- } else {+ e6 N$ N' B5 r' b# I
- $temp = '';3 V# ]) f+ X) {; g) G
- }% }3 u5 I/ a% s# P* Y* p7 ^
- if(!empty($temp)) {
[' b G: W* _$ v4 a4 D$ U) I- A - $temp = strtoupper(urldecode(urldecode($temp)));# w9 X* y W* ^
- foreach ($check as $str) {
# o- I v( A# q: K. |; j - if(strpos($temp, $str) !== false) {. _ B; ^* e3 [1 \" [! H
- system_error('request_tainting');
: p: {& w& F ?4 \% ^0 e - }
% `7 |+ Y3 C8 i; ~6 Z - }
7 F& l# N' t' c4 t- ~. i7 M - }0 C! o- \' v7 g+ r% N3 I
- return true;
" p8 h2 i# p k3 [+ e - }
复制代码 替换为' W0 Y B: M; A# A9 ~
- private function _xss_check() {7 O8 O a2 i& x7 u# `! e! K
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
. v3 R. ~# W- q/ g" T - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {- f, \" l/ d, J6 U1 ]: S
- system_error('request_tainting');
& [) x6 d0 `- X/ F) T% c+ V - }
* q# K' y) Q$ `) |$ m$ P6 z3 I; p7 Y B - return true;
1 a/ n! [$ w6 G1 B, } - }
复制代码
$ q( d/ Y' v$ U$ i1 O" r5 K/ b8 X0 J" F h2 U
6 l0 n2 b$ I: { p/ E; k& o/ V
1 I$ N6 D6 f9 E* U5 u) H$ w
5 M9 k" S& u/ I# x0 b) T* k
|