飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

绝招:用js对抗referer来路伪造

Author:flymorn Source:飘易
Categories:网站设计 PostTime:2009-9-22 11:55:53
正 文:
    众所周知,服务器端的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记住用户信息》这篇文字。
作者:flymorn
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:国庆武夷山之游
下一篇:查询搜狗SR的插件(傲游2)
15条评论 “绝招:用js对抗referer来路伪造”
2009-9-24 9:55:15
这是个好方法。
2 Axpwx
2009-11-6 21:40:07
你说的方法根本就不可能实现,
我问你,怎么把js得到的referer传给后台脚本?
通过cookie?笑话,修改cookie比伪造referer更简单!
3 APMPA
2009-12-18 14:55:34
没办法对抗,你的命题错了
连HTTP包都能伪造了,难道你的js能够用其他的方式告诉你的PHP/ASP程序?
4 Axpwx
2010-1-9 19:43:29
呵呵,哥们,不好意思,我还得打击你一下。
就算你用ajax传给后台脚本来生成session,还是不可行的。
因为这个操作的前提你还是信任了来自客户端的东西,比如你想用ajax传给后台123,但是我修改成456传给你后台,那你不就认为这是456了吗?
总之一句话,“任何”来自客户端的东西都不可信,任何信任了来自客户端的东西都是疏漏,即使你绕一百一千个弯。
5 123456
2010-2-2 17:18:38
Axpwx的话:『,“任何”来自客户端的东西都不可信,任何信任了来自客户端的东西都是疏漏,即使你绕一百一千个弯。』

这是一个半伪命题。
如果不信任客户端,那么web程序将无法接受任何可信任的数据。因为web跟用户交互的数据必然来自客户端。

说半伪是因为,你还是可以展示给客户看的,因为客户对你的访问你必须信任。
6 晕死
2010-4-6 10:51:23
绝招。。。绝顶昏招吧。。。
7 driftcloud
2010-6-9 10:42:28
js写入cookies,asp/php读取这个cookies....

汗,LZ难道认为这个也能实现?
8 driftcloud
2010-6-9 10:44:25
还有,document.referer其实本身就是不准确的。。。而且是非常不准
9 frank
2010-6-15 9:39:21
我觉得,也是不错,起码多了一道坎,可选择的多了
10 jzh
2010-9-24 11:15:33
怎么说呢,如果是一般的http请求是可以做到如 hark_key=hark_backurl传递 form表单用hidden控件,get网页用get参数,ajax当然也行,不是说客户端不可信,而是客户端与服务器要一个密钥,有了密钥客户端是可信的,除非这个密钥别人知道了

如我一个网站中的backurl参数是这么提交的
<input type='hidden' name='b_tmp85f7ca985b08483b78a51edac8c0c312' value='bXlmaWxlcw==' />    
也行你破的出value是什么值,但是永远也破不出 name的值,所以这个name值可以安全的给服务器端
11 jzh
2010-9-24 11:16:44
input type='hidden' name='b_tmp85f7ca985b08483b78a51edac8c0c312' value='bXlmaWxlcw=='
12 newnotion
2010-10-25 18:14:30
明知道服务端判断是可以伪造的,你通过什么方式把JS的传给服务端??COOKIES,这招不是更昏?
10L的搞个隐藏input有P用,采集或直接看源代码不是一样知道NAME值,典型的掩耳盗铃
13 :-)
2012-6-25 15:34:27
我以为是什么绝招呢, 绝对标题党
14 neil
2012-7-9 1:38:35
我也说两句吧,我这两天一直研究怎么伪造这个来路,用hook方法把send里的referer改了,可是还不行,看到你这篇文章,还有评论,任何数据都必须通过socket这个通道发送到服务器端,所以我就在send里把所有相关来路的信息全改了,结果51la,cnzz都通过了。我在想,如果第三方统计加密个这来路信息呢,怎么办,但想想,加密他也得有个js来加密吧,按这个js加密的方法,加密相关来路信息,再修改这个信息,也是可以做到的,所以有位网友说的任何密户端的东西都是不可信的,我觉得有道理,就算用控件来获取,直接加密,也是一样可以破解的,QQ的协议不就有破解的么?
2012-9-19 14:26:32
js下是无法伪造 referer 的...
哎,兄弟,,你太外行了,,我用的那个工具智动终极刷IP,就是伪造这个发数据包的,,
你应该说用ie空间伪造这个比较困难,,说不可能伪造太极端了,,浏览器都是人造出来的,哪有什么不可以伪造,,,
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2010 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有 渝ICP备07006361号