我的微信公众号:前端实践之路,欢迎关注。前言前几天使用form表单提交消息,发现一个奇怪的问题。留言板有一个source字段,用来获取网页的地址。测试时发现,在谷歌Chrome浏览器中,可以正确获取URL的来源,然后用火狐浏览器无法正确获取URL的来源。因为后台使用了PHP,所以消息成功后,会通过JS弹出alert提示框,然后通过location.href跳回消息页面。所以后台需要准确获取消息页面地址,但是后台没有正确获取消息页面地址。为什么会这样呢???对比了Chrome和Firefox浏览器,在后台查看了源码,才知道是通过$_SERVER["HTTP_REFERER"]PHP变量获取的。然后我去查PHP文档,找到了HTTP_REFERER变量的文档:Guidetheuseragenttotheaddressofthepreviouspageofthecurrentpage(ifitexists)。由用户代理设置确定。并不是所有的用户代理都会设置此项,有的还提供了修改HTTP_REFERER的功能。简而言之,价值不能被信任。去百度百科看到如下内容:HTTPReferer是header的一部分。浏览器向Web服务器发送请求时,通常会带上Referer,告诉服务器该网页是从哪个页面链接过来的。服务器因此可以获取一些信息进行处理。从上面的讨论,我们可以得出以下结论:http_referer是由浏览器产生的,并不是所有的浏览器都会设置这个值。http_referer可以伪造并且不受信任。通过谷歌和火狐浏览器自带的调试工具,可以看到HTTP请求头信息。从上图中可以发现,在Chrome浏览器中请求头中的Referer地址是详细的页面地址信息,而在Firefox浏览器中请求头中的Referer地址,只是显示了域名信息。会不会是火狐浏览器设置的问题?于是又去Stackoverflow上查了一下。从上图我们可以得出两个结论:HTTP_REFERER这个变量确实不可信。火狐浏览器允许用户修改该字段,那么如何在火狐浏览器中修改该字段呢?在火狐浏览器中输入about:config,然后搜索network.http.send,找到network.http.senRefererHeader,将该字段的值改为0,浏览器将禁止发送refer信息。HTTP_REFERER的用途HTTP_REFERER提供将用户代理定向到当前页面的上一页的地址信息。一些常见的应用场景包括:统计文章来源。比如有多少次来自谷歌搜索结果,有多少次来自百度搜索结果等等。图片防盗链。不是自己站点访问,图片显示404等。如果你经常写博客,你肯定会遇到网站盗用你辛辛苦苦整理的文章,而且不跟你打招呼,甚至连原链接都删掉。文字的高低我们无法控制,但是图片的高低我们是可以控制的。比如你从腾讯等网站上复制了一些文章,你会发现粘贴发布后图片经常无法显示。你怎么做到这一点?场景:a站点的所有图片都存储在c站点(云服务器),c站点会识别调用者是否来自a站点,否则会显示错误图片,b站点是盗图网站。a站和b站的代码是一样的,如下图:
