什么是Referer?Referer的作用?空Referer是怎么回事?

JSON 2016-08-22 18:06:47 130185

什么是Referer?

Referer  是  HTTP  请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含  Referer  。比如我在www.sojson.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:

    Referer=https://www.sojson.com

由此可以看出来吧。它就是表示一个来源。看下图的一个请求的 Referer  信息。




这里有一个小问题要说明下。

Referer  的正确英语拼法是referrer 。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一。还有它第一个字母是大写。


Referer的作用?

1.防盗链。

刚刚前面有提到一个小 Demo 

我在www.sojson.com里有一个www.baidu.com链接,那么点击这个www.baidu.com,它的header信息里就有:

Referer=https://www.sojson.com

那么可以利用这个来防止盗链了,比如我只允许我自己的网站访问我自己的图片服务器,那我的域名是www.sojson.com,那么图片服务器每次取到Referer来判断一下是不是我自己的域名www.sojson.com,如果是就继续访问,不是就拦截。

这是不是就达到防盗链的效果了?

2.防止恶意请求。

比如我的SOJSON网站上,静态请求是*.html结尾的,动态请求是*.shtml,那么由此可以这么用,所有的*.shtml请求,必须 Referer  为我自己的网站。

Referer=https://www.sojson.com

空Referer是怎么回事?什么情况下会出现Referer?

首先,我们对空 Referer  的定义为, Referer  头部的内容为空,或者,一个 HTTP  请求中根本不包含 Referer  头部。

那么什么时候 HTTP  请求会不包含 Referer  字段呢?根据Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。

比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer  字段的,因为这是一个“凭空产生”的 HTTP  请求,并不是从一个地方链接过去的。

那么在防盗链设置中,允许空Referer和不允许空Referer有什么区别?

允许 Referer  为空,意味着你允许比如浏览器直接访问,就是空。

如下图:

这就是空的 Referer 

拒绝空的 Referer  。比如我的www.sojson.com的静态资源都是拒绝空的Referer 的。如下图,我访问我的一个图片。



看到了吧,直接拒绝访问了,如果有同学在测试我网站的静态资源的时候,记住强制刷新Ctrl + F5 ,因为浏览器有缓存,可能你开始还是可以访问的。

当然。这个你不能完全依赖 Referer  来做一些事情,因为这个最容易伪造来源。

每个语言,都可以,比如 Java  来模拟一个 Httpclient  请求。并且伪造来源。


/**
 * 从工信部获取验证码
 * @param session
 * @param response
 */
public static void getVCode(HttpSession session,HttpServletResponse response){
	
	InputStream inputStream = null;
	ServletOutputStream outStream = null;
	try {
		 //获取登录框的隐含参数 type="hidden" name="_xsrf"  
	    HttpClient client = new HttpClient();
		client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");
		client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
		GetMethod method = new GetMethod("http://www.miitbeian.gov.cn/getVerifyCode");
		method.setRequestHeader("Connection","close");
		method.setRequestHeader("Host", "www.miitbeian.gov.cn");
		method.setRequestHeader("Referer", "http://www.miitbeian.gov.cn/icp/publish/query/icpMemoInfo_showPage.action");
		method.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0");
//		method.setRequestHeader("Cookie", (String)goon);
		client.executeMethod(method);
		Cookie[] cookies = client.getState().getCookies();
		String sid = "",uid="",goon="__jsluid=%s; JSESSIONID=%s";
		for (Cookie cookie : cookies) {
			String name = cookie.getName();
			String value = cookie.getValue();
			if("JSESSIONID".equals(name)){
				sid = value;
			}
			if("__jsluid".equals(name)){
				uid = value;
			}
		}
		goon = String.format(goon, uid,sid);
		//存储工信部Session信息
		session.setAttribute("goon", goon);
		
		inputStream= method.getResponseBodyAsStream();
		 //得到图片的二进制数据,以二进制封装得到数据,具有通用性  
	    byte[] data = CacheFindManager.readInputStream(inputStream);  
	    outStream = response.getOutputStream();
	    outStream.write(data);
	    outStream.flush() ;
	
	} catch (Exception e) {
		LoggerUtils.error(BeianGovManager.class, "获取验证码出现异常。", e);
	}finally{
		try {
			inputStream.close();
			outStream.close();
		} catch (IOException e) {
			LoggerUtils.error(BeianGovManager.class, "获取验证码后,关闭流出现异常,请忽略!", e);
		}
	}
}

好了,就这样吧,有疑问,加群@soso,或者下面留言。知无不言言无不尽。


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/58.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Description的作用,Description对SEO有什么影响
whois查询是什么?它有哪些作用
dns污染怎么解决?为什么会出现这种情况?
日期计算器怎么使用
日期计算器的计算原理是什么
怎么合理管理、提高Javascript的性能
什么是时间戳?轻松带你认识时间戳
JSON是什么?它能带来什么?它和XML比较?
网站如何设置404页面、500等错误页面,有什么漏洞?怎么预防?
条形码生成是什么原理(详细解答)
最新文章
PHP if/else/elseif 语句 32
HTML5 Canvas弧线教程 32
Java赋值运算符 112
XML内部实体和外部实体 201
Java面向对象编程概念 177
PHP回显语句 118
Linux—文件树 116
C语言while循环和do while循环 132
Python元组剖析 209
MySQL触发器教程 342
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 682452
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 674741
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 602512
免费天气API,天气JSON API,不限次数获取十五天的天气预报 578817
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 553017
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 509436
Elasticsearch教程(四) elasticsearch head 插件安装和使用 480066
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 264786
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244332
Elasticsearch教程(一),全程直播(小白级别) 225657
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...