关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
) X- b/ v3 ]7 O3 v& f% k: U7 f9 v解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换 ) J0 T. `6 d( d: A4 f, z/ `0 C) e3 Y
0 B* q6 S# u5 x$ @, {* j
' E6 L, I4 W0 V# P0 i- @. UPHP
$ G- U' z+ k0 e- private function _xss_check() {$ l5 N6 P8 u( M8 r' n4 p
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
& L/ j6 q @" W' K N5 | - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
5 h8 q: a7 v, r- Y i/ C) U - system_error('request_tainting');
9 {) y- D" h5 q - }3 v f) R* S7 n6 _( f- n, L
- if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
; ^. N5 k! m/ ]4 N6 J L - $temp = $_SERVER['REQUEST_URI'];
* h5 `: x2 }! _9 ]# \! r - } elseif(empty ($_GET['formhash'])) {
* Y( u1 b- z0 A+ j - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
8 X1 r3 z5 |' Z3 ]/ n - } else {
' M/ f4 U/ w4 ? s9 y; W - $temp = '';6 z6 p3 o8 X9 R# y* [
- }. C; P9 V$ T1 m+ D! p
- if(!empty($temp)) {; d7 w$ F- ^3 }& q+ E/ }
- $temp = strtoupper(urldecode(urldecode($temp)));
) | Y( q+ c! M: E4 V- o t' ^ - foreach ($check as $str) {
. p8 Z+ |: H8 z5 _ - if(strpos($temp, $str) !== false) {3 \5 t" U7 z/ j! n' l+ r
- system_error('request_tainting');
9 L9 Z, K0 M. x% h - }
; d; J$ z4 S( p3 E( K5 S5 q - }2 E9 N4 E( V" U3 s6 h5 X
- }
! ~ v4 R/ S6 V+ T+ E4 e - return true;
, k, c* U; @" Y7 n/ c: _" A - }
复制代码 替换为
/ I3 y+ E' _9 H- private function _xss_check() {; d7 \; T7 A; {5 S- x! c& D# @9 r
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
% _4 U- F. E# i7 q. Q - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
) H) t+ g7 }. Q - system_error('request_tainting');
! ~, y+ d& v0 O. \4 \3 J/ I& c - }/ |- y0 z4 X' y) e* M- M
- return true;
% L# A! x7 F$ ?, }8 p& G% g7 c% H9 ` - }
复制代码
9 ]( J% X3 G1 K% N0 F, m. I; }, u/ T8 ] [4 Z
! ]5 L) P7 f! ]9 n, ]4 l5 k, q t* R
6 t2 D U2 d, d1 h6 v, B& o R3 o) c
|
|