EMLOG6.0空标签爆出数据库信息解决方法

    选择打赏方式

平时大家用EMLOG的时候后台发布文章或者用了某些插件或者迁移网站数据的时候,有可能会导致数据库里面存在这个标签,但是这个标签是没有指定任何文章的,这会导致什么问题呢?

例如我有一个《傲世》标签,这个标签是没有指定任何文章的,是一个空标签,具体如下图所示:

augSv1rUE7qXjfk.png

假设我是访客,我访问了这个标签链接 https://www.recho.cn/tag/傲世 前台EMLOG6.0就会直接爆出SQL语句执行错误,如下图所示:

bzSoAdjnX8E6kQu.png

报错过程:通过访问标签链接路由分配到tag_controller.php控制器,控制器中执行到函数getTagByName,然后函数getTagByName就会执行函数getIdFromName将这个标签内的所有文章ID返回出来,并且传递给函数getTagById,随后就进一步的将各个文章内容展示出来,问题就出在函数getTagById这一步,如果函数getIdFromName返回的是一个毛都没有的值,就会产生连锁反应,导致后面的函数无法进一步执行,SQL查询自然就会出问题,就直接报错了。

建议各位一定要修复,因为SQL报错会被一些安全网站或者搜索引擎识别为安全漏洞,减低权重。

修复方法如下:

打开 网站根目录includemodeltag_model.php 中大概53行函数getTagById改为如下:

    function getTagById($tagId) {
        $blogs = $this->getBlogIdsFromTagId($tagId);
        if($blogs===false)return false;
        $blogIdStr = implode(',', $blogs);
        return $blogIdStr;
    }

随后往下继续编辑,大概321行函数getBlogIdsFromTagId改为如下:

    /**
     * 从TagId获取到BlogId列表 (获取到一个Tag下所有的文章)
     * @param int $tagId 标签ID
     * @return array 文章ID列表
     */
    function getBlogIdsFromTagId($tagId) {
        $blogs = array();

        $sql = "SELECT `gid` FROM `" . DB_PREFIX . "tag` WHERE `tid` = " . $tagId;
        $query = $this->db->query($sql);

        if ($this->db->num_rows($query) > 0) {
            $result = $this->db->fetch_array($query);
            if ( ! empty($result['gid']))
            {
                $blogs = explode(',', $result['gid']);
            }else{
              return false;
            }
        }

        return $blogs;
    }

实际上就是加上了个判断,如果数据库查询不到该标签,就返回布尔值:假,并且将这个假返回给函数getTagById,如果得到的值为假,则直接输出假,网站就会显示404错误,而不会直接爆出SQL语句了!

温馨提示:食用本章前可搜索本站更多关于EMLOG的文章,帮助您修复更多的EMLOG漏洞!

版权声明:若无特殊注明,本文为《傲世》原创,转载请保留文章出处。
本文链接:https://www.recho.cn/82.html
如您对本文章内容有所疑问、反馈或补充,欢迎通过邮箱:admin@h2fast.cn 联系我们!
正文到此结束

热门推荐