纪念衫征集
查看: 1883|回复: 10

[bug反馈] 关于提升/下沉帖子导致主题帖最后回复时间异常的bug

[复制链接]
阅读字号:
发表于 2023-12-5 11:56 | 显示全部楼层 |阅读模式
问题描述:今天早上一打开论坛,便看到管理板块出现了诡异的情况:
屏幕截图 2023-12-05 114605.jpg
这是要提前过圣诞还有春节了吗?

然后我看了看其他管理版的帖子,发现有很多这样的情况,而且不难发现规律:
这个帖子在 2023-11-27 23:06 提升,而最后回复时间变成了 2024-2-25 23:06,相差3个月。
这个帖子在 2023-11-25 19:10 提升,而最后回复时间变成了 2023-12-25 19:10,相差1个月。
这个帖子和上面的情况完全一样。
这个帖子在 2023-11-9 21:09 提升,而最后回复时间变成了 2023-11-9 21:09,相差1个月。

诸如此类,数不胜数。同样地,有的时候会发现某些板块的最后回帖显示「从不」,不难猜想这种情况是由于最后回帖被下沉或是删除而导致的。

当然,我想管理员们或许早就发现了这个问题,主要还是想说这个bug应该还是有修复的价值的。如果每次提升只有1个月的有效期,那么每过一段时间都要再提升一次,其实还是有些麻烦的吧,而如果因为提升/下沉的操作导致最后回帖变得混乱,我想也会带来一些不便之处的。至少我在很长一段时间里,看到某个板块后面的「从未」二字都是相当地困惑,还以为发生了什么惊天动地的大事件呢。

似乎这个问题算是一个discuz!引擎的经典bug了,也有人发出过一些解决办法,当然具体论坛要具体分析就是了。

点评

在百度上找到了一个2014年的帖子,也是关于这个问题的。里面的源代码居然到了现在还是一模一样。  发表于 2023-12-5 21:01
还有管理板块没法编辑帖子,总觉得有些不方便啊。  发表于 2023-12-5 11:57
 楼主| 发表于 2023-12-5 17:14 | 显示全部楼层
在这个帖子底下再说一个discuz!引擎的bug吧,不过这个bug的优先级确实可以说是很低很低,只是姑且报告一下。

当discuz!触发防采集功能以后,用户在点击一个帖子时,响应的不再是帖子内容,而是一段<script>脚本,比如说像这样的:
  1. [font=Consolas]function Rz(Rz_){function d(){return getName();};return d();return 'Rz'}Ta='h';um='_';function FcY(FcY_){function _F(FcY_){function ce(){return getName();}function FcY_(){}return ce();return FcY_}; return _F(FcY_);}_eJ54I = window;_ko65m = 'assign';yh=function(){'yh';var _y=function(){return 'l'}; return _y();};_vewSX = location;function getName(){var caller=getName.caller;if(caller.name){return caller.name} var str=caller.toString().replace(/[\s]*/g,"");var name=str.match(/^function([^\(]+?)\(/);if(name && name[1]){return name[1];} else {return '';}}EH8=function(EH8_){'return EH8';return EH8_;};TiBe=function(){'TiBe';var _T=function(){return '25d'}; return _T();};R8='d';_yW4yz = 'href';zz=function(){'zz';var _z=function(){return '1'}; return _z();};_SFRs7 = 'replace';u6=function(){'u6';var _u=function(){return '5'}; return _u();};k4='.';f44D=function(){'return f44D';return 'gn=';};do=function(){'do';var _d=function(){return '8'}; return _d();};Ovs=function(Ovs_){'return Ovs';return Ovs_;};Ew=function(){'return Ew';return '-';};Knsv=function(){'return Knsv';return '-1-';};location=Ovs('/t')+(function(){'return q2';return 'h'})()+(function(){'return npG5';return 'rea'})()+R8+Ew()+u6()+(function(){'return KMtk';return (function(){return '409';})();})()+(function(r10_){return (function(r10_){return r10_;})(r10_);})('33')+Knsv()+zz()+k4+Ta+(function(Fao_){'return Fao';return Fao_})('tm')+yh()+(function(){'return MKj';return (function(){return '?';})();})()+um+Rz('pV')+EH8('si')+f44D()+(function(){'return xB';return (function(){return '2';})();})()+(function(){'return zJ';return (function(){return 'e';})();})()+FcY('vKj')+TiBe()+do();_eJ54I[_yW4yz]=Ovs('/t')+(function(){'return q2';return 'h'})()+(function(){'return npG5';return 'rea'})()+R8+Ew()+u6()+(function(){'return KMtk';return (function(){return '409';})();})()+(function(r10_){return (function(r10_){return r10_;})(r10_);})('33');[/font]
复制代码

然后浏览器就会跳转到新的地址。

本来其实没有任何问题的,结果discuz!在生成随机变量名的时候没有注意,变量不能和关键字重名,于是返回的脚本有小概率(大约1%)执行出错,用户没法跳转到正确的地址。上面的就是一个实际的例子,这一行里:
  1. [font=Consolas]do=function(){'do';var _d=function(){return '8'}; return _d();};[/font]
复制代码

本意是定义一个叫做 do 的变量,结果和保留关键字重名,导致无法执行。

不过确实,这个bug一是发生概率极低(触发防采集+运气糟糕),二是即使发生了,用户也只需要刷新一下页面即可,三是我作为半吊子不确定在新版本里面这个bug有没有修复,或者已经有人给出了解决方案。就当作是单纯的反馈吧。其实我也只是出于兴趣才在这里浪费时间的。
 楼主| 发表于 2023-12-5 17:14 | 显示全部楼层
volta 发表于 2023-12-5 17:14
在这个帖子底下再说一个discuz!引擎的bug吧,不过这个bug的优先级确实可以说是很低很低,只是姑且报告一下 ...

我现在知道了[code]和[font]嵌套的顺序有区别,可惜改不得了。
 楼主| 发表于 2023-12-5 20:31 | 显示全部楼层
volta 发表于 2023-12-5 17:14
在这个帖子底下再说一个discuz!引擎的bug吧,不过这个bug的优先级确实可以说是很低很低,只是姑且报告一下 ...

试着读了一下源代码,结果在source/class/helper/helper_antitheft.php下面发现了防采集相关的代码。代码中有这么一行:
屏幕截图 2023-12-05 202212.jpg
看来其实还是有排除js关键字的,好巧不巧,ifdo这两个关键字给漏掉了。其实还有很多的关键字也没有写上去。
如果碰巧$val被排除了,接下来会执行这两行:
屏幕截图 2023-12-05 202803.jpg
这里的$var是完全随机生成的字符串,并且没有做任何是否和js关键字重合的判断。
所以只要运气够好,什么样的关键字都有可能在最终的结果里出现,这个防采集做得是不是有点太捞了,当然肯定是discuz!的人背锅。
要把这个bug给修复,估计要增改好多行代码,所以大概是不用修复了吧。其实这一个帖子更应该发到discuz!那边去的,给管理员带来麻烦相当抱歉。

点评

Windows的查找功能和Linux的grep相比完全就是一坨粑粑啊,要不是Windows这个查找太烂,本来可以早好几个小时发现的。  发表于 2023-12-5 20:35
 楼主| 发表于 2023-12-5 20:32 | 显示全部楼层
volta 发表于 2023-12-5 20:31
试着读了一下源代码,结果在source/class/helper/helper_antitheft.php下面发现了防采集相关的代码。代码 ...

上面说错了,if并没有在第一道防线漏掉。实际上,我确实遇到了if作为变量名出现的状况,看来是第二道防线也被轻而易举地突破了,也证明了这个bug其实出现的概率相当高。
发表于 2023-12-5 21:49 | 显示全部楼层
Discuz的帖子提升下沉并不是独立的机制, 而是利用修改帖子记录的最后回复时间, 并基于板块按最后回复时间排序来实现的, 所以不能说是个bug, 只是留意到的话会感到迷惑
 楼主| 发表于 2023-12-5 22:03 | 显示全部楼层
summer22 发表于 2023-12-5 21:49
Discuz的帖子提升下沉并不是独立的机制, 而是利用修改帖子记录的最后回复时间, 并基于板块按最后回复时间排 ...

这样子帖子的「最后回复时间」并不是真正的最后回复时间,同时还会导致板块预览出现「从未」二字(我不确定),所以当然是bug了,只能说优先级确实不高。而且有的论坛也确实解决了这个问题。

点评

按道理来讲,帖子的提升下沉即使为了便利,复用了lastpost这个机制,也不应该在实际界面上展现出来。  发表于 2023-12-5 22:04
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

Archiver|手机版|小黑屋|百合会 ( 苏公网安备 32030302000123号 )

GMT+8, 2024-11-22 17:34 , Processed in 0.036295 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表