关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 ' f, k k: Y! O' K% R+ l$ `4 Q
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
8 P3 X7 l* z1 _/ D, t
" ^- n6 V" }1 E5 ~7 C% K+ l6 [2 x e5 n3 _' D4 N4 K) x
PHP
7 h9 Q: a* u5 s8 L/ L- m- private function _xss_check() {
8 d* {- s4 A1 ] - static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');/ Q8 \7 z. u8 ~7 q. N
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) { h2 G) o6 l) b, ?* T0 i: Z2 h
- system_error('request_tainting');
& b5 O: n! q. y e+ ` - }
9 a# \5 O2 G- v7 A' ?+ v - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
: L3 |# x3 m9 x8 J* d - $temp = $_SERVER['REQUEST_URI'];
; b5 e$ ~9 ~9 G - } elseif(empty ($_GET['formhash'])) {
7 S$ j" m$ p3 M7 v! {4 J. y& B; B B/ h& e - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');$ h7 U7 l7 S, w* }* _2 d) @1 q
- } else {1 |& U( P& R) {' }
- $temp = '';
# l0 Z0 g8 h: H* r I - }& u4 L- e' K0 g& \9 z) w( l
- if(!empty($temp)) {
7 d7 l( r/ |3 M - $temp = strtoupper(urldecode(urldecode($temp)));
7 h. W( i6 H+ Z: R! U - foreach ($check as $str) {% k6 V- T3 l( q7 J
- if(strpos($temp, $str) !== false) {
7 V+ e8 q' K: G2 x - system_error('request_tainting');
% y+ h; z7 U6 N' n! u - }
3 L! X# M% N1 d, \9 J - }
4 S+ M2 X" \6 N+ ~1 X8 S6 E - }: I* l. A: [! I: }9 z/ x7 M! n
- return true;& v- S6 a: g- R$ r: \) C, l2 U
- }
复制代码 替换为
* J0 T! G" P V8 b- d }! v2 ^. c3 G- private function _xss_check() {
& q% P9 Q/ h+ H/ }# `0 ~/ o5 v - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));5 ^4 L/ k% t; W% C \
- if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {* I: t+ W- [( `1 } s
- system_error('request_tainting');, J% l; A. n* y7 r9 r
- }' P( U2 M) S6 ]( h1 E# M9 O0 @
- return true;
: Z# r# d9 B1 x( A: ]" w - }
复制代码 1 I9 ^; ?! } _& e; a. \
5 L9 b* S7 u/ ~# ?. I+ \
% N% |+ L0 K% y M, \" i
( ^( @: e( b: j' b S, G+ {
: v' R. \! N- M, f- |
|