这是一个很严重的 Bug,在 FireBird 2.3/2.5/2.6 上均检测到了它的存在。
其它版本未经检测。
这个 Bug 是早些时候由 QuickBASIC 网友在本站 sysop 版发文指出的。
这个 Bug 如果不修正,那么在一定的条件下(这个条件很容易满足),
任何网友(不管权限如何)都可以通过一定的操作(这个操作也不复杂),
删除任何他能看到和曾经发表过文章的版面之内的别人的大量文章。
对此本站做了简单的修正,本文后面的部分将附上修正代码和必要的说明。
鉴于这个 Bug 具有很强的破坏性,对如何测试和复现它,就不进行说明了。
同时,希望已经知道详情的网友,以及看了修正代码后推测出详情的网友,
出于对其它网友和站点的尊重和爱护,不要把详情公布出来,以免造成不必要的损失。
另外,还请大家向其它站点转告关于这个 Bug 的信息。
本站只公布自己的修正代码,供大家参考和指正;
具体的 Bug 详情不予公布,也不对任何利用这个 Bug 制造的破坏事件承担任何责任。
=============================================================================
以下是修正代码,适用于 FireBird 2.5/2.6,其它版本未经测试。
1. bbs_src/bbs.c 的 edit_title 函数:
> 添加两个变量定义 <
long i;
struct fileheader xfh;
> substitute_record(direct, fileinfo, sizeof(*fileinfo), ent) 调用前插入 <
/* Leeward 99.07.12 added below to fix a big bug */
setbdir(buf, currboard);
for (i = ent; i > 0; i --)
{
if (0 == get_record(buf, &xfh, sizeof(xfh), i))
{
if (0 == strcmp(xfh.filename, fileinfo->filename))
{
ent = i;
break;
}
}
}
if (0 == i)
return PARTUPDATE;
/* Leeward 99.07.12 added above to fix a big bug */
2. bbs_src/record.c 的 delete_file 函数:
> ent = 1; 一行改为 ent = 0; <
=============================================================================
同类的问题代码里其它地方还有若干,但是由于不至造成其它用户的文章被删,
我们没有进行修正。
以上代码仅供参考。
--
修改:Leeward FROM 202.112.58.200
FROM 202.112.58.200