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

来源:互联网 发布:java开发环境的构成 编辑:程序博客网 时间:2024/05/18 03:10

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

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




fileList.html
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>可下载文件列表</title></head><body style="text-align: center"><divstyle="width: 250px; height: 180px; text-align: center; margin: 0 auto"><table border="2"><caption>可下载文件列表</caption><tr><th>序号</th><th>文件名</th><th>操作</th></tr><tr><td>1</td><td>JDBC.docx</td><td><ahref="http://localhost:8080/MydownLoad/comdown?fileName=JDBC.docx">下载</a></td></tr><tr><td>2</td><td>pic1.jpg</td><td><ahref="http://localhost:8080/MydownLoad/comdown?fileName=pic1.jpg">下载</a></td></tr><tr><td>3</td><td>WEB BASE.xlsx</td><td><ahref="http://localhost:8080/MydownLoad/comdown?fileName=WEB BASE.xlsx">下载</a></td></tr></table></div></body></html>

把防盗链那部分先注释掉
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); }}

配置文件:

<?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" 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>MydownLoad</display-name>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list>    <servlet>  <servlet-name>comdownload</servlet-name>  <servlet-class>com.usc.servlet.CommonDownLoadServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>comdownload</servlet-name>  <url-pattern>/comdown</url-pattern>  </servlet-mapping></web-app>

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



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





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





我们把注释的那段代码放出来;再次发布,这次让我们再来看看情况;

当我们点击下载的时候,会出现上面的界面;


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

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

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


//获取地址栏中的地址,这里我们的地址是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;
}


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

三、总结

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




原创粉丝点击