• 利用Referer请求头阻止"盗链"


    转自:http://wisdomsong2007.blog.163.com/blog/static/47783725200882523820664/

    前言

          有一些站点自己没有提供下载空间,但是为了吸引人气和提高站点的访问量,他们也提供了各种软件的下载页面,并让下载的超链接指向其他站点上的资源。另外一些真正提供了下载空间的站点为了防止这种“盗链”,需要检查请求的来路,只接受本站内的页面链接进来的下载请求,而阻止其他站点的页面链接进来的下载请求。要实现这样的功能,就需要检查请求消息的referer头字段是否与本站匹配。

    内容

    动手体验:利用Referer请求头阻止“盗链”

    (1)编写一个名为DownManagerServlet的Servlet程序,这个Servlet程序负责提供下载内容,但它要求下载请求必须通过本站的下载页面链接进来,否则将请求转发给本站的下载说明页。

    1. DownManagerServlet.java

    package com.horizon.servlet;
    
    import java.io.*;
    
    import javax.servlet.*;
    
    import javax.servlet.http.*;
    
    public class DownManagerServlet extends HttpServlet {
    
        private static final long serialVersionUID = -6169822662725860603L;
    
        public void service(HttpServletRequest request,    HttpServletResponse response) throws ServletException, IOException {
    
            response.setContentType("text/html ;charset=gb2312");
            PrintWriter out = response.getWriter();
            String referrer = request.getHeader("referer");
            String sitePart = "http://" + request.getServerName();
            if (referrer != null && referrer.startsWith(sitePart)) {
    
                // 处理正当的下载请求,这里只进行示意
                out.println("dealing download ...");
    
            } else {
    
                // 非法下载请求跳转到本站的下载说明页
                RequestDispatcher rd = request.getRequestDispatcher("/down.html");
                rd.forward(request, response);
    
            }
        }
    }

    2. web.xml文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>HelloServlet</display-name>
      <servlet>
        <servlet-name>DownManagerServlet</servlet-name>
        <servlet-class>com.horizon.servlet.DownManagerServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>DownManagerServlet</servlet-name>
        <url-pattern>/servlet/DownManagerServlet</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

    3. down.html内容:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
         this is the down.html
    </body>
    </html>

    4. index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <base href="http://localhost:6060/HelloServlet/down.html" />
    </head>
    <body>
        <a href="servlet/DownManagerServlet">down</a>
    </body>
    </html>

    5. 如图结构:

    6. 

    接着在浏览器地址栏中输入如下地址:

           http://localhost:6060/HelloServlet/servlet/DownManagerServlet

    由于这是直接在浏览器地址栏中输入的访问地址,请求消息中不含Referer请求头,DownManagerServlet将down.html页面转发给浏览器,浏览器中显示的结果如图所示:

    单击图中的超链接再次访问DownManagerServlet,由于这时的请求消息中包含有Referer请求头且其值与DownManagerServlet位于同一WEB站点,DownManagerServlet接受下载请求,浏览器中显示的结果如图所示:

  • 相关阅读:
    浅谈Dotnet的数据定位和匹配
    聊聊Dotnet的垃圾回收
    Dotnet中Span, Memory和ReadOnlySequence之浅见
    Dotnet的局部函数和委托的对比
    一文说通Dotnet的委托
    开发进阶:Dotnet Core多路径异步终止
    冷饭新炒:理解布隆过滤器算法的实现原理
    冷饭新炒:理解JWT的实现原理和基本使用
    冷饭新炒:理解JDK中UUID的底层实现
    起飞,会了这4个 Intellij IDEA 调试魔法,阅读源码都简单了
  • 原文地址:https://www.cnblogs.com/tv151579/p/3595432.html
Copyright © 2020-2023  润新知