Chinaunix

标题: [原创分析] phpSYsInfo无法正常使用时Uptime为何显示而且很大 [打印本页]

作者: HonestQiao    时间: 2005-11-01 10:07
标题: [原创分析] phpSYsInfo无法正常使用时Uptime为何显示而且很大
[代码分析] phpSYsInfo无法正常使用时Uptime为何显示而且很大

    问题的来源: http://bbs.chinaunix.net/viewthread.php?tid=638346&extra=page%3D1
    问题的图片: http://bsdroot.dns0755.net/images/phpsysinfo.gif
  
    首先,我们来看: uptime为13083天9分钟

    我们简单计算: 13083/365= 35.84年
                          1970 + 35.84 = 2005.84年
                          0.84*12 = 10.08
    当然我这是非常粗俗的计算而已。

    实际的原因呢?

    以下以FreeBSD为例子:
  
    如果你会php,而且你研究过phpSysInfo的实现,那么,我们开始:

    打开1: /path/to/phpsysinfo/includes/os/class.BSD.common.inc.php

    打开2: /path/to/phpsysinfo/includes/os/class.FreeBSD.inc.php

    从1的uptime部分的定义:
  1.   function uptime () {
  2.     $sys_ticks = $this->get_sys_ticks();
复制代码

   
    我们回到2查看get_sys_ticks的定义:
  1.   function get_sys_ticks () {
  2.     $s = explode(' ', $this->grab_key('kern.boottime'));
  3.     $a = ereg_replace('{ ', '', $s[3]);
  4.     $sys_ticks = time() - $a;
  5.     return $sys_ticks;
  6.   }
复制代码


    我们再回到1查看grab_key的定义:
  1.   // grabs a key from sysctl(8)
  2.   function grab_key ($key) {
  3.     return execute_program('sysctl', "-n $key");
  4.   }
  5.    
复制代码


    很明显,如果无权操作sysctl或者权限不够,那么必然grab_key返回无效的数据。

    get_sys_ticks里面返回的uptime的timestamp就为:time()

    显然:uptime 返回的就为当前的time()了

    而这个time是从1970年开始计算的。

    到此,我想,大家都明白为什么了吧。




   问题的图片:

[ 本帖最后由 HonestQiao 于 2005-11-1 10:11 编辑 ]
作者: 海鹰    时间: 2005-11-01 10:11
http://bbs.chinaunix.net/viewthr ... &extra=page%3D1

晕倒,成了分析对象了
作者: HonestQiao    时间: 2005-11-01 10:12
呵呵,因为你那个帖子所引出来的啊。

虽然很久以前我就研究过
作者: 海鹰    时间: 2005-11-01 10:15
原帖由 HonestQiao 于 2005-11-1 10:12 发表
呵呵,因为你那个帖子所引出来的啊。

虽然很久以前我就研究过



可我没说UPTIME啊。。。。。……
作者: 海鹰    时间: 2005-11-01 10:17
既然这样,那楼主应该做个PATCH给人家啊。免得有人拿这个到处招摇撞骗
作者: HonestQiao    时间: 2005-11-01 10:24
这个是apache+php没有配置好权限的问题,并不是一个bug啊。
作者: 剑心通明    时间: 2005-11-01 10:26
uptime不算,其他的哪?
作者: 海鹰    时间: 2005-11-01 10:26
原帖由 HonestQiao 于 2005-11-1 10:24 发表
这个是apache+php没有配置好权限的问题,并不是一个bug啊。



难道要root?
作者: HonestQiao    时间: 2005-11-01 10:30
原帖由 海鹰 于 2005-11-1 10:26 发表



难道要root?


当然需要root权限才可以的,否则很多新戏你都读取不到的。
作者: FinalBSD    时间: 2005-11-01 11:37
一点技术含量都。。。有
作者: hongzjx    时间: 2005-11-01 11:38
这帖子才值得顶一下
作者: 剑心通明    时间: 2005-11-01 11:42
原帖由 hongzjx 于 2005-11-1 11:38 发表
这帖子才值得顶一下
加个精华吃饭去
作者: FinalBSD    时间: 2005-11-01 11:43
原帖由 剑心通明 于 2005-11-1 11:42 发表
加个精华吃饭去

昏过去,这样都行
作者: 剑心通明    时间: 2005-11-01 11:44
原帖由 FinalBSD 于 2005-11-1 11:43 发表

昏过去,这样都行

快中午了,不该吃饭吗
作者: FinalBSD    时间: 2005-11-01 11:47
原帖由 剑心通明 于 2005-11-1 11:44 发表

快中午了,不该吃饭吗

:wink::wink:
作者: FinalBSD    时间: 2005-11-01 12:57
刚刚试过了,果然和我猜想的完全一样,如果运行在chroot方式下,就会得到楼猪那样的图片,反之一切显示正常。OpenBSD3.8下测试结果。(chroot方式下,php无法取得系统数据,除非将必要的冬冬都放到chroot环境中)
作者: HonestQiao    时间: 2005-11-01 13:23
原帖由 剑心通明 于 2005-11-1 11:44 发表

快中午了,不该吃饭吗


吃完了么?

我都吃完了,挺好吃的
作者: 海鹰    时间: 2005-11-01 13:32
原帖由 FinalBSD 于 2005-11-1 12:57 发表
刚刚试过了,果然和我猜想的完全一样,如果运行在chroot方式下,就会得到楼猪那样的图片,反之一切显示正常。OpenBSD3.8下测试结果。(chroot方式下,php无法取得系统数据,除非将必要的冬冬都放到chroot环境中)

但是CGI的可以
作者: HonestQiao    时间: 2005-11-01 13:36
原帖由 海鹰 于 2005-11-1 13:32 发表

但是CGI的可以



CGI的与一般的mod_php的方式,是有区别的。

CGI可以使用CGI本身的属猪的权限运行

而mod_php模式使用apache的权限,一般可能为nobody


当然CG__php也可以的




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2