Web基础之盗链与简单防盗链技术


Web基础之盗链技术与简单防盗链技术
一、盗链简介:
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。

二、盗链技术模拟
拿我们前面写的一个下载文件列表来模拟;
新建一个动态Web 工程;把上次的代码拷贝过来,改下路径;


Web基础之盗链与简单防盗链技术_第1张图片


fileList.html




可下载文件列表


	
可下载文件列表
序号 文件名 操作
1 JDBC.docx 下载
2 pic1.jpg 下载
3 WEB BASE.xlsx 下载

把防盗链那部分先注释掉
package com.usc.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CommonDownLoadServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		//判断是否盗链,不懂可以略过
//		String referer =req.getHeader("Referer");
//		if(referer!=null && !"".equals(referer.trim())){
//			int index0 =referer.lastIndexOf("/");
//			String temp =referer.substring(0,index0);
//			index0=temp.lastIndexOf("/");
//			String srcAddress=temp.substring(index0);
//			String contextPath=req.getContextPath();
//			if(!srcAddress.equals(contextPath)){
//				resp.sendError(404, "你个盗链狗!");
//				return;
//			}
//		}
		
		
		
		//获取要下载的文件名
		String fileName=req.getParameter("fileName");
		//判断文件是否为空
		if(fileName==null || "".equals(fileName.trim())){
			//设置响应正文,防止乱码
			resp.setContentType("text/html;charset=utf-8");
//			resp.sendError(404,"请指定下载文件名称!");
			resp.getWriter().write("请指定下载文件名称!");
			return;
		}
		
		//获取要下载文件的MIME类型
		int index=fileName.lastIndexOf(".");
		String mimeType=null;
		//如果文件没有后缀,则将文件mime类型设置问二进制文件
		if(index<0){
			mimeType=req.getServletContext().getInitParameter(".bin");
		}else{
			//拿到文件的后缀
			String subfix=fileName.substring(index);
			mimeType=req.getServletContext().getMimeType(subfix);
			if(mimeType==null || "".equals(subfix.trim())){
				mimeType=req.getServletContext().getInitParameter(".bin");
			}
		}
		
		//获取文件输入流
		InputStream in = req.getServletContext().getResourceAsStream("/File/"+fileName);
		
		//设置响应头
		String contentType=req.getServletContext().getMimeType(mimeType);
		resp.setHeader("Content-Type", contentType+";charset=UTF-8;");
		resp.setContentLength(in.available());
		resp.addHeader("Content-Disposition", "attachment;fileName="+fileName);
		
		OutputStream out =resp.getOutputStream();
		byte [] bytes=new byte[1024];
		int len =in.read(bytes);
		while(len!=-1){
			out.write(bytes, 0, len);
			len =in.read(bytes);
		}
		
		//关闭流
		in.close();
	}
	
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doGet(req, resp); 
	}

}

配置文件:



  MydownLoad
  
    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp
  
  
  
  comdownload
  com.usc.servlet.CommonDownLoadServlet
  
  
  comdownload
  /comdown
  

再新建一个动态Web 工程;把fileList.html拷贝过来;

Web基础之盗链与简单防盗链技术_第2张图片

把两个工程同时发布到Tomcat服务器下,注意看地址栏中的地址;

Web基础之盗链与简单防盗链技术_第3张图片

Web基础之盗链与简单防盗链技术_第4张图片

点击下载,都能成功下载文件;我们辛苦的劳动成果就这样被被人盗取了;

Web基础之盗链与简单防盗链技术_第5张图片



我们把注释的那段代码放出来;再次发布,这次让我们再来看看情况;
Web基础之盗链与简单防盗链技术_第6张图片
当我们点击下载的时候,会出现上面的界面;


三、简单防盗链技术原理介绍:

其实机智的小伙伴们已经发现了,这要根据地址栏中的地址就可以判断是不是盗链了;因为我们发布的工程地址
是唯一的;
我们也是基于这一原理来防盗链;

利用工程名来判断
代码详解:


//获取地址栏中的地址,这里我们的地址是localhost:8080/MyTes/fileList.html
String referer =req.getHeader("Referer");
//判断地址是否为空
if(referer!=null && !"".equals(referer.trim())){

//截取工程名

int index0 =referer.lastIndexOf("/");

//temp=localhost:8080/MyTes

String temp =referer.substring(0,index0);

index0=temp.lastIndexOf("/");

//srcAddress=MyTes

String srcAddress=temp.substring(index0);

//contextPath=MydownLoad
String contextPath=req.getContextPath();

//判断两个工程名是否是一样的,不是一样的就骂回去
if(!srcAddress.equals(contextPath)){
resp.sendError(404, "你个盗链狗!");
return;
}


利用地址来判断
其实这里就有一种更简单的判断,直接拿我们的地址栏中的地址判断
//判断是否盗链,不懂可以略过
String referer =req.getHeader("Referer");
if(!"http://localhost:8080/MydownLoad/fileList.html".equals(referer)){
resp.sendError(404, "你个盗链狗!");
return;
}


其实防盗链还有很多种方法,这里只介绍最简单的;有兴趣的小伙伴们可以百度了解;

三、总结

知道了什么是盗链;知道了如何访盗链;个人心得体会,学东西首先重在原理的理解;其次是代码;
共勉!




你可能感兴趣的:(web基础)