关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
( R5 ?, M: A9 @2 k/ p, l! J3 C解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
( a' ?' s4 P3 D* y |5 C/ e% @3 N
; F- t7 z- N# z# @- P5 a! \- u" V% @4 _6 b2 V
PHP- }* h% G* K3 B# c/ K& J$ V0 g( ?
- private function _xss_check() {
3 O* m8 ^& X& L% M& n6 |& L# ^ - static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
- F3 K( ]! v; X' ]5 Q% ~ - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {% V- ~' i# q% N2 M* q
- system_error('request_tainting');
8 i" `9 j& p& O6 [: t+ f5 {, { - }7 @( g. V3 h5 p/ T
- if($_SERVER['REQUEST_METHOD'] == 'GET' ) {8 Q0 Y, x- d2 C9 T+ m# y
- $temp = $_SERVER['REQUEST_URI'];% D: [0 x, w5 d2 h, ?1 \% o
- } elseif(empty ($_GET['formhash'])) {
, A9 p8 O9 {: q3 b( a3 L# c, [ - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');& [0 ?* J2 g! `7 S( D2 v1 J- J, i6 m% K
- } else {
+ i8 ^/ I" {( m8 \2 [ - $temp = '';
9 r6 e. `: ?% ?! W3 ] - }
: p5 t) A7 ~7 f6 n6 O - if(!empty($temp)) {
9 m4 s" B6 K3 u; L. K4 S- J% s - $temp = strtoupper(urldecode(urldecode($temp)));4 _; J3 {5 O& B2 ?/ V! T) S6 e
- foreach ($check as $str) {& n' U) H* e* f& B0 e( D1 W
- if(strpos($temp, $str) !== false) {
0 b/ s8 X6 e& {. d - system_error('request_tainting');
, p: g4 {" q. d( ^% g2 P - }' S: U! m' T4 a' s
- }
, J7 C/ Q/ `0 f7 Z: a) t - }
9 n s* e" o% v0 i- T9 k - return true;6 e! i" X& E& p `# u8 o
- }
复制代码 替换为2 {: y7 e: ~, O5 {3 t
- private function _xss_check() {
3 H2 P3 Q) d3 `9 c9 m - $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
! [" [& c0 g2 f - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {; }5 q) B$ A4 u6 h( {* a5 ?: k& ?
- system_error('request_tainting');
, d" `+ B& S* m7 C N9 \ - }
4 [# F( [6 \" N: T6 }) d - return true;
( X$ k" w6 m! U - }
复制代码 1 H& q% D6 d/ {; R
- l. h2 o7 F9 ]1 z% D9 _ W$ j
' o5 j; ~. B- @& l' C0 W& Z. E
|