URL(Universal Resource Locator通用资源定位器)是我们上网最常用到的东西之一,例如我们访问的网页地址http://www.ttian.nett/index.html就是一个URL形式,但是我们同样可以通过http://ttian@3546011754/index.html来访问这的一个页面!
上面第二种奇怪的表示方法只是利用了一些不为人熟知的关于URL构造的知识!眼睛看到的往往并不是最真实的,这仅仅是敲巧用了关于网络地址表达方式的某些约定而造成的!而这些奇怪的URL往往用于那些广告邮件中,或者用在某些不希望被人看到真实确切网址的地方!在这里,我就将这些编码技巧拿出来与大家分享:)
(注:根据浏览器型号和版本的不同,本文中某些特殊URL可能会不起作用;如果你使用代理或者通过局域网上网它们也很可能不起作用,当然不必担心,本文中的特殊网址不会引发某些版本IE的"Dotless IP Address"漏洞,而早造成浏览器中断)
关于编码方式:
再一次,我们引用http://ttian@ttian.net/index.html为例!
首先,我们发现在这个全数字的URL中出现了一个"@"符号。事实上,在"http://"和"@"间的所有字符都是不起任何作用的!例如:http://doesn'tmatter@ttian.net/index.html和http://!$^&*()_+`-={}|[]:;@ttian.net将访问到同样的一个网页! 这个特性事实上是用在登陆认证上的。如果在访问一个页面需要提供用户名和/或密码,那么插入到"http://"和"@"之间,如:http://username:password@www.whatever.com/secret.html
当然如果这个网页需要生分验证,那么按照这个形式访问的网页将被自动打开但是如果网页并不需要生分验证,那么这个认证信息将被同时被浏览器和服务器忽略!用这种方式导愚弄某些易于轻信表象的人,如http://www.playboy.com@ttian.net/index.html,如果你没有深入的理解,你可能会认为,这是playboy.com网站:)当然,"@"符号可以用它的HEX(十六进制形式)表示"%40",这就更具有迷惑性!不过这种方式仅仅可用于IE浏览器,而在Netscape中是无效的!好,接下来,我们来看看后面那一串数字表示的什么?为什么3546011754就可以把我们带到www.ttian.net呢?
事实上,这两者都相当于另外的一个东西IP!在这里需要一些解释,请耐心阅读:)首先,你需要知道的是 ,任何一个URL都通过DNS服务器转换成数字形式的IP地址.一个IP通常都被表示成加点十进制格式,如www.ttian.net被转换成211.91.216.106,但是这种数字IP形式往往是不便于人们记忆的,这就是我们为什么用域名代替IP地址来进行网络访问,然而从域名到IP的转换对于用户来说,是完全透明的,这就免除了许多无谓的麻烦!BUT,还有另外的一种方法来表达这种IP形式!这就是双字节形式--它本质上是由两个16位(bit)的二进制字组成表示的,但是,它以十进制的形式表示出来(base 10);"octal"--表示以八进制的形式表示出来(base 8);"hexadecimal" 表示以十六进制的形式表示出来(base 16);然而211.91.216.106的十六进制表示形式就是3546011754.
但是,我们为什么要把URL改的隐晦难懂呢?这是因为通过公众注册记录,域名的所有者很容易被识别,甚至在拥有者不可被跟踪的情况下!广告商最不愿看到的就是被它的被传播者所识别,否则将他将因为域名的滥用而受到他网络提供商的警告.
下面,我就解释一下怎样得到任何一个域名的IP地址,怎样将IP地址转换成双字节形式,以及八进制和十六进制!
好了,至于URL的余下部分呢,让我们再来看看那个怪异的例子:http://ttian@3484559912/index.html 怎么样,比刚开始见到这个东西的感觉好多了吧:)但究竟这是如何转换的呢?
URL中的每一个字符都可以被十六进制的数字表示.每一个十六进制数字都以一个"%"开头用来将接下来的两位(字母/数字)识别成特定字符的十六进制的形式.他最实用的价值是包含更多的空间和不寻常的字符.在本例中,我用十六进制表示URL,"/obscure.htm" 可以被表示为
/ %69 %6e %64 %65 %78 %2e %68 %74 %6D %6c
对应于/ i n d e x . h t m l
在十六进制表示法中字母的大小写是通用的.然而URL中的符号"/"不能表示成十六进制,而且IP也不能用这种编码方式表示,其他的都可以.
关于十六进制码:
十六进制码是很简单的将字符所对应的ASCII码转换成十六进制,事实上这种表示法可以包含所有计算机文本!为了找到ASCII码。我们可以查找一些已经做好的对换表,如C语言教材的附录里一般都有。不过我也可以教个常用方法,就是A对应65,a对应97,后面的字母依次类推.
关于IP地址:
IP地址最常写成加点十进制形式,此种IP通常有4组数字段,并以"."分隔开,每段数字都在0 到255之间.域名到IP的转换通常是通过网络软件在后台运行的,用户是不可见的!给出一个域名,你的浏览器就向仪态服务器查询,然后获得域名对应的IP,再通过该IP直接与该web站点通信.有一个标准公用程序(nslookup.exe),能够向用户展示域名查询结果.这个命令可以在命令行中运行,格式如nslookup [name or IP address] [name server]
这是一个很有用的程序,他能够提供IP到域名,及域名到IP的转换,常用于测试DNS服务器的配置是否正确.另外,关于IP的另一个有趣的事情是http://467.374.472.362同样可以访问到http://211.91.216.106(限IE),这是因为,通常每段数字都在0到255,其本质是取8位二进制数字,这样,463就超出了一个字节的存储空间,进而进入以十进制256问倍数的二进制累加循环,所以我可以加256的任何倍到默认IP的一段上,而不改变其真实值!但是最大不能超过999的3位限制!
关于IP到Dword的转换:
在这里,我们运用WINDOWS自带的计数器,并开启它的科学计算功能,以211,91,216,106到3546011754为例,先分别将十进制的206,169,40,2转换成十六进制的d3,5b,d8,6a,再将d3,5b,d8,6a以十六进制的双字节的形式写如计数器,再转换成十进制,就可以得到3546011754.事实上,在平常运用中,我们常用的方法是这样的:
211 x 16777216 = 3539992576
91 x 65536 = 5963776
216 x 256 = 55296
+ 106 x 1 = 106
--------------------------------
3546011754
与IP的256倍数叠加一致,3546011754也可以以4294967296的倍数叠加!至此,IP的转换已经完成!
关于IP与八进制及十六进制的转换:
虽然已经知道了Dword的转换,但是还远远不够,因为IP同样可以被转换成八进制和十六进制!对于八进制,我们仅仅只要将各段IP分别转换成八进制,然后再在各段IP前加上一个"0(零)"即可,如211,91,216,106被转换成0323,0133,0330.0152.对于十六进制,如八进制的转换,在这里,不同的仅仅是在开头处加上"0(零)x",成为0xd3.0x5b.0xd8.0x6a,而且此处小数点是可以省略的而成为0xd35bd86a,而且与上述的倍数叠加原理相同.
讲了这么多,归纳起来,有以下几种方式访问http://www.ttian.net/index.html
http://user:pwd@3546011754/index.html --可加上4294967296的整数倍
http://user:pwd@0323.0133.0330.0152/index.html --各字段前可加数个"0"
http://user:pwd@0xd3.0x5b.0xd8.0x6a/index.html
http://user:pwd@0xd35bd86a/index.html --可在"0x"后加上任意字符
而且以上的/index.html 均可换为/%69%6e%64%65%78%2e%68%74%6D%6c
到现在,大家是不是觉得URL的可信度很低,甚至在一个URL面前不知所措,其实decode的方法很简单,就是PING,得到的肯定是真实IP:)
注:在IE不同版本和中有可能无法使用! 以上示例均在IE5.0 @ win98 并在WINGATE代理上网的情况下成功测试.