关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 ( o' k- H( U# k3 x/ e/ M5 D f' x
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
5 \4 v; y# `7 n v$ s& u, V( E# Q& w# W# P$ r$ J- Q
7 l9 M v) t' Z& w( [2 T
PHP6 h( {% M) {; R( N$ p
- private function _xss_check() {
! J! B3 I2 U3 k/ I3 y - static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');8 N! Y7 f9 t/ H+ x+ Y& D7 K& [
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
6 A5 D, T' Y2 A G7 I# J2 L - system_error('request_tainting');6 u; p: R: D/ m& v8 E
- }. \( o. `7 T3 ^( ~" E0 {
- if($_SERVER['REQUEST_METHOD'] == 'GET' ) {* _% I# V8 c* B3 u1 v
- $temp = $_SERVER['REQUEST_URI'];
! V; R; a" y/ D# Z1 D - } elseif(empty ($_GET['formhash'])) {1 J7 b: E. @. p, q
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
8 E2 s' Z2 N8 Q* o5 Q3 [+ ^ - } else {* M& _$ P$ C. n& h) D; F+ x N
- $temp = '';
% L% u5 {! T1 `" n5 w - }- K6 X& l1 D( X- g9 _
- if(!empty($temp)) { E5 e3 D& `$ ^2 n. W; g& f4 }1 x
- $temp = strtoupper(urldecode(urldecode($temp)));
2 A0 ?/ p6 o) l4 M% E8 @ - foreach ($check as $str) {% c' Y) V! ~, P0 K
- if(strpos($temp, $str) !== false) {
' Y) j, r: e, T$ \: n' z( A - system_error('request_tainting');
3 u6 y- i' C6 U# q - }
, {; H* ?8 e. |; a - }! X# b6 J' t/ O9 ]4 E4 O
- }
, U& V. U7 D1 i4 ]4 [! c - return true;7 x- S: c# c" k' x7 k* [# e
- }
复制代码 替换为
7 ^3 W, y7 p3 P6 J) j, U* ?( L- private function _xss_check() {
' w9 Y( o; V P y! B4 e& _! o - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));3 C& E1 l' [5 L2 i* v1 z# F
- if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
( H+ @: ^9 }) y' ^5 p - system_error('request_tainting');
6 D r/ z% v5 \# B - }* e% ~; V6 j- Q D
- return true;) A% K: C, K( S8 J2 j, ^ q
- }
复制代码 ' h. W5 _6 [( ?9 e
- g) p7 W/ |1 C4 {3 t1 m" J2 U* ~ s2 X
& n* O" c5 b6 {! t$ ?
. K; A9 Y% |; C' W# l1 r
; c2 v% C& _4 }
|