Referer与noreferrer

浏览器在访问互联网资源的时候,为了告诉当前请求的资源服务器,当前资源的请求来源,会使用referer,这样当前资源服务器就能够根据请求的来源决定如何处理当前请求。随着时间推移,Referer的应用也越来越广,比如当下最流行的访问统计中,就需要用到Referer来统计页面来源;资源站也会使用Referer来进行资源的防盗链。

这么看起来Referer真是个不错的东西,这么有用,得好好发挥发挥! 且慢!得补充一下,防盗链如果单纯用Referer已经没有办法阻止我们了,因为,他是可以伪造的。怎么伪造?Google会告诉你的,这按下不表。

这里想说另外一个问题,既然浏览器会将资源的请求来源附带上,那么,就很有可能会产生问题。比如用户是在一个私密网站上看到的某个资源信息,它在不确认的情况下链接到了新的资源地址,浏览器此时就将私密的网站地址毫无保留的送到了新资源服务器上。Referer,这时候就对私密网站/用户的安全产生威胁,这是我们不希望看到的。

然而,要让用户了解到每个资源的危险性显然是不太可能,因此最好的办法是私密网站提供者将这个问题处理妥善。幸好,这不是一个很难办到的事情。我们只需要在私密的网站和新资源的中间插入一个桥接页面,就能比较妥当的将私密网站和未知的资源服务器隔离开来。 —— 眼熟? 是的,当前很多网站都是用这个方法来处理的。下面是简单的演示下桥接页面的处理方式:

<script type="text/javascript">
<-- //手写,可能会有误
var r, tmpa qs=location.search.split("?")[location.search.split("?").length - 1].split("&");
for(var i=0;i<qs.length;i++){
    tmpa = qs[i].split("=");
    if(tmpa[0] === "ref"){
        r = unescape(tmpa[1]);
    }
}
if(r){
    location.href = r; // 这里可以根据需要,改成任何跳转方式,这里只是简单的演示
}
else{
    // do some thing here.
}
//-->
</script>

但这样的桥接页面总是显得很Ugly,但好消息是,在标准的HTML5代码中,我们能有个更好的方法来处理这个问题:

<!--HTML5中提供的新属性/值,这个是不是很眼熟-->
<a href="another-site-resource" rel="noreferer">站外链接</a>

 这个比上面的桥接简便了很多。

Monday, November 12, 2012 | HTML&HTML5 Javascript(s)

文章评论

No comments posted yet.

发表评论

Please add 2 and 2 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。