利用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接受下載請求,瀏覽器中顯示的結果如圖所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM