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