【JavaWeb开发】Referer防盗链的详解

1. 什么是Referer?

RefererHTTP 请求(requset) header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里就有包含 Referer
比如我在www.csdn.net里点击一篇博客,那么点击这个博客,它的header信息里就有:

Referer=https://www.csdn.net/

如下图:request header有这么一行(从浏览器的开发者工具->NetWork->Header中看)
在这里插入图片描述
简单来说:Referer就是当前页面的上一页面
那么就可以根据Referer来判断你的页面是不是被盗取了,被另外一方的网站引用了。

小彩蛋:RefererReferrer的错误拼写,但HTTP/1.0 协议当时拼错了发现晚了,已经被大量使用,如果要改过来需要所有服务端、客户端的一致配合,还有大量的代码需要排查修改。于是,HTTP的标准制定者们决定将错就错,不改了。到今日,搜索Referer这个单词,发现解释也是跟Referrer一样的解释了,广为流传变成正确的了。

2. 为什么使用Referer?

防盗链

举个例子:
一个正版网站:www.163.com;其中有个页面是www.163.com/new.html
一个盗版网站:www.361.com;其中有个页面是www.361.com/new361.html
而盗版网站的链接有的是偷取的正版网站的链接,据为己有,这时候如果设置了防盗链就会被拦截,转到服务器想让它到的地方。
如图:
在这里插入图片描述

3. 什么是空Referer?

3.1 空Referer的定义(Referer="" || Referer=null):

  1. Referer 的内容为空;
  2. 一个 HTTP请求中根本不包含 Referer

3.2 什么时候 HTTP请求会不包含 Referer 字段呢?

Referer 代表的是上一个页面(请求地址),如果上一个请求地址是没有的,那么Referer 自然也是空的。

3.3 那么如何办到上一个页面是空的呢?

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

3.4 允许空Referer和不允许空Referer有什么区别?

  1. 允许 Referer 为空,意味着你允许浏览器或者重定向直接URL访问资源。
  2. 不允许为空,那么直接输入URL访问会被拦截。

4. 如何使用Referer?

情景模拟:(本例子在tomcat9环境下,低版本乱码请看本人另一篇博客解决:Servlet乱码解决)

4.1 建立一个山寨网站,盗取链接:

1.在d盘建立一个文件夹shanzhai(名字随意),再建立一个ROOT文件夹(一定大写),再其中写一个山寨网页
在这里插入图片描述
2.山寨内容(注意我的tomcat端口是8081,默认8080)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我是山寨网站www.361.com</title>
</head>
<body>
	<h1>我是山寨网站www.361.com</h1>
	<hr />
	<p>我是广告1</p>
	<a href="http://localhost:8081/RefererServlet">武汉加油!中国加油!</a>
	<p>我是广告2</p>
</body>
</html>

3.给山寨网站取一个域名www.361.com,到tomcat目录下/conf/server.xml中Engine标签内添加

<Host name="www.361.com" appBase="D:\shanzhai" />

在这里插入图片描述
4.到C:\Windows\System32\drivers\etc中修改hosts文件,在其末尾添加(代表访问www.361.com还是在访问本机哦)

127.0.0.1 www.361.com

4.2 建立一个web服务:一个Servlet和两个页面(Servlet3.0环境下)

1.web项目添加Servlet:RefererServlet(这个就是防盗链的控制器)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/RefererServlet")
public class RefererServlet extends HttpServlet {
    private static final long serialVersionUID = 7883076061572095135L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //获取HTTP header中的Referer
        String referer=request.getHeader("Referer");
        //判断Referer是否符合标准:不允许直接URL访问;不允许除了前缀http://localhost:8081的其他页面访问
        //我的tomcat的端口是8081,默认8080
        if (referer==null || "".equals(referer)|| !referer.startsWith("http://localhost:8081")){
            //不符合标准的送去官网
            response.sendRedirect("QQnews.html");
            return;//退出Servlet
        }
        //符合标准进入链接页面
        request.getRequestDispatcher("chinaNO1.html").forward(request,response);
    }
}

2.web项目添加正版网站页面和新闻内容页面
正版网站:腾讯新闻

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>腾讯新闻</title>
</head>
<body>
    <h1>腾讯新闻</h1>
    <hr />
    <p>我是广告1</p>
    <a href="RefererServlet">武汉加油!中国加油!</a>
    <p>我是广告2</p>
</body>
</html>

中国加油页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>武汉加油!中国加油!</title>
</head>
<body>
<center>
    <h1>武汉加油!中国加油!</h1>
    <hr />
    <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586511481911&di=ef37659dc6514450199730b2668aa0e5&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200226%2F0f8382216d03487bb5aaf787e8ef8e51.jpeg" />
    <p>武汉加油,中国加油!</p>
    <p>天佑中华,众志成城,共渡难关!<br />
        风雨过后一定有彩虹!武汉加油!中国加油!灾难我们一起面对,一起承受!<br />
        一定能打赢这场没有硝烟的战争!
    </p>
</center>
</body>
</html>

4.3 开始测试(启动web服务)

1.打开盗版网站www.361.com:8081/ShanZhai.html (注意端口号和大写)
在这里插入图片描述
2.访问武汉加油,发现跳转到正版新闻主页了,防盗链判断无法通行,拦截并跳转,发挥作用!
在这里插入图片描述
3.在主页访问武汉加油,防盗链判断可以通行
在这里插入图片描述

5.总结:

Referer是Http Header中的一个字段,它代表是的上一次的请求链接,我们在Servlet控制器中可以对其进行判断,使用startsWith()方法限制Referer必须由本项目(域名)才能直接访问所属页面,其他请求将被跳转到你指定的页面。
Referer为空代表:直接URL输入网址请求资源或者重定向请求资源等等(等读者自行发掘哦)
Referer防盗链只能防止基础的偷取页面链接,并不是万能的,通过java可以伪造HTTP请求,继而仍能成功盗链。

本文参考:
javaweb之request获取referer请求头实现防盗链
ServletRequest实现的防盗链问题
什么是Referer?Referer的作用?空Referer是怎么回事?
如果对小伙伴们有所帮助,欢迎点赞评论支持作者的创作热情~

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值