邪恶八进制信息安全团队技术讨论组's Archiver

虫虫 2006-6-30 05:25

[原创]JS脚本获取远程WEB服务器时间

原创作者:虫虫
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

看到 白色猎人 的时间校验程序,又想起我以前弄的一个获取远程服务器时间的JS脚本.有没有用我不知道,呵呵~
还是以前的废话连篇的风格,自己都看不惯,就这样贴出来吧:

在百度知道上逛游,忽然看到一个问题是问如何用js取得互联网时间,而不是本地时间。
互联网时间,那不就是时间服务器嘛~好说,先查查资料先~~
可惜结果不甚理想阿,原来时间服务器使用的是UDP协议,而HTTP却TCP的,如果不用自己的控件根本没法完成嘛!本来还想用XMLHTTP做点什么呢~~

后来忽然想到,不是HTTP服务器的响应头都有个DATE选项吗?如果能拿到开了HTTP的时间服务器的HTTP头不就能得到时间服务器的时间了吗?哈哈!
于是说做就做,我用XMLHTTP获得了国内的一台时间服务器的HTTP头,把DATE选项分离出来,就可以啦~~代码:
[code]
<script>
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.3.0");   //建立XMLHTTP对象
xmlhttp.open("GET", "http://时间服务器地址/", false);   //打开
xmlhttp.send();                //发送
var dateStr=xmlhttp.getResponseHeader("Date");      //取得Date选项
alert(dateStr);
</script>
[/code]
测试一下,哈哈,效果不错~~


可惜好景不长,我再做测试的时候忽然发现得到了一个空的dateStr的值?刚才不还好好的吗?服务器不该随便更改http头啊~
不甘心,于是拿出WinsockExpert,我抓包!看你小子怎么弄的!
这是我发送的包:

GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: file://C:\Documents and Settings\Administrator\桌面\date.htm
Accept-Encoding: gzip, deflate
If-Modified-Since: Sun, 16 Nov 2003 05:49:50 GMT
If-None-Match: "663c-1bcd-3fb70ffe"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar)
Host: [url]www.xxxxxxxx.com.cn[/url]
Connection: Keep-Alive

这是收到的包:

HTTP/1.1 304 Not Modified
Date: Thu, 30 Mar 2006 05:34:31 GMT
Server: Apache/1.3.27 (Unix)
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
ETag: "663c-1bcd-3fb70ffe"

里面有时间啊?难道是IE直接去缓存取了所以就不给时间?
好,修改下,If-Modified-Since这个选项不要了~~否则ie就跑去缓存去了就不给时间了,可是XMLHTTP好象没有删除选项头的方法~~只好修改吧~~
在xmlhttp.open这句后面加上:
xmlhttp.setRequestHeader("If-Modified-Since","q");  //"q"是我随便打上去的,因为改成了 "" 好像就不能正确执行了~~
再来测试下~~

Thu, 30 Mar 2006 05:53:47 GMT

哈哈~~成功了,看来我的猜测是正确的哦~

再有一个小问题就是这里得到的是GMT标准时间,我们想要我们所在时区的时间怎么办啊?有个简单方法:

var dateStr=xmlhttp.getResponseHeader("Date");
var d=new Date(dateStr);  //解析为Date对象
document.write(d);      //输出

得到 Thu Mar 30 13:43:36 UTC+0800 2006
ok,问题解决了。

代码现在是
[code]
<script>
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.3.0");
xmlhttp.open("GET", "http://时间服务器地址/", false);
xmlhttp.setRequestHeader("If-Modified-Since","q");
xmlhttp.send();
var dateStr=xmlhttp.getResponseHeader("Date");
var d=new Date(dateStr);
document.write(d);
</script>
[/code]
代码中的 时间服务器地址 可以替换为一个速度比较快的,比较官方的HTTP服务器,例如 [url]WWW.163.COM[/url] 呵呵。当然如果你改成一个开了WEB服务的标准时间服务器就更好了.

不过还有一点小问题就是这个脚本是同步的,一直等到收到时间服务器的返回信息后才继续执行,所以……可以修改成异步方式的,
就留给读者自己修改吧,呵呵。相关资料可以去[url]http://www.xmlhttp.cn/[/url] 查询。

页: [1]
© 1999-2008 EvilOctal Security Team