利用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接受下载请求,浏览器中显示的结果如图所示:

posted @ 2014-03-15 00:02  horizon~~~  阅读(4696)  评论(0编辑  收藏  举报