关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。 ' O7 P% G% [4 D2 @0 X g
解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
3 b# B, C X4 [+ B; d9 X2 a5 a' u0 E" z, [. J6 _* z5 K+ d) l
2 s, T/ s2 z) h4 _1 {4 {PHP
9 y% L; ]7 y% f; ^$ I' o* v- private function _xss_check() {, x g/ \* t$ X% M+ `7 a2 B
- static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
) y5 N G- e0 T& C R, V' Y- O+ q/ B- @ - if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
0 {1 x3 N1 ]9 U6 V: f0 V - system_error('request_tainting');
3 H/ b0 e: L2 g$ q- x9 `2 @' a2 ]- C - }
7 L4 {3 e- K) ]. v3 s: W - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {6 c9 B0 j3 s9 Q
- $temp = $_SERVER['REQUEST_URI'];3 _/ A/ P6 X8 b8 |, o# F7 I
- } elseif(empty ($_GET['formhash'])) {' f% @/ x4 H, J5 @
- $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
8 {( N* b( T: f. U - } else {
) a9 @: U. k) `0 Q - $temp = '';' @, I( L/ S& p0 \. q
- }
2 W! a( b, t2 a& T - if(!empty($temp)) {) H' v6 D% ]/ v V- P1 p) T/ N
- $temp = strtoupper(urldecode(urldecode($temp)));
: q2 {$ W! ?9 I3 z& L7 s8 A - foreach ($check as $str) {
4 {4 ]/ s6 E. p" t% i- W+ h" v - if(strpos($temp, $str) !== false) {
9 Z9 v& d" H: v+ j - system_error('request_tainting');
- R' F# u0 a) [) D" k - }
) R" h4 a- b& m2 ~" T - }# h4 N( j3 D* N9 v1 Q" x
- }8 [0 t6 ~/ G$ C% S$ n# R% s1 H) t
- return true;+ E; K7 D4 P# F1 D& ` V
- }
复制代码 替换为
$ G! V( T* t3 M! V: V* y% O- private function _xss_check() {7 d1 C8 ]( s, k3 y
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
1 m& q( I6 z3 y - if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {3 u% v3 ?; G8 \/ `) R4 t
- system_error('request_tainting');; r! f0 m! b9 @* e( {' Z" J* g9 v$ C* M
- }/ F" X% U1 l8 N) I7 N) Q# @
- return true;
: m) Y' |7 L* b - }
复制代码 1 Y7 h! E6 y. t4 {7 t- [
3 E& g/ V& r2 K/ a6 e
# l8 T9 B+ o1 M3 D: p0 J& c
9 W+ M1 T# k, Q. `
2 ~! y" N) l, {) a, R
|