关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 + }3 O+ n) g$ S+ B5 {* _3 W; x
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
! U9 g6 \8 @' ~8 |- ^ `6 \! c4 B" {% o e, @9 T* N' F/ n
3 D! t$ O* g& m! `1 `PHP
% M% { g4 V% Q: \* M: H! g( c- private function _xss_check() {+ v5 }$ p) R+ W+ G. V
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
* }: L1 I; C' `) B1 p8 ^6 P5 s& X - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
# m1 f y: P# K1 s; k8 `1 q - system_error('request_tainting');4 D2 W1 a0 ?& o b" P+ c
- }
' l$ S. ?) A& \+ |& T - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {7 d7 i- }# p7 L6 C8 }
- $temp = $_SERVER['REQUEST_URI'];( X" u% D2 G1 g* J
- } elseif(empty ($_GET['formhash'])) { g6 g6 S: X# Z5 z% q0 s
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');' k3 ^% X9 t0 m+ G0 z
- } else {' \) Y) [0 k' H, [8 O
- $temp = '';
2 ? @2 Z) B7 r+ ` - }
/ d9 b& V; x+ I9 Z+ a - if(!empty($temp)) {
+ X& S3 l( E t' H - $temp = strtoupper(urldecode(urldecode($temp)));
: P1 y1 m7 ] y% j$ y; } - foreach ($check as $str) {9 M e; _4 _8 D; I; u* O
- if(strpos($temp, $str) !== false) {3 {" z! w# c( n; @ q [
- system_error('request_tainting');
8 Q5 G8 c+ [; ~ - }& `! o! I) e& Y& h- x6 o2 v+ j
- }# p# g7 Y+ v5 F! i1 M, ]- H% L
- }
: d9 M' t; J0 O7 [7 s) o - return true;
; C4 y; i4 j8 F) Z+ [2 n; Y' _ - }
复制代码 替换为
- O; n; l4 y0 L, ?& n q- private function _xss_check() {2 }5 a! }( [0 W2 q# D
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));8 l( S+ f: b! |9 a3 m
- if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {: u I$ z5 x: G& f0 p
- system_error('request_tainting');# u; k' L) O0 M( }: }/ {) Y
- } F* y! A5 l1 ^0 f, v
- return true;
# z* b5 N, y, f$ q/ B: j! U/ M - }
复制代码 - g" ?% L& Y0 z: N. p/ E$ S$ W2 o
1 ^/ h3 V/ T: F2 X( O6 O2 o2 p( Y }& [# ]- K! R
& r4 o/ a1 E: a
6 r* ~5 J0 {5 y" N
|