thinkphp框架5.0.23安全更新问题-漏洞修复-/thinkphp/library/think/App.php具体怎么改以及为什么要这么改

官方原文问答那稍微有点乱,给大家整理下 /thinkphp/library/think/App.php 文件第553行下方

        // 是否自动转换控制器和操作名
        $convert = is_bool($convert) ? $convert : $config['url_convert'];

        // 获取控制器名
        $controller = strip_tags($result[1] ?: $config['default_controller']);
 
        $controller = $convert ? strtolower($controller) : $controller;
        
           // 修补漏洞写的
        if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
            throw new HttpException(404, 'controller not exists:' . $controller);
        }

在获取控制器下方加入

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
    throw new HttpException(404, 'controller not exists:' . $controller);
}

我们看了需要这样加,那么为什么需要这样加?

preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
preg_match() 匹配成功一次后就会停止匹配,如果要实现全部结果的匹配,则需使用 preg_match_all() 函数

而if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)判断得到的控制器名$control是否属于/^[A-Za-z](\w|\.)*$/

/^$/ 代表正则的头和尾, [a-zA-Z]表示大小写的a到z的字母,后面的*号表示匹配0个或多个字符,

如果属于那么则抛出新的函数, throw new HttpException,   404并且提示controller not exists

解决方案参考文:

5.0.23安全更新问题 - ThinkPHP框架

猜你喜欢

转载自blog.csdn.net/dujiangdu123/article/details/126120166
今日推荐