https时代深入理解document.referrer用法

2019-09-25JavaScript4191
  • 详情内容

在JavaScript中,document对象有很多属性,其中有3个与对网页的请求有关的属性,它们分别是URL、domain和referrer。
URL属性包含页面完整的URL,domain属性中只包含页面的域名,而referrer属性中则保存着链接到当前页面的那个页面的URL。
前面两个很好理解,而referrer属性简单来说就是上一个页面的URL。那么这个属性具体有什么用处呢?

Document.referrer 返回 跳转或打开到当前页面 的页面的 URI。如果用户直接打开了这个页面(不是通过页面跳转,而是通过地址栏或者书签等打开的),则该属性为空字符串。由于该属性只是返回一个字符串,所以不能够通过该属性引用页面的 DOM。

浏览器支持情况

关于HTTPS请求
如果在一张普通的HTTP页面上点击了HTTPS的链接,那么在https请求头部可以附上Referer信息,之后在HTTPS页面中依然可以用document.referre来获得普通的http页面。

同样,如果是在一张https页面上点击了另一个HTTPS的链接,可以在请求的头部附上Referer信息。

但是如果是从一张https页面点击了http链接,那么很不幸,发送的http请求头里无法包含关于https页面的信息,这可能是出于一种对https页面的保护措施。
伪造Referer信息
根据上文的描述,document.referre源自于Header中的Referer。那么如果想修改document.referre的值,理论上讲,仅需要修改请求Header。可以将Header中现有的Referer替换成自己想要的值,如果原来没有也可以添加Referer。

在客户端,篡改Header是一件非常容易的事情。在一个页面的http请求发出去之前,可以利用截包工具将其拦截,然后分析出头部信息,并且修改Referre。

搜了一下,对于FireFox可以使用RefControl插件方便的进行修改。总之,欺骗Traffic source是轻而易举的事情。

从https跳转到http网站时,为了用户隐私安全信息,浏览器默认不传送referrer。

解决方式:在https页面中添加meta标签

<meta content="always" name="referrer">

当然如果A站强制规定不发送referrer,B站又没有对A站的控制权,那么我们将无法获取到referrer。

页面强制Refresh

<meta http-equiv="Refresh" content="5;URL=a.html">

过5秒后浏览器会自动向server发起a页面请求,经过测试,在IE8,FF3.6-FF4.0中,均不会带有Referer信息,但是chrome却能够鬼使神差的把b.html作为Referer添加进头部。

几种意外丢失情况:
1,直接在浏览器中输入地址
2,使用location.reload()刷新(location.href或者location.replace()刷新有信息)
3,在微信对话框中,点击进入微信自身浏览器,
4,扫码进入微信或QQ的浏览器
5,直接新窗口打开一个页面
6,从https的网站直接进入一个http协议的网站(Chrome下亲测),
7.a标签设置rel="noreferrer"(兼容IE7+)
8,meta标签来控制不让浏览器发送referer
9,点击 flash 内部链接
10,Chrome4.0以下,IE 5.5+以下返回空的字符串,使用 修改 Location 进行页面导航的方法,会导致在IE下丢失 referrer,这可能是IE的一个BUG
11,跨域
12,iframe隐藏

最后,一个简单的结论是:如果你需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转。referrer 的作用:
1,统计来源,可以统计数量,可以拒绝访问
2,返回上一页逻辑判断

相关内容