关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 9 i' K, Z- j% t; g! g, b- R9 I
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
7 e& I7 c; d% u- O0 \# Y
1 v: x0 S: E) L8 \! R& M
% t8 `) P& e) |& F3 [1 P# y' M8 VPHP6 n/ _' R. I4 {+ n% t
- private function _xss_check() {
. }( V( W3 x& q; J" @2 ` - static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');3 b" u/ M( R$ A4 F
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {% _9 x7 A8 s5 O T
- system_error('request_tainting');
; w: p' V* q2 s6 V+ H - }6 s4 c7 V: M. n& \8 `% S( b
- if($_SERVER['REQUEST_METHOD'] == 'GET' ) {0 @8 `& W9 l/ V2 C+ F6 B; ^
- $temp = $_SERVER['REQUEST_URI'];
& j+ E% j9 n6 H: t - } elseif(empty ($_GET['formhash'])) {
8 n* G% r K% g2 a - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');& B3 N" \4 `0 Y% @( O
- } else {+ D# J ~2 E0 K% p
- $temp = '';0 O8 t% ~$ y- o8 M' }) H0 A
- }
" ]8 F3 D" |% D! T- c9 L& D1 @. c - if(!empty($temp)) {
3 @" _( D: F' M: v# T - $temp = strtoupper(urldecode(urldecode($temp)));
* B" J+ r$ ?3 I3 v+ i - foreach ($check as $str) {
( Y3 q( \- h H/ s% D- A - if(strpos($temp, $str) !== false) {
. n# m& F: T0 I0 v# t - system_error('request_tainting');- ]+ U& W0 q5 O5 {$ ^( P x
- }
% d: b" ~- d' e1 |- E1 A1 z - }
( h. K& g) K% D/ j) [ - }, f5 c1 V$ [* r$ ~) w ]8 d# |
- return true;
' f. c+ m1 l# o, R; L, M! [" M9 t - }
复制代码 替换为
X Q% ~8 r! Y1 x+ J. b' ~- private function _xss_check() {
6 `6 L& G9 g8 G! O& ~3 N, E* A - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
8 c: R/ z# m4 ^: }7 x* K& k/ j1 s - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {' E; d, d% Q7 M5 X- ^* F( u
- system_error('request_tainting');
" k; g' g3 a6 I5 l% F9 d - }9 W" q; \8 F/ f+ V& z/ \2 g
- return true;4 @4 G! m+ U! v* n. [$ E2 b
- }
复制代码
7 k+ {4 j4 x* z/ O$ N5 i4 v% ?& i; a; T2 b+ F/ E
; z# s) U0 p8 V
1 c5 z8 H1 C7 e
8 G2 l% j4 c' ]: w6 C
|