关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
U' c4 X0 L" k+ L: N+ a' ?6 ~, l9 B' _解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
- W8 [" F3 e' K# p# b3 M) m& S; t& ^
! ?" v1 j" _: F G/ F1 d5 N1 W! U; U+ b
PHP
% u: b1 `- s+ p& t3 Z+ X- private function _xss_check() {+ Z) _/ m, Q5 I& D6 c' Z
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
& O0 `0 d( E7 |$ R( y1 `" V1 H - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
3 _8 }5 u8 M1 B6 v& K - system_error('request_tainting');$ o6 M$ a2 t6 q5 n" t
- }
6 k8 |1 f+ B$ N' X - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
6 T) n5 n8 n3 ^! E6 h) [( M% T - $temp = $_SERVER['REQUEST_URI'];7 G* D: P/ O' b0 A
- } elseif(empty ($_GET['formhash'])) { K! s; _# {/ Z0 h2 x1 a
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');/ M6 a# ~) v. H
- } else {
3 }+ T$ [5 C! Y x1 l- {) L - $temp = '';
* \8 B* k6 D/ V3 |( P( @ - }
6 D7 o D4 F" D3 l' Y0 G. r# y - if(!empty($temp)) {
) P' E- v! C, G9 Z j - $temp = strtoupper(urldecode(urldecode($temp)));' Q& m8 P" \2 {
- foreach ($check as $str) {( J# }0 h8 ~0 Q
- if(strpos($temp, $str) !== false) {
; P& c5 s7 i0 Z& f1 w - system_error('request_tainting');
6 k9 I) l9 I7 ]9 Q - }
- @: P! z; r6 }! Y: [% n) o! O - }7 @! g$ q0 l6 |0 z4 n8 G- z
- }
: O i$ |% g5 h4 [7 k9 c% W) o& q - return true;
! Z( I0 q* h* F/ g' n/ i; @ - }
复制代码 替换为
4 ? k# D4 K9 W& ^- private function _xss_check() {
2 J8 C. `! I% B! t - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
- B0 G4 p, ]1 y( ]3 q - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {) |' ?1 X5 v+ Y
- system_error('request_tainting');; w9 ~/ l! D. |' b
- }; Q+ a. @: J9 ]0 W# U
- return true;+ G8 C% F+ `: Q0 f0 x! X4 C
- }
复制代码 ( e5 l$ c: e! W4 O1 O
( a7 o( s! w6 ~/ ~; G1 i- L2 P
; n$ K5 y( p" k. [' V# J
: C" x5 \, z* }5 k5 q* R3 Z5 ~+ v1 v1 _
|