您的位置:首页 > 其它

后端必备知识链盗&&链盗防止

2020-08-10 11:40 337 查看

链盗

在实际开发中,经常会使用Referer 头字段,例如,一些站点为了吸引人气并且提高站点访问量,提供了各种软件的下载页面,但是它们本身没有这些资源,只是将下载的超链接指向其他站点上的资源。而真正提供了下载资源的站点为了防止这种“盗链”,就需要检查请求来源,只接受本站链接发送的下载请求,阻止其他站点链接的下载请求。接下来通过一个案例,分步骤讲解如何利用Referer请求头防止“盗链”。

先写一个DownMangerServlet类

package com.tomcat.servlet;

import javax.servlet.RequestDispatcher;
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;
import java.io.PrintWriter;
@WebServlet("/down")

public class DownManagerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
String referer = req.getHeader("referer");   //获取referer头的值
String sitePart = "http://"+req.getServerName();   //获取访问地址
if (referer == null&&referer.startsWith(sitePart)){     //处理下载请求
out.print("处理中 .......");
}else {
RequestDispatcher rd = req.getRequestDispatcher("/download.html");
out.print("正在去下载。。。。");
//非法下载返回到download.html页面
}
}

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

HTML代码部分

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Download</title>
</head>
<body>
<a href="/down">Download</a>

</body>
</html>

1 2

运行原理

  • 图1是对应的download.html界面内容,这是因为第一次请求DownMangerServlet类时,请求消息不含refeer请求头,所以,DownMangerServlet将下载时请求转给download.html页面
  • 单击download连接后,重新访问DownMangerServlet,这时,由于请求状态消息中含有referer头字段,并且其值与DownMangerServlet位于同一个服务器web站点,因此DownMangerServlet接受下载请求,浏览器如图2所示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: