关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 ; e% V: F( _7 c6 @+ f( P# I
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换 . g+ y% J; ?9 L6 c6 ]
- o( y6 `! Y4 }( Q
4 M% K% b }+ e8 X8 q, oPHP
$ e4 B- \; s+ K- private function _xss_check() {
8 X0 L- C& w$ P, m9 P - static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');" B- q$ }4 _% v& {+ G
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {" ^, z' m2 X' J- m/ ~' F- w
- system_error('request_tainting');
. n! @5 j4 ?4 H. G; _3 }% U( u' U5 T# [ - }# r3 b6 q' W! H# p* s5 m
- if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
# ? Q) e8 Y7 m8 x/ J4 I+ a& R - $temp = $_SERVER['REQUEST_URI'];! Y" C6 n6 u0 j9 S- C6 b* }
- } elseif(empty ($_GET['formhash'])) {0 a- Z) I) ]$ T% s. N4 q
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
2 U5 b8 s# R( q5 q. _+ m - } else {' X# R& O D8 F8 @
- $temp = '';
; ]3 g5 c; y! H" t5 a% l3 m) q8 r - }
7 D# B7 P/ }3 u k2 ?5 `6 { - if(!empty($temp)) {! s. t4 P2 Z8 |0 L# S1 L
- $temp = strtoupper(urldecode(urldecode($temp)));( D' U* I" q4 W5 P7 q' ^4 H; {
- foreach ($check as $str) {) C: I6 H$ _) ?4 s; S
- if(strpos($temp, $str) !== false) {
( w) j- ~6 t3 w) ?3 m7 E* M - system_error('request_tainting');6 u; v! U4 x/ P/ h8 G
- }, X* E, E; w R, N
- }
3 g/ c: e2 b) U$ Q - }
% u9 o7 j; D& Y! ^8 c7 Z - return true;
% x0 o. f5 I5 _2 n2 c+ i# F( ~, f$ c - }
复制代码 替换为6 W, K' A7 T \+ Y o) X) {
- private function _xss_check() {' _4 z7 t0 L; Q$ i% d' Q
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
* A1 `. {& M" H/ m% i; c( M: G* g7 C - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
* c8 ]5 r; T( o8 ^5 N3 g+ c5 d - system_error('request_tainting');, m r+ C& b& w* u0 Z& Y0 P7 [& X6 p" L
- }
: d. f; ^8 o$ q$ I, m - return true;
' i; e+ ]5 i9 b, _ - }
复制代码
D) y* \7 t/ W5 f0 ]9 j
' s5 k: J+ i* F3 N( f
4 G- c$ A" _4 ~* u# y/ M0 y: `2 N0 q( w' {7 l5 y& r
. V* x/ M( d/ ]) Z! l3 h5 ~& b
|