• 标签

      discuz discuzX dropbox google Gravatar hack java mysql php phpwind wordpress wp-codebox 仙剑奇侠传 代码高亮 价值观 任务 优化 嘀咕 大学 头像 娱乐 学习 实验 开发 心理 排序 插件 操作系统 教程 标签云 校内 框架 河蟹 法律 清理 漏洞 理综 矩阵 算法 类 网游 试题 道德 随笔 黑白棋

      分类目录

      • 『他言他语』 (37)
        • 新闻 (1)
      • 『信息安全』 (1)
      • 『历史』 (48)
        • 心情随笔 (5)
      • 『吾之想』 (10)
      • 『追忆过去』 (7)
      • 技术研讨 (85)
        • ACM (1)
        • discuz (31)
        • java (8)
          • 学习 (5)
        • javascript (1)
        • mysql (2)
        • PHP (9)
        • ruby (1)
        • wordpress (7)
        • 操作系统 (4)
        • 数据结构 (1)
        • 汇编 (2)
      • 未分类 (31)
      • 杂记 (3)
    • 7月 28th浅析DzX 1.5与DzX2中在线时间不更新的问题与其修复

      在Discuz!X 1.5中,康盛恢复了在线时间这一功能,但有不少站长报告说会员的在线时间并不见更新。当然,一如既往的,官方没有承认此错误,同时还有一位官方人员对DzX的在线时间机制做了个解析(传送门在此)。那么实际上是不是真的没有bug呢?必然不可能没有拉,如果真没有那谈何修复,就更没有这篇文章了。。。

      分析

      在康盛官方人员的那篇帖子中我们也可以看到,更新用户的在线时间是在updatesession()这个函数(位于source/function/function_core.php)中实现的。下面我来分析下其中关于在线时间的代码(注释为蝦米所加,所参考版本为DzX2 110629,SVN ID:function_core.php 22982 2011-06-13 01:52:33Z zhangguosheng )

                      if($_G['uid'] && TIMESTAMP - $_G['member']['lastactivity'] > 21600) {//如果用户已经登陆,并且当前时间与数据库中记录的用户上次活动时间之差大于6小时
                              if($oltimespan && TIMESTAMP - $_G['member']['lastactivity'] > 43200) { //如果在线时间功能开启,并且当前时间与用户上次活动时间之差大于12小时
                                      $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'");
                                      DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1); //那么对在线时间进行更新
                              }
                              DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP),  "uid='$_G[uid]'", 1);  //更新数据库中的用户上次活动时间
                      }

      if($_G['uid'] && TIMESTAMP - $_G['member']['lastactivity'] > 21600) {//如果用户已经登陆,并且当前时间与数据库中记录的用户上次活动时间之差大于6小时 if($oltimespan && TIMESTAMP - $_G['member']['lastactivity'] > 43200) { //如果在线时间功能开启,并且当前时间与用户上次活动时间之差大于12小时 $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'"); DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1); //那么对在线时间进行更新 } DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP), "uid='$_G[uid]'", 1); //更新数据库中的用户上次活动时间 }

      也许细心的站长已经发现了其中的问题,如果一个会员他很活跃,任意2次访问间隔时间均不超过12小时,岂不是他的在线时间再也不会更新了?

      修复方法

      既然找到了问题,那修复就很简单了,将

      if($oltimespan && TIMESTAMP - $_G['member']['lastactivity'] > 43200) {

      if($oltimespan && TIMESTAMP - $_G['member']['lastactivity'] > 43200) {

      一行替换为

      if($oltimespan) {

      if($oltimespan) {

      保存即可。

      其实又是一个很低级的逻辑上的错误,那么多报告bug的难道Discuz官方就不能进行下确认吗?这个问题并不难发现,我也是别人找了我说有这个问题想让我帮忙看下才发现的。吐槽的话已不想多说,就这样子吧。


      This entry was posted in discuz and tagged discuzX, 漏洞 by 江湖大虾仁 and comments are closed.
      • Comments

        1. hkemax说道:
          2011年10月26日 1:56 上午

          还是有部份会员不更新…!!

          回复
        2. N说道:
          2011年09月12日 4:34 下午

          略缩图也是的

          图片扩展模式,设置版图判断公式出现两个一样的,判断宽度的条件,正确来说应该是 宽 高进行判断

          回复
    • 发表评论 取消回复

      电子邮件地址不会被公开。 必填项已用*标注

      *

      *

    • ‹ Older Post Newer Post ›

      Powered By WordPress

        虾米的天地一花一世界,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清净

      • WAP
      • 技术手札
      • 关于我
      • 留言板