EMLOG6.0空标签爆出数据库信息解决方法
- A
平时大家用EMLOG的时候后台发布文章或者用了某些插件或者迁移网站数据的时候,有可能会导致数据库里面存在这个标签,但是这个标签是没有指定任何文章的,这会导致什么问题呢?
例如我有一个《傲世》标签,这个标签是没有指定任何文章的,是一个空标签,具体如下图所示:
假设我是访客,我访问了这个标签链接 https://www.recho.cn/tag/傲世 前台EMLOG6.0就会直接爆出SQL语句执行错误,如下图所示:
报错过程:通过访问标签链接路由分配到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漏洞!









