Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

UCenter通信成功,通知失败!

[复制链接]
金盾联盟 发表于 2015-9-26 18:58:08 | 显示全部楼层 |阅读模式
今天突然发现UCenter后台,应用通信成功,但是某些操作通知失败。并不是所有操作都失败,目前发现(更新应用列表)和(更新应用缓存)没有一次成功,一直是失败,重试只会增加失败次数。本地全新安装测试也是一样问题,网上的方法都看了,修改了,无任何效果。。。。

1.该方法试过:/source/class/discuz/discuz_application.php
注释掉(无效):
  1.   if(strpos($temp, $str) !== false) {
  2.                                         system_error('request_tainting');
  3.                                 }
复制代码
2.该方法试过(无效):api/uc.php中源文件中第41、42        $discuz = C::app();
$discuz->init();
需注释掉
3.原因是 source/class/discuz/discuz_application.php
该文件有一个校验函数叫 _xss_check

下面是源码
Discuz!x2.5
  • private function _xss_check() {
  •                 $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
  •                 if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
  •                         system_error('request_tainting');
  •                 }
  •                 return true;
  •         }

[color=rgb(51, 102, 153) !important]复制代码

Discuz!x3.2
  • private function _xss_check() {
  •                 static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');
  •                 if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
  •                         system_error('request_tainting');
  •                 }
  •                 if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
  •                         $temp = $_SERVER['REQUEST_URI'];
  •                 } elseif(empty ($_GET['formhash'])) {
  •                         $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
  •                 } else {
  •                         $temp = '';
  •                 }
  •                 if(!empty($temp)) {
  •                         $temp = strtoupper(urldecode(urldecode($temp)));
  •                         foreach ($check as $str) {
  •                                 if(strpos($temp, $str) !== false) {
  •                                         system_error('request_tainting');
  •                                 }
  •                         }
  •                 }
  •                 return true;
  •         }


对比发现,新版代码的问题在 $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input'); ,如果是Ucenter下发的通知
$temp拿到的数据是 get的数据和post的数据
因为ucenter 发的post数据是xml格式, 所以下面的检测是肯定会走到 system_error('request_tainting');的
  • foreach ($check as $str) {
  • if(strpos($temp, $str) !== false) {
  • system_error('request_tainting');
  • }


因为$check包含了 '<'  '>' 这些符号
  • static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');




以上方法全部试过。。。。没任何效果,还是一直失败

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-1-7 07:24 , Processed in 0.016924 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表