正 文:
众所周知,服务器端的referer来路是可以伪造的,无论是ASP、PHP还是其他脚本都是可以伪造referer的,一些下载软件更是把referer伪造的惟妙惟肖,利用webbrowser控件可以方便的伪造来路。那么,作为保护网站的守门人,我们又应该如何防止这些伪造的referer呢?
这里,飘易要隆重地推出 Javascript 这一利器。
上面,飘易提到的伪造referer的方法都是通过服务器端的脚本来实现的,但它们并不能欺骗客户端。而JS是在客户端执行的,它并不会理会服务器端的headers信息,所以,利用js的
document.referer 方法可以准确地判断网页的真实来路。
几乎所有的第三方统计不约而同地采用了
document.referer 来判断来路,为什么?正是基于 js 下的 referer来路 是不可伪造的。即使在服务器端成功地伪造了referer的网页脚本,在第三方统计里也是无法被统计到的,原因正是由于这些三方统计采用了 document.referer 来判别真实的来路。
所以,为了对抗虚假的 referer 伪造信息,我们只需要利用 js 的 document.referer 来判别,就可以将伪造的信息拒之门外,从而更好的保护站内资源。
据飘易所知,目前为止,js下是无法伪造 referer 的。
PS(2010-1-9): 命题错误。此话题不再深入讨论。任何客户端的东西均不可太信任,只做辅助判断即可。下面的内容大家可以忽略。只要是客户端的来路,我可以伪造任意来路,道高一尺魔高一丈。 那么有人问了,如果客户端把JAVASCRIPT脚步甚至cookies关闭了,你还怎么判断这个referer?其实答案也很简单,就是 js 和 asp/php 脚本之间通过 操作cookies 这个中间桥梁来实现,js里把这个referer写入cookies,asp/php读取这个cookies,如果读取不到这个cookies,则判断非本站来路。
PS(2009-11-6): 有网友
Axpwx在评论里说,此法不可行。飘易思考了下,Axpwx说的有道理,cookies是客户端的东东,本身也是可以伪造的,所以在后台判断这个cookies也是不安全的。但稍微转换一下思路就可以了,我们可以利用js通过AJAX的方法操作session来实现同样的判断。
关于js下操作cookies的文章,参考《
静态页面利用JS读取cookies记住用户信息》这篇文字。
你说的方法根本就不可能实现,
我问你,怎么把js得到的referer传给后台脚本?
通过cookie?笑话,修改cookie比伪造referer更简单!
没办法对抗,你的命题错了
连HTTP包都能伪造了,难道你的js能够用其他的方式告诉你的PHP/ASP程序?
呵呵,哥们,不好意思,我还得打击你一下。
就算你用ajax传给后台脚本来生成session,还是不可行的。
因为这个操作的前提你还是信任了来自客户端的东西,比如你想用ajax传给后台123,但是我修改成456传给你后台,那你不就认为这是456了吗?
总之一句话,“任何”来自客户端的东西都不可信,任何信任了来自客户端的东西都是疏漏,即使你绕一百一千个弯。
Axpwx的话:『,“任何”来自客户端的东西都不可信,任何信任了来自客户端的东西都是疏漏,即使你绕一百一千个弯。』
这是一个半伪命题。
如果不信任客户端,那么web程序将无法接受任何可信任的数据。因为web跟用户交互的数据必然来自客户端。
说半伪是因为,你还是可以展示给客户看的,因为客户对你的访问你必须信任。
js写入cookies,asp/php读取这个cookies....
汗,LZ难道认为这个也能实现?
还有,document.referer其实本身就是不准确的。。。而且是非常不准
怎么说呢,如果是一般的http请求是可以做到如 hark_key=hark_backurl传递 form表单用hidden控件,get网页用get参数,ajax当然也行,不是说客户端不可信,而是客户端与服务器要一个密钥,有了密钥客户端是可信的,除非这个密钥别人知道了
如我一个网站中的backurl参数是这么提交的
<input type='hidden' name='b_tmp85f7ca985b08483b78a51edac8c0c312' value='bXlmaWxlcw==' />
也行你破的出value是什么值,但是永远也破不出 name的值,所以这个name值可以安全的给服务器端
input type='hidden' name='b_tmp85f7ca985b08483b78a51edac8c0c312' value='bXlmaWxlcw=='
明知道服务端判断是可以伪造的,你通过什么方式把JS的传给服务端??COOKIES,这招不是更昏?
10L的搞个隐藏input有P用,采集或直接看源代码不是一样知道NAME值,典型的掩耳盗铃
我也说两句吧,我这两天一直研究怎么伪造这个来路,用hook方法把send里的referer改了,可是还不行,看到你这篇文章,还有评论,任何数据都必须通过socket这个通道发送到服务器端,所以我就在send里把所有相关来路的信息全改了,结果51la,cnzz都通过了。我在想,如果第三方统计加密个这来路信息呢,怎么办,但想想,加密他也得有个js来加密吧,按这个js加密的方法,加密相关来路信息,再修改这个信息,也是可以做到的,所以有位网友说的任何密户端的东西都是不可信的,我觉得有道理,就算用控件来获取,直接加密,也是一样可以破解的,QQ的协议不就有破解的么?
js下是无法伪造 referer 的...
哎,兄弟,,你太外行了,,我用的那个工具智动终极刷IP,就是伪造这个发数据包的,,
你应该说用ie空间伪造这个比较困难,,说不可能伪造太极端了,,浏览器都是人造出来的,哪有什么不可以伪造,,,