2018-12-06 Discuz!-BUG反馈 退出网站清除痕迹报错!

故障现象

程序版本:Discuz! X3.1
故障场景:登录站点后,点击退出并执行清除浏览器痕迹操作,页面抛出系统错误:

Discuz! System Error
您当前的访问请求当中含有非法字符,已经被系统拒绝

PHP Debug 堆栈信息

[Line: 0026]member.php(discuz_application->init)
[Line: 0071]source/class/discuz/discuz_application.php(discuz_application->_init_misc)
[Line: 0552]source/class/discuz/discuz_application.php(discuz_application->_xss_check)
[Line: 0355]source/class/discuz/discuz_application.php(system_error)
[Line: 0017]source/function/function_core.php(discuz_error::system_error)
[Line: 0024]source/class/discuz/discuz_error.php(discuz_error::debug_backtrace)

站点已记录详细错误日志,访问被拦截。

浏览器复现环境:IE6‑IE10、火狐、TT、360 浏览器、Chrome、傲游

问题根因

source/class/discuz/discuz_application.php 中 _xss_check() XSS 安全检测函数逻辑变更。新版检测逻辑会双重 urldecode 解析REQUEST_URI,浏览器清除痕迹产生的特殊编码字符被误判为 XSS 恶意字符,触发request_tainting请求污染拦截。

修复方案

文件路径:source/class/discuz/discuz_application.php,定位大约 350 行私有方法 _xss_check()

新版报错代码(出问题版本)

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;
}

回退修复代码(旧版可用逻辑)

将上述函数替换为早期版本逻辑即可解决误拦截:

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;
}

说明:该方式为临时兼容修复,舍弃括号、单引号、大于号的 URI 检测规则,解决浏览器清除痕迹带来的正常请求误拦截,升级程序时注意覆盖还原问题。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Getting Started Use the Current Stable Version (7.1) Buil...
    Leonzai阅读 2,116评论 0赞 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,276评论 19赞 139
  • 坚持100天做一件事情的时候真不多, 想通过韩大爷的讲述来 达到坚持做一件事的目的, 来学习100个小理论的目的,...
    随性自在的杜姐阅读 206评论 0赞 1
  • 今天参加语文培优班的家长会,外区的优秀老师确实不一样,难怪伢总拿他和班主任说,说他俩的优缺点,现在也开始说...
    圆英ly阅读 534评论 0赞 9
  • 青竹蛇儿口,黄蜂尾上针,此般皆不毒,最毒妇人心! 这句话本身就很毒,打击面太大,用词太刻薄,很多傻白甜也无辜中枪。...
    slooby阅读 779评论 0赞 5

友情链接更多精彩内容