关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
) ]* [" j8 l: i* H解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
$ H* O# T8 [0 _* H
: s9 w" E' L4 I! K ~# j6 F- d5 t) M$ E# H3 n
PHP
) K# c, A8 r+ W! v6 N* ?- private function _xss_check() {. v7 A. u- t2 ~& V3 o
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');, q( R' {; ^9 Q
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {5 x# q' {+ f5 c# f+ ]$ d" \
- system_error('request_tainting');
" s8 l0 X) Y1 o* ~* p' c - }
. K& }, u2 p( S) A - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {# I H# C9 k! \5 t) i+ e
- $temp = $_SERVER['REQUEST_URI'];1 b- ?* n5 Z# o6 O' ^. }" j
- } elseif(empty ($_GET['formhash'])) {
2 k# F1 O+ j6 w& j* m - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
$ M8 Z$ n7 M) n - } else {) y: ?. }7 f: F* l' t
- $temp = '';
8 f* ?. Z* u, E' e$ i# D! D4 v( C - }
. F2 e8 U; A2 q9 f, F5 y - if(!empty($temp)) { {" v5 ]+ d( l9 |1 m0 Y
- $temp = strtoupper(urldecode(urldecode($temp)));
7 p5 v3 e* }' L" B7 U; w3 e' n - foreach ($check as $str) {
5 ?0 l3 P! x& {. Q6 [' H1 C - if(strpos($temp, $str) !== false) {
g* z6 C4 B: W) M' S1 r9 u - system_error('request_tainting');) b& p! u# A# h' P3 I: U: v
- }
: z2 P5 I( S/ _, J ` - }( I( h* g2 a, l) m
- }
. h( \9 V1 m, Z - return true;
, t) Z$ C2 X8 |% m$ N6 z - }
复制代码 替换为4 _! _$ i& p( @0 U$ [
- private function _xss_check() {
5 a+ a& N9 u7 L# R9 U1 h - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
# ~( u; v- h+ l0 v2 N3 e1 g - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
, Q' ?. ^- g& m- s$ K6 q7 V - system_error('request_tainting');6 Q& z5 ^+ L: n5 P+ T. w
- } R% F, D9 X* ~2 ^( Z" X# |
- return true;
4 |2 V4 c. ]2 ^: T - }
复制代码
; l. m P: {2 B# W; t& {" ]) i8 x
' X( H- b# w0 S& d/ B- {3 d }
' Z: N9 V; r# B# P1 D$ U8 k
2 z8 z: O W- I) Z X* t1 b. o
|