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())){
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();
String contextPath=req.getContextPath();
//判断两个工程名是否是一样的,不是一样的就骂回去
if(!srcAddress.equals(contextPath)){
resp.sendError(404, "你个盗链狗!");
return;
}
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;
}
String referer =req.getHeader("Referer");
if(!"http://localhost:8080/MydownLoad/fileList.html".equals(referer)){
resp.sendError(404, "你个盗链狗!");
return;
}
其实防盗链还有很多种方法,这里只介绍最简单的;有兴趣的小伙伴们可以百度了解;
三、总结
知道了什么是盗链;知道了如何访盗链;个人心得体会,学东西首先重在原理的理解;其次是代码;
共勉!
阅读全文
0 0
- Web基础之盗链与简单防盗链技术
- web 下载 防盗链技术(一)
- web 下载 防盗链技术(二)
- web 下载 防盗链技术(三)
- java web笔记之Filter防盗链
- HTTP协议之防盗链与反防盗链
- HTTP协议之防盗链与反防盗链
- IIS防盗链技术
- 网站防盗链技术
- 防盗链技术
- 05-防盗链技术
- PHP防盗链技术
- 防盗链技术
- 常用防盗链技术
- java web 防盗链
- web 防盗链
- ASP简单防盗链
- apache,防盗链,简单
- 图像卷积与滤波的一些知识点
- 使用CSS实现垂直居中
- 为什么代码和数据要分开存放成代码段和数据段
- Sublime Text 3 MarkdownEditing布局设置
- Redis中配置文件讲解
- Web基础之盗链与简单防盗链技术
- Python基础(2)-基本数据类型以及运算符介绍
- Redis中的事务
- [codevs1907]方格取数3 最小割
- HDU 3691 Nubulsa Expo (全局最小割)
- BZOJ 4650: [Noi2016]优秀的拆分 哈希+分块
- build libqrencode
- Android-Architecture-Componets官方DEMO分析
- (188)支点描画器