关于Discuz!中“您当前的访问请求当中含有非法字符,已经被系统拒绝”的问题,在添加或更新文章的时候经常出现,经测试发现出现这种情况更多的在使用工具(如火车头采集器)批量发布文章时出现,仔细分析发现,当发布的正文内容出现特殊符号(&,/,<,>等)时出现这样的错误提示。 出现这样的错误主要是因为Discuz!系统的_xss_check()函数原本的意义是为了论坛安全,防止XSS攻击,一般网站使用是不会出现什么问题的,但是有些网站要接入第三方接口,当第三方接口向本站post数据的时候就会报”您当前的访问请求当中含有非法字符,已经被系统拒绝”,本文介绍一种简单的修改方法避免此错误。
, |, _: W: b# M4 o! ~0 {解决方案如下: \source\class\discuz的discuz_application.php 查找如下代码(在360行左右),并替换
3 c* I! I. |' I3 y0 v5 N5 n: N* u4 @
* D* x& z3 G. Q9 C- U1 D
/ b; Z; J8 e7 G9 T S# _, _PHP+ ]) p! w8 S0 ?# L- }" s
- private function _xss_check() {
5 P( y2 k8 k$ F B' _, O8 C - static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');( w. o& @$ E* V q
- if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {7 h! f1 N. [9 ?! i) C9 X) ]$ |
- system_error('request_tainting');
! N- J% o: F/ e0 E - }
4 f" a) X+ Q, ?$ T5 N5 _( `) o# u) ? - if($_SERVER['REQUEST_METHOD'] == 'GET' ) {5 f4 R }- w$ a/ t
- $temp = $_SERVER['REQUEST_URI'];
2 H% w4 w. u' E3 n% Y$ N3 v - } elseif(empty ($_GET['formhash'])) {
+ Z* s) n9 `# d I$ U - $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');8 I$ P9 ]8 y6 H, K, j8 k' q
- } else {$ F* M" c6 G$ w/ t" }$ i# J
- $temp = '';
* n3 V. A& a$ i: m5 C - }
$ ~/ R) a/ \) k+ l6 P# g( U* n$ o( u - if(!empty($temp)) {
3 h$ Z) e" }6 [8 l6 J5 e+ ] - $temp = strtoupper(urldecode(urldecode($temp)));
0 [. ?% O2 o3 t4 m9 I z! Q - foreach ($check as $str) {# r K( |/ }& m# |( S1 O* }
- if(strpos($temp, $str) !== false) {
6 v) {8 j/ ^" M - system_error('request_tainting');; ?. v3 f+ I7 |" H: h: U
- }5 o1 K( i- O4 r3 T! K
- }
; R0 V P f# s4 H4 U" y - }& ]* P+ Q# K$ i* z1 L2 Y5 J
- return true;
1 C( R' S0 P2 W* _: g - }
复制代码 替换为" O8 @1 W& `- \: T6 |( W
- private function _xss_check() {/ n1 `8 H6 M0 I( {, c
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));& E+ `3 C" p0 D1 |
- if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) { r) ~2 s/ O! ^
- system_error('request_tainting');
, l% |, ^$ P" u# ~2 g - }
: a5 t; r4 W5 Z& @4 l3 | - return true;
4 u. e4 j8 ^8 C( P g - }
复制代码
" S) J) @8 x% h+ M+ `) i+ ?9 _& L4 l) s8 U% s4 L0 H4 x
+ j$ A( p: x& L4 R# l: y
J2 q; y7 B' w7 o+ U; N) C* T4 F# g; N# W/ Z& p
|