关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 ; n3 e! ]1 J7 I. `
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换 4 Q! ^0 b; C* H
5 l' z2 T0 ]. S3 N, A- j% K- h6 h. m* ^4 \- \
PHP x1 V) ]0 |2 ~1 F; `8 A& X
- private function _xss_check() {, R ?- F! ~. W q3 A
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
G( H8 D3 b& b4 f* a - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
9 y0 O, h' |& O: l+ L - system_error('request_tainting'); y% [- [6 R2 Y' p& W9 N' J' Y& a5 Y
- }2 Q9 ~8 a1 N$ m$ ]* i, }! ~8 p5 s' F
- if($_SERVER['REQUEST_METHOD'] == 'GET' ) {) v, ]- u) N' y5 a. u8 ^2 @
- $temp = $_SERVER['REQUEST_URI'];0 E) e7 d6 x; m1 D: @' y, c8 e
- } elseif(empty ($_GET['formhash'])) {" p& W6 D, }0 z
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
/ ~: O( t0 G0 g0 J - } else {
3 ^% A% M2 v5 K# g - $temp = '';! z2 k" ~! S, j0 R. K' T( _* O- O, B X
- }
) a! {' T9 l" ?$ T7 |, | - if(!empty($temp)) {
( G& C, G/ k# j+ s* D( j - $temp = strtoupper(urldecode(urldecode($temp)));, e2 z+ h3 Q( c+ f) S$ Y1 v6 \5 i
- foreach ($check as $str) {" Q) H7 v; q4 F2 e2 f ~
- if(strpos($temp, $str) !== false) {
2 y* y" [& }3 U$ J$ ?5 L! h# X/ [ - system_error('request_tainting');
4 k: S& [3 w. J- c0 ~& F. c - }
) u" w; i" g3 `% K3 V7 `5 j" q' F3 R& ` - }
* A% a: V2 Q; W5 z1 u5 b' h8 v( ]% o - }
& |2 z# U3 `4 V( [, \6 b% } - return true;
# F/ F4 p4 j p% h/ w# E( l( _' J& Z4 v! E - }
复制代码 替换为6 c" s* U! D6 Z4 G# c/ y6 T
- private function _xss_check() {2 U! W1 @# c! v! l! o
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
: X8 [! i! t: O# J& y7 e - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {* c- Y+ [# |7 l) e5 K
- system_error('request_tainting');7 _$ e% P$ [5 I, G/ f
- }& d4 o% c/ g. x0 e- v1 a
- return true;
& L- n; H5 J* K - }
复制代码 ; T4 t$ a! u. K' I1 Z6 H! f
; _9 N- T' ^- u3 T9 Q3 n% y7 \+ }' H5 l( K$ \$ p5 Y9 `
: O# s6 M# S, M: e( ~7 _2 D' ? x" E
|
|