防盗链的8种方法总结及分析
- 格式:doc
- 大小:29.00 KB
- 文档页数:3
防盗链技术方案防盗链技术是一种用于保护网站资源不被盗链的技术手段。
盗链是指恶意网站利用他人的服务器资源,将其链接显示在自己的页面上,从而达到“偷窥”他人网站内容的目的。
为了保护网站资源的安全和稳定运行,开发了多种防盗链技术方案。
一、HTTP_REFERER检查HTTP_REFERER是HTTP协议中的一个请求头字段,用于标识请求来源页面的URL。
通过检查HTTP_REFERER字段,网站服务器可以判断请求是否来自合法的页面。
在该方案中,网站服务器会拒绝那些没有正确的请求来源页面的请求,以此防止盗链行为的发生。
该方案简单易行,但也存在一些问题,例如有些浏览器和防火墙可能会禁用或篡改HTTP_REFERER字段。
二、URL签名验证URL签名验证是一种常用的防盗链技术方案。
在该方案中,网站服务器会为每一个资源链接生成一个唯一的URL签名,并将其嵌入到链接中。
在服务端,服务器会根据签名验证请求的合法性。
只有通过了验证的请求才能获取到资源。
这种方案相对安全可靠,但需要在服务器端进行额外的计算和验证处理。
三、验证码验证验证码验证是一种常见的防盗链技术方案。
在该方案中,服务器会生成一个动态的验证码,并将其嵌入到资源链接中。
只有输入正确的验证码,才能获取到资源。
这种方案能够有效地抵御盗链,但也给用户带来了一定的不便。
四、IP限制IP限制是一种简单粗暴的防盗链技术方案。
在该方案中,服务器会通过记录访问者IP地址,并根据其IP地址判断请求的合法性。
只有符合限制条件的IP地址才能够成功获取到资源。
这种方案简单易行,但存在一定的限制和误差,例如IP地址的动态变化和代理服务器的存在。
五、动态防盗链技术动态防盗链技术是一种较为高级的防盗链技术。
在该方案中,服务器会根据一定的算法动态生成资源链接,使其具备一定的时效性和唯一性。
通过不断地更新和更换资源链接,可以有效地防止盗链行为的发生。
这种方案较为复杂,但可以提供更高的安全性和稳定性。
防盗链原理1. 什么是防盗链?防盗链(hotlinking)是指直接在A网站上使用B网站上的图片或其他资源,而不是下载到自己的服务器上再使用。
这种行为会让B 网站的流量增加,而A网站却不需要为此付出代价,很容易导致B网站的带宽消耗量增加,服务器负荷加重,严重的甚至可能导致B网站瘫痪。
为了应对这种情况,B网站需要采取措施,即防盗链。
2. 防盗链的原理在技术上,防盗链的原理就是在B网站上设置一个程序或一个脚本,来检测访问该站点的请求是否来自自己网站的页面,如果不是,则不会提供图片或其他资源,而是返回一个提示信息或是一个替代图片。
这样可以确保只有B网站上授权的访问者才能正常获取图片或其他资源,从而避免了不必要的流量消耗和服务器负担。
具体实现方式可以采用以下几种方法:2.1 HTTP_REFERER属性HTTP_REFERER是一个HTTP报头,在浏览器向服务器发送请求时会包含这个报头,用来告诉服务器请求来源是哪个网站。
B网站可以检测HTTP_REFERER的内容,如果不是自己的网站,则拒绝提供资源。
2.2 .htaccess文件.htaccess是一个Apache服务器的配置文件,在这个文件里可以设置很多网站的访问权限和安全控制。
B网站可以通过修改.htaccess文件来实现防盗链,具体方法是在文件中添加一些规则,比如规定只有自己网站的访问请求才允许访问资源,其他请求则拒绝。
2.3 JavaScript脚本JavaScript脚本可以在B网站的页面中嵌入,用来检测浏览器中的HTTP_REFERER属性,如果检测到不是自己的网站,则通过JavaScript代码来隐藏图片或其他资源。
3. 防盗链的应用防盗链主要是应用在图片和视频等资源保护方面。
很多网站比如社交网络、图片分享网站等,都需要保护自己的图片资源不被其他网站恶意盗链接用。
此外,一些网站上的敏感信息、音频、视频等资源也需要进行防盗链处理,以保证资源的安全性和机密性。
如何使用自行车锁防盗自行车是一种便捷的交通工具,但是在城市生活中,自行车的被盗现象屡见不鲜。
为了保护自行车不被盗,使用自行车锁是必不可少的。
正确使用自行车锁可以有效地减少自行车被盗的风险。
下面将介绍几种常见的自行车锁以及如何正确使用它们。
1. U型锁U型锁是一种常见的自行车锁,它的结构强大且易于使用。
使用U型锁的方法很简单,首先找到一个坚固的固定物,例如路边的铁栏杆或者专门设置的自行车停车架。
将U型锁的U形部分套在自行车的车架和前轮上,然后锁住。
记得要确保U型锁和固定物之间没有空隙,这样盗贼就无法利用撬杠等工具将锁撬开了。
2. 钢丝锁钢丝锁轻便易携带,是很多骑行爱好者的选择。
使用钢丝锁时,将钢丝锁穿过自行车的车轮、车架和固定物,并锁紧。
和U型锁一样,确保钢丝锁没有空隙可被撬动,增加盗贼的盗窃难度。
3. 自行车链条锁自行车链条锁是一种灵活性较强的锁具,可以根据需要调节长度。
使用链条锁时,将链条锁穿过自行车的车轮、车架和固定物,然后用锁头锁住链条。
与其他锁具一样,一定要确保链条锁的安全性,避免被盗贼撬开。
4. 折叠锁折叠锁是一种结实耐用的自行车锁,可以灵活折叠便于携带。
使用折叠锁时,将锁具穿过自行车的车轮、车架和固定物,然后将折叠锁收起并用锁头锁住。
折叠锁的坚固性可以有效地防止被盗。
总结不论使用何种类型的自行车锁,关键在于正确使用并选择适合自己需求的锁具。
在停放自行车时,一定要选择坚固的固定物,并确保锁具和自行车之间没有空隙可被撬开。
此外,定期更换锁具也是保护自行车安全的重要措施。
希望以上介绍可以帮助大家有效地使用自行车锁,更好地保护自行车不被盗。
防盗链实现原理(一)防盗链实现防盗链(Hotlink Protection)是网站常用的一种安全措施,用于阻止其他网站在未经授权的情况下直接访问本站资源。
实现防盗链可以有效保护网站的内容安全,避免资源被恶意盗链引用。
为什么要防盗链?盗链是指其他网站在未经允许的情况下直接引用本站资源,例如图片、视频、音频等。
这不仅可能导致带宽资源被占用,还可能被恶意访问者利用进行不良用途。
通过防盗链实现,网站可以限制资源的访问范围,提高网站资源的安全性。
实现原理防盗链的实现原理主要基于 HTTP 请求的 Referer 字段。
Referer 是指请求来源页面的 URL,通过检查 Referer 字段可以判断请求是否来自本站或者合法的来源。
以下是常见的防盗链实现方法:1.黑名单法:管理员设定一份黑名单,包含不被允许引用资源的来源页面。
服务器在接收到请求时,检查 Referer 字段是否在黑名单中,若在,则返回 403 Forbidden 错误。
这种方法简单易行,但需要维护黑名单列表。
2.白名单法:管理员设置一份白名单,只允许来自白名单中的页面引用资源。
服务器在接收到请求时,检查 Referer 字段是否存在且在白名单中,若不在,则返回 403 Forbidden 错误。
这种方法较为安全,但需要维护白名单列表。
3.动态生成防盗链链接:服务器动态生成防盗链链接,将资源的URL 进行加密,并在生成链接时设置过期时间。
生成的链接只有在时效内才能访问资源,过期后则无效。
这种方法相对复杂,但更加灵活和安全。
防盗链实践实现防盗链之前,首先需要确定自己的业务需求,并根据实际情况选择合适的实现方法。
下面是一些实践建议:•检查 Referer 字段时,要考虑兼容性和 HTTP 协议的大小写问题。
•注意防止被伪造的 Referer 字段绕过防盗链校验。
可以使用其他校验方式,如校验请求 IP 是否在合法范围内等。
•防盗链设置可能会影响用户体验,例如某些工具或浏览器可能不发送 Referer 字段。
酒店防盗链使用方法
酒店防盗链是一种防止其他网站未经授权地直接链接到酒店网站内容的技术措施。
以下是一些有效的防盗链使用方法:
1. 配置HTTP头:通过配置酒店网站的HTTP头文件,可以告诉浏览器只允许特定的域名访问网站内容,其他域名无法直接链接到酒店网站。
可以使用
X-Frame-Options头字段来实现此功能。
2. 使用CDN:使用内容分发网络(CDN)服务可以将酒店网站的静态资源复制到多个服务器上进行分发,从而增加防盗链的难度。
这样,未经授权的网站链接到酒店网站时,会被重定向到一个无效的CDN链接。
3. URL签名验证:为每个链接的请求生成一个唯一的签名token,只有带有有效签名token的请求才能访问酒店网站的内容。
这种方法可以有效防止未经授权的链接。
4. IP访问控制:根据IP地址来限制访问权限,只允许特定的IP范围或者特定的IP地址访问酒店网站内容,其他IP地址无法直接链接到酒店网站。
5. 文字水印:在酒店网站的图片上添加文字水印,这样即使其他网站直接链接到了图片,也会显示出带有酒店网站信息的文字水印,有效防止未经授权的链接。
需要注意的是,防盗链措施可能会对正常的访问产生一定的影响,因此在使用之前需要仔细评估和测试。
防盗链的解决方法:(一)创建一个继承了System.Web.IHttpHandler接口的类在System.Web.IHttpHandler接口有两个成员ProcessRequest()方法和IsReusable()属性。
ProcessRequest(System.Web.HttpContext context) 方法,除了用户自定义中被要求处理的特殊的http请求。
其中的参数 System.Web.HttpContext 类的实例装入了一个http请求中http协议中要求的所有信息。
其中System.Web.HttpContext 类中包含有属性 Request 使得从客户端发送过来的http请求信息的值可以被方便地读取;属性Response 它封装了需要返回给客户端的信息和操作。
IsReusable()属性要置为true.(二) 创建一个资源图片的方法Real()1.若是盗链服务器给其错误图片。
2.若不是盗链服务器给其正常的图片。
在Real()方法中用到了FileInfo 这个类去取得图片的扩展名并用来判断图片的类型.(三) 注意页面的缓存(response.Expires=1;获取和设置浏览器上缓存的页过期之前的分钟数.如果用户在页过期之前返回同一页,则显示缓存的内容)(四)配置应用程序扩展名映射因为IIS在接收到aspx页面请求时,会为其自动加载一个C:\WINDOWS\\Framework\v1.1.4322 \aspnet_isapi.dll文件。
虚拟目录和文件夹的属性里面的”执行许可”改为“纯脚本”。
若是有多个Web.config那么只要在总目录下有就可以了,其它地方的均可删除。
(五)在 Web.config这个网络应用程序配置文件中加入注册信息<system.web><httpHandlers><add verb = "*" path = "*.jpg\.ief\.jpg\.jepg\.bmp\.png\.tif\.emf\.ras\.pnm\.pbm\.pgm\.ppm\.rgb\.xbm\.xpm\.xwd\.did\.ico\.emf"type="HandlerExample.HttphandlerTest,HandlerExample"/>..</httpHandlers></system.web>源码: 防盗链源码/*** 防盗链IHttpHandler*** 增加了对文件关键字的选择(即仅对文件名存在某些关键字或不存在某些关键字进行过滤)* 设置web.config中 <appSettings> 节以下值* string eWebapp_NoLink 如果文件名符合该正确表态式将进行过滤(不设置对所有进行过滤) * string eWebapp_AllowLink 如果文件名符合该正确表态式将不进行过滤(优先权高于AllowLink,不设置则服从AllowLink)* bool eWebapp_ AllowOnlyFile 如果为False,(默认true)则不允许用户直接对该文件进行访问建议为true*** :)以下设置均可省略,设置只是为了增加灵活性与体验* eWebapp_NoLink_Message 错误信息提示:默认为Link From:域名* eWebapp_Error_Width 错误信息提示图片宽* eWebapp_Error_Height 错误信息提示图片高**** 垃圾猪 2005-9-11 创建*/using System;using System.Web;using System.Drawing;using System.Drawing.Imaging;using System.IO;using System.Configuration;using System.Text.RegularExpressions;namespace eWebapp{/// <summary>/// 防盗链IHttpHandler/// 垃圾猪 2005-9-12 修正/// </summary>public class NoLink : IHttpHandler{private string eWebapp_NoLink = string.Empty;private string eWebapp_AllowLink = string.Empty;private bool eWebapp_AllowOnlyFile = true;private string eWebapp_NoLink_Message = string.Empty;private bool error = false;public NoLink(){//// TODO: 在此处添加构造函数逻辑//}public void ProcessRequest(HttpContext context){eWebapp_NoLink_Message = ConfigurationSettings.AppSettings[ "eWebapp_NoLink_Message "]; string myDomain = string.Empty;error = errorLink(context,out myDomain);if(Empty(eWebapp_NoLink_Message)){eWebapp_NoLink_Message = "Link from : " + myDomain;}if(error){//Jpg(context.Response,eWebapp_NoLink_Message);Jpg(context.Response,eWebapp_NoLink_Message);}else{Real(context.Response,context.Request);}}public bool IsReusable{get{return true;}}/// <summary>/// 输出错误信息/// </summary>/// <param name= "Response "> </param>/// <param name= "_word "> </param>private void Jpg(HttpResponse Response,string _word){int myErrorWidth = _word.Length*15;int myErrorHeight = 16;try{int _myErrorWidth = Convert.ToInt32(ConfigurationSettings.AppSettings[ "eWebapp_Error_ Width "]);if(_myErrorWidth > 0 ){myErrorWidth = _myErrorWidth;}}catch{}try{int _myErrorHeight = Convert.ToInt32(ConfigurationSettings.AppSettings[ "eWebapp_Error _Height "]);if(_myErrorHeight > 0 ){myErrorHeight = _myErrorHeight;}}catch{}Bitmap Img=null;Graphics g=null;MemoryStream ms=null;Img=new Bitmap(myErrorWidth,myErrorHeight);g=Graphics.FromImage(Img);g.Clear(Color.White);Font f=new Font( "Arial ",9);SolidBrush s=new SolidBrush(Color.Red);g.DrawString(_word,f,s,3,3);ms=new MemoryStream();Img.Save(ms,ImageFormat.Jpeg);Response.ClearContent();Response.ContentType= "image/Gif ";Response.BinaryWrite(ms.ToArray());g.Dispose();Img.Dispose();Response.End();}/// <summary>/// 输出真实文件/// </summary>/// <param name= "response "> </param>/// <param name= "context "> </param>private void Real(HttpResponse response,HttpRequest request){FileInfo file = new System.IO.FileInfo(request.PhysicalPath); response.Clear();response.AddHeader( "Content-Disposition ", "filename= " + ); response.AddHeader( "Content-Length ", file.Length.ToString());string fileExtension = file.Extension.ToLower();//这里选择输出的文件格式switch (fileExtension){case "mp3 ":response.ContentType = "audio/mpeg3 ";break;case "mpeg ":response.ContentType = "video/mpeg ";break;case "jpg ":response.ContentType = "image/jpeg ";break;case "bmp ":response.ContentType = "image/bmp ";break;case "gif ":response.ContentType = "image/gif ";break;case "doc ":response.ContentType = "application/msword ";break;case "css ":response.ContentType = "text/css ";break;default:response.ContentType = "application/octet-stream ";break;}response.WriteFile(file.FullName);response.End();}/// <summary>/// 确认字符串是否为空/// </summary>/// <param name= "_value "> </param>/// <returns> </returns>private bool Empty(string _value){if(_value == null | _value == string.Empty | _value == " ") {return true;}else{return false;}}/// <summary>/// 检查是否是非法链接/// </summary>/// <param name= "context "> </param>/// <param name= "_myDomain "> </param>/// <returns> </returns>private bool errorLink(HttpContext context,out string _myDomain){HttpResponse response = context.Response;string myDomain = context.Request.ServerVariables[ "SERVER_NAME "];_myDomain = myDomain ;string myDomainIp = erHostAddress;eWebapp_NoLink = ConfigurationSettings.AppSettings[ "eWebapp_NoLink "];eWebapp_AllowLink = ConfigurationSettings.AppSettings[ "eWebapp_AllowLink "];try{eWebapp_AllowOnlyFile = Convert.ToBoolean(ConfigurationSettings.AppSettings[ "eWebapp_Al lowOnlyFile "]);}catch{eWebapp_AllowOnlyFile = true;}if(context.Request.UrlReferrer != null){//判定referDomain是否存在网站的IP或域名string referDomain = context.Request.UrlReferrer.AbsoluteUri.Replace(context.Request.U rlReferrer.AbsolutePath, " ");string myPath = context.Request.RawUrl;if(referDomain.IndexOf(myDomainIp) > =0 | referDomain.IndexOf(myDomain)> =0){return false;}else{//这里使用正则表达对规则进行匹配try{Regex myRegex ;//检查允许匹配if(!Empty(eWebapp_AllowLink)){myRegex = new Regex(eWebapp_AllowLink);if(myRegex.IsMatch(myPath)){return false;}}//检查禁止匹配if(!Empty(eWebapp_NoLink)){myRegex = new Regex(eWebapp_NoLink);if(myRegex.IsMatch(myPath)){return true;}else{return false;}}return true;}catch{//如果匹配出错,链接错误return true;}}}else{//是否允许直接访问文件if(eWebapp_AllowOnlyFile){return false;}else{return true;}}}}}另一个源码例子:.cs文件/**********************************************************************/大文件下载,防盗链/**********************************************************************/using System;using System.Data;using System.Configuration;using System.Collections;using System.IO;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;public partial class GetFile : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){if (Request.QueryString["FileName"] == null){InvalidRedirect();//返回首页}string fileName = Request.QueryString["FileName"];if (fileName == string.Empty){InvalidRedirect();//返回首页}//判断配置文件是否直接下载string downDirect = ConfigurationManager.AppSettings["Down"].ToLower(); if (downDirect == "true"){UpdateHits(fileName); //更新下载次数Response.Redirect("Upload/" + fileName);return;}//如果不是直接下载string path = Server.MapPath(Request.ApplicationPath + "/Upload/" + fileName);string referrer = string.Empty;if (Request.UrlReferrer != null){referrer = Request.UrlReferrer.ToString().ToLower();}string d = ConfigurationManager.AppSettings["Valid"].ToLower();string[] domainName = ConfigurationManager.AppSettings["Refers"].ToLower().Split(new char[]{ ',' });// 如果设置为防止盗链,判断访问来源是否合法if (d == "false"){foreach (string s in domainName){if (referrer.IndexOf(s.ToLower()) > 0){UpdateHits(fileName);//更新下载次数ResponseFile(path);return;}}InvalidRedirect();}else{ResponseFile(path);}}/// <summary>/// 更显下载次数/// </summary>/// <param name="fileName"></param>protected void UpdateHits(string fileName){//}/// <summary>/// 返回首页/// </summary>protected void InvalidRedirect(){string defaultPage = ConfigurationManager.AppSettings["DefaultRedirect"];Response.Redirect(defaultPage, true);}/// <summary>/// 输出文件/// </summary>/// <param name="path"></param>protected void ResponseFile(string path){System.IO.Stream iStream = null;byte[] buffer = new Byte[10000];int length;long dataToRead;string filename = System.IO.Path.GetFileName(path);try{iStream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);dataToRead = iStream.Length;Response.ContentType = "application/octet-stream";Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));while (dataToRead > 0){if (Response.IsClientConnected){length = iStream.Read(buffer, 0, 10000);Response.OutputStream.Write(buffer, 0, length);Response.Flush();buffer = new Byte[10000];dataToRead = dataToRead - length;}else{dataToRead = -1;}}}catch (Exception ex){Response.Write("文件下载时出现错误!");}finally{if (iStream != null){iStream.Close();}}}}-------config文件<appSettings><add key="Down" value="false"/> <!--是否直接下载--><add key="Valid" value="false"/> <!--是否允许盗链--><add key="Refers" value=""/> <!--多个允许的访问来源用半角的","分割--> <add key="DefaultRedirect" value="Error.htm"/> <!--默认转向的页面--></appSettings>----------------------------文件防盗链-----------------------------------------图片防盗链-------------.ashx文件<%@ WebHandler Language="C#" Class="Pic" %>using System;using System.Web;public class Pic : IHttpHandler {public void ProcessRequest (HttpContext context) {context.Response.ContentType = "image/jpg";if (context.Request.UrlReferrer != null && context.Request.UrlReferrer.Host.Equals(context.Request.Url.Host,StringComparison.InvariantCultureIgnoreCase))context.Response.WriteFile(context.Server.MapPath("~/" + context.Request.QueryString["img"]));elsecontext.Response.WriteFile(context.Server.MapPath("~/logo.gif"));}public bool IsReusable {get {return false;}}}-------------------------------------------------------------------图片防盗链------------------------------------------------------。
nginx防盗链原理
Nginx防盗链原理是通过对请求HTTP头部信息进行判断和过滤,实现对非法盗链的防范。
具体实现方式包括:
1. 获取请求HTTP头部信息:Nginx通过获取请求的HTTP头部信息,从中提取出Referer字段和User-Agent字段。
2. 判断Referer字段:Referer字段是请求来源的网址,当Referer字段为空或者非法时,说明该请求不是从允许的网站发起的,需要进行防盗链处理。
3. 判断User-Agent字段:User-Agent字段是浏览器的标识,可以通过判断User-Agent字段来确定请求是否来自人类浏览器,而非爬虫等非法程序。
4. 配置防盗链规则:通过配置Nginx的防盗链规则,可以限制允许访问资源的Referer来源,从而防止非法盗链。
5. 配置防盗链页面:当发现有非法盗链时,Nginx可以返回一个防盗链页面,提示用户该资源不允许被盗链,提高资源的安全性。
总的来说,Nginx防盗链原理既可以通过判断HTTP头部信息来实现,也可以通过配置规则和页面来实现,从而更好地保障Web资源的安全性和可靠性。
- 1 -。
方法1:判断引用地址这个方法是最早及最常见的方法。
所谓判断引用地址,就是判断浏览器请求时HTTP头的Referer字段的值,这个值在里面可以用Request.UrlReferrer属性取得。
几个例子来说,在正常情况下当用户在浏览/abc.html 时点击一个链接去到/jacky.mp3 文件时,浏览器在发出请求jacky.mp3 资源时还会附带当刻浏览器所处的页面地址(即/abc.html),所以当你的网站程序接收到下载jacky.mp3 资源请求的时候,先判断http的referer字段的值,如果是从自己的域名()过来的,则可以认为是合法的连接请求,否则就返回一个错误的提示信息。
这种方法通常用于图片、mp3这种容易被人用html“嵌入”到其他网站的资源,使用这种方法可以防止你的图片直接出现在别人的网页里(或者防止mp3直接被其他网站嵌入到flash播放器里),不过访客使用下载工具还是可以轻松下载,因为现在的下载工具一般会自动用你的域名构造一个引用地址,所以如果想再进一步防范的话,可以使用一个对应表限制每个资源的引用地址,例如将jacky.mp3 的引用地址限制为/abc.htmlid=12345,这样下载工具就不太可能构造一个“正确”的引用地址了。
方法2:使用登录验证这个方法常见于论坛、社区。
当访客请求网站上的一个资源时,先判断此请求是否通过登录验证(在里常用session或form验证来记录登录状态),如果尚未登录则返回一个错误提示信息。
使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。
不过因为登录状态依赖于会话id,而会话id往往储存于http请求的cookie字段里,下载工具一般没法获得浏览器的cookie字段,所以这些资源往往无法使用下载工具来下载,给正常合法用户带来诸多不便(因为大部分网民的系统都安装了下载工具,一点击下载链接一般会被下载工具拦截,导致无法使用浏览器本身的下载功能)。
以下的方法对URL整体防止更好,对于单独的图片防盗,我觉得应该有更好的方法,目前没找到,以后添加一.Servlet型反盗链这里在网上找到一种思路,就是关于HTTP协议响应头中包含的Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
所以我们可以通过得到响应头中包含的referer来判断其请求来自哪里,如果不是本系统页面的请求则可能是盗链。
在ASP中request有ServerVariables("HTTP_REFERER")方法直接给我们提供类似防盗链的方式。
可是我们的Java不直接提供支持,所以对referer来源的判断则只有我们自己实现了。
我们知道referer包含的是请求发过来的源页面,而对于浏览器地址栏直接发送的请求referer为空。
所以我们可以实现一个Filter对特定请求实现监听,并且有:import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DaoLianFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest req=(HttpServletRequest) request;HttpServletResponse resp=(HttpServletResponse) response;String refer=req.getHeader("refer");//得到refer// 属于盗链行为if(refer!=null&&!"".equals("")&&!refer.contains(req.getServerName())){//&& referer.trim().startsWith("http://localhost:8080/baidu") 这也是种判断System.out.println("盗链来自:"+req.getRemoteAddr());//将请求转为另一个图片,此处的JsCssImage和WEB-INF处于同一个目录下request.getRequestDispatcher("/JsCssImage/btn2.jpg").forward(req,resp);//注意用法}else{//正常行为chain.doFilter(req, resp);//放行请求}}@Overridepublic void destroy() {// TODO Auto-generated method stub}}第二步关于web.xml的设置<!-- 防盗链过滤器 --><filter><filter-name>loginFilter</filter-name><filter-class>com.l99.filter.LoginFilter</filter-class>//文件全路径 </filter>//下面是你要防盗的页面,可以有多个或一个,因为在大型项目中,jsp页面分类会很细,可能装载在不同的文件夹所以可以有多对<filter-mapping><filter-name>loginFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <fi lter-mapping><filter-name>loginFilter</filter-name><url-pattern>/form/cfa/*</url-pattern> //过滤在form文件夹下,cfa子文件夹中的jsp页面</filter-mapping>二.Struts的反盗链注意:Filter好像只可以过滤jsp,不可以过滤action,过滤action最好用拦截器1. XML 配置<!-- struts2 --> <filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter><filter-mapping><filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping>2. 创建拦截器类,实现Interceptorpackage com.l99.web.right.interceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.l99.right.ManageUserInfo; import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInv ocation;import com.opensymphony.xwork2.interceptor.Interceptor; /*** 登录、权限拦截器,实现interceptor * @author Owner * */public class LoginInterceptor implements Interceptor{public void destroy() { }public void init() { // TODO Auto-generated method stub }/** * 拦截器 */public String intercept(ActionInvocation invocation) throws Exception {//获取uri//获取requestActionContext context = invocation.getInvocationContext(); HttpServletRequest request = (HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);//获取sessionHttpSession session = request.getSession(); //获取请求的路径String path = request.getRequestURI(); //判断是否登录,如果登录判断是否有访问的权限if(session.getAttribute("userInfo")== null){ // 重定向到登录界面//request.getRequestDispatcher("/login.jsp"); 此方式用下面的 Action.LOGIN;代替 return Action.LOGIN; }else{ //判断访问的是否是需要指定的权限的用户if(path.contains("/sysFun/right.action")){ ManageUserInfo userInfo = (ManageUserInfo) sessi on.getAttribute("userInfo");if(!"超级管理员".equals(userInfo.getRoleName())){ request.setAttribute("error", "对不起,您没有访问权限"); return Action.ERROR;}}}return invocation.invoke();}}3. struts.xml配置<package name="sysFun" namespace="/sysFun" extends = "struts-default"> <!-- 拦截器 --> <interceptors> <interceptor name="loginInterceptor" class="com.l99.web.right.interc eptor.LoginInterceptor"><param name="hello">Hello world</param></interceptor><!-- 拦截器栈 --><interceptor-stack name="mystack"><interceptor-ref name="loginInterceptor"></interceptor-ref><!-- struts2默认拦截器 <interceptor-ref name="defaultStack"></interceptor-ref>--></interceptor-stack> </interceptors><!--global-results放的位置顺序不对会报错,全局变量error --> <global-results> <result name="error">/WEB-INF/pages/error.jsp</result><!-- LoginInterceptor中的Action.LOGIN对应找到name --> <result name="login">/login.jsp</result></global-results><action name="right" method="right" class = "com.l99.web.right.EditManageSysFunAction"> <result >/WEB-INF/pages/manage_sysfun/right.jsp </result><!-- 引用拦截器:拦截action --><interceptor-ref name="mystack"></interceptor-ref></action>……………其它action </package>注意:拦截器类中的return Action.LOGIN; 找到的是struts2中struts.xml中的全局变量<global-results> <result name="error">/WEB-INF/pages/error.jsp</result><!-- LoginInterceptor中的Action.LOGIN对应找到name --> <result name="login">/login.jsp</result></global-results>三.反反盗链:其根本的原理是将Referer和Host进行外装包装import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import .URL;import .URLConnection;import java.util.zip.GZIPInputStream;public class ImageDownloader {/*** 下载文件到指定位置** @param imgurl 下载连接* @param f 目标文件* @return 成功返回文件,失败返回null*/public static File download(String imgurl, File f) {try {URL url = new URL(imgurl);URLConnection con = url.openConnection();int index = imgurl.indexOf("/", 10);con.setRequestProperty("Host", index == -1 ? imgurl.substring(7):imgurl.substring(7, index));con.setRequestProperty("Referer", imgurl);InputStream is = con.getInputStream();if (con.getContentEncoding() != null &&con.getContentEncoding().equalsIgnoreCase("gzip")) {is = new GZIPInputStream(con.getInputStream());}byte[] bs = new byte[1024];int len = -1;OutputStream os = new FileOutputStream(f);try {while ((len = is.read(bs)) != -1) {os.write(bs, 0, len);}} finally {try {os.close();} catch (Exception ex) {}try {is.close();} catch (Exception ex) {}}return f;} catch (Exception ex) {ex.printStackTrace();return null;}}}[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。
物流仓库防盗措施物流仓库的防盗安全是保障货物安全和物流运作顺利进行的重要环节。
本文将从防盗控制系统、安保措施和员工教育培训三个方面,探讨如何有效提升物流仓库的防盗能力。
一、防盗控制系统物流仓库的防盗控制系统是保障安全的基础,主要包括门禁系统、视频监控系统和报警系统。
1. 门禁系统门禁系统可以对进出仓库的人员进行有效的管控,减少非法进入的可能性。
门禁系统应设有电子密码、指纹识别或身份卡等多重鉴别方式,确保只有授权人员才能进入仓库。
2. 视频监控系统视频监控系统是仓库保安的“眼睛”,可以帮助实时监控和录像存档。
合理布局摄像头,保证监控全面覆盖,特别是重要区域和通道。
同时,监控录像应进行定期备份,以备案证据使用。
3. 报警系统报警系统是及时发现异常情况的关键,可以通过声光报警、手机短信通知等方式,快速响应并采取相应措施。
报警系统与视频监控系统应有联动功能,发生报警时能够自动触发录像记录,以提供更多的证据支持。
二、安保措施除了防盗控制系统外,一系列安保措施也是保障物流仓库安全的重要组成部分。
1. 照明设施充足的照明能有效减少盗窃行为,增加暴露风险。
物流仓库的入口、道路、停车区、围墙和货物堆放区都应有良好的照明设施,特别是在夜间或昏暗环境下。
2. 围墙和围栏围墙和围栏是物流仓库的外界边界,有效阻挡闯入者的入侵。
围墙应具有一定的高度和坚固程度,围栏可以设置尖刺或电网等障碍物,大大增加犯罪分子的进入难度。
3. 安保人员物流仓库应聘请专业的保安人员来负责安全防范工作。
保安人员需要经过专业培训,了解基本的安保知识和技能,能够熟练运用监控设备、防范突发事件等,增加仓库的安全性。
三、员工教育培训员工是物流仓库防盗的重要环节,他们的意识和行为直接影响到防盗效果。
1. 安全意识教育物流仓库应向员工普及安全意识教育,包括防盗知识、犯罪手段和实战案例等。
提高员工的安全意识,使其能够主动发现可疑情况,并且知道如何正确报警和处理。
防盗链的8种方法总结及分析
作为普通的网民来说,一般不需要知道也不用关心什么是盗链,不过如果你是网站的开发者或维护者,就不得不重视盗链的问题了。
如果你刚刚开发完一个没有防盗链的带有文件下载功能的网站,挂上internet,然后上传几个时下非常热门的软件或电影并在网站内公布下载地址,让MSN上的所有好友都来体验一下你的杰作。
不用多久就会发现网速出奇地变慢,甚至服务器托管中心的服务员会热情地打电话告诉你的网站流量很大,估计是网站受欢迎起来了,问你是不是该考虑加钱租用带宽更宽但价格更贵的网线了。
在这个值得庆祝的时候赶快打开Google Analytics看看有多少人来光顾你的网站了吧,如果发现访客每天才十来个人,很遗憾地告诉你:你的网站资源不幸地被人盗链了。
而且更糟糕的是,当你把网站上的文件和电影通通删光之后,网站仍然没有变快多少,从web服务器的访问日志里会发现疯狂的访问请求正从四面八方涌过来,web服务器为了迎接这批访客而没有时间处理正常的页面,这种状况可能会一直持续好几个周时间。
网站资源被盗链简单来说就是别人不是从你的网站通过下载资源,被盗链的几种可能情况:1、在人气非常旺的网站、论坛、社区的网页里直接引用了(使用<img src>标记)你网站上的图片,或者直接在其他网页(使用flash或媒体播放插件)里嵌入了你网站上的mp3。
2、在人气非常旺的网站、论坛、社区里提供了你的资源的下载地址。
3、你网站的资源可能被一些下载软件列入了“资源候选名单”,当其他人用下载工具下载相同的文件时,下载软件会自动找上门并且从你的服务器下载。
既然被盗链的后果这么可怕,那有哪些方法可以防止盗链呢?下面从简到繁总结一下常见的以及自己实践过的一些方法,并简单分析一下。
不过很遗憾地,这些方法都没法完全杜绝被盗链,并且防盗链的目的应该是从一定的程度上减少被盗链所产生的影响,同时能让合法的用户能够以自然的方式、顺畅地从你的网站下载资源。
方法1:判断引用地址
这个方法是最早及最常见的方法。
所谓判断引用地址,就是判断浏览器请求时HTTP头的Referer字段的值,这个值在ASP/' target='_blank' class='infotextkey'>里面可以用Request.UrlReferrer属性取得。
几个例子来说,在正常情况下当用户在浏览/abc.html 时点击一个链接去到/jacky.mp3 文件时,浏览器在发出请求jacky.mp3 资源时还会附带当刻浏览器所处的页面地址(即/abc.html),所以当你的网站程序接收到下载jacky.mp3 资源请求的时候,先判断http的referer字段的值,如果是从自己的域名()过来的,则可以认为是合法的连接请求,否则就返回一个错误的提示信息。
这种方法通常用于图片、mp3这种容易被人用html“嵌入”到其他网站的资源,使用这种方法可以防止你的图片直接出现在别人的网页里(或者防止mp3直接被其他网站嵌入到flash播放器里),不过访客使用下载工具还是可以轻松下载,因为现在的下载工具一般会自动用你的域名构造一个引用地址,所以如果想再进一步防范的话,可以使用一个对应表限制每个资源的引用地址,例如将jacky.mp3 的引用地址限制为/abc.html?id=12345,这样下载工具就不太可能构造一个“正确”的引用地址了。
方法2:使用登录验证
这个方法常见于论坛、社区。
当访客请求网站上的一个资源时,先判断此请求是否通过登录
验证(在里常用session或form验证来记录登录状态),如果尚未登录则返回一个错误提示信息。
使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。
不过因为登录状态依赖于会话id,而会话id往往储存于http请求的cookie字段里,下载工具一般没法获得浏览器的cookie字段,所以这些资源往往无法使用下载工具来下载,给正常合法用户带来诸多不便(因为大部分网民的系统都安装了下载工具,一点击下载链接一般会被下载工具拦截,导致无法使用浏览器本身的下载功能)。
简单的解决方法是将这个session id放到URL中。
这种方法的另外一个缺点是访客无法匿名下载,所以这个方法一般只用于论坛和社区网站。
方法3:使用cookie
其实这种方法原理上跟方法2差不多。
就是在显示“下载”链接的页面里产生一个动态值的cookie,然后在处理资源下载请求时先判断cookie里有没有正确的cookie,如果没有则返回错误提示信息。
至于这个动态值如何产生,只要能逆向判断动态值是否合法的都可以,例如将当前的时间去除秒数取哈希值(也叫散列值)。
如果网页程序是则更简单,可以往Session里随便存一个字符串或数字,然后在处理下载请求时先检查Session里是否存在这个字符串或数字。
使用这个方法的缺点跟方法2一样。
方法4:使用POST下载
客户端浏览器请求资源都是使用HTTP的GET方法的,其实使用POST方法也可以往客户端返回数据。
所以可以将下载链接换成一个表单(Form)和一个按钮(Submit),将待下载的文件的名称或id放到表单的一个隐藏文本框(Input)里,当用户点击提交按钮时,服务程序先判断请求是否为POST方式,如果是则读取目标资源的二进制数据并写入响应对象(在里是respone.BinaryWrite方法)。
使用这个方法的缺点同样是无法使用下载工具,更没法实现断点续传。
不过比方法2,3好一点的是,下载工具不会拦截你的下载动作,所以正常用户还是比较顺畅地下载到文件。
这个方法比较适合小文件的下载。
方法5:使用图形验证码
使用这个方法可以保证每次下载都是“人”在你的网站上下载,而不是下载工具。
因为网上很多介绍使用图形验证码的方法,所以这里就不再重复了。
这个方法的缺点是比较容易让正常的用户感到麻烦。
方法6:使用动态文件名
也叫动态钥匙法,当用户点击一个下载链接时,先在程序端计算一个Key(使用一定规律产生的Key,最好不要使用随机字符串例如GUID,并且这个Key必须有一定时效的),然后在数据库或Cache里记录这个Key以及它所对应的资源ID或文件名,最后让网页重定向一个新的URL地址,这个新URL地址里需要包含这个Key。
当浏览器或下载工具发出下载请求时,程序先检测这个Key是否存在,如果存在则返回对应的资源数据。
使用这个方法的好处是下载工具也可以下载,并且在Key失效前可以断点续传,并且可以通过Key来控制下载的线程数。
使用这个方法(包括以上所有支持下载工具的方法)的缺点是:当任意一个用户下载成功之后,你的资源就会被一些下载工具列入“资源候选名单”,以后其他人在其他地方下载同样的文件时,下载工具会不断连接你的服务器,即使你的文件已经删除或者Key已经失效了,
这样会造成类DDos攻击的后果,下面再介绍两个即可以让下载工具下载,又可以防止盗链的方法。
方法7:擅改资源的内容
一般热门的资源都是电影、mp3、较大的压缩包等,这些文件都是有很多可以插入数据的地方的,例如mp3有一个tag区,rar/zip有一个备注区,电影的内容随便一个地方,只要在下载过程当中,动态地往这些地方注入一些随机的字节(几个字节即可),就可以达到让整个文件的哈希值(即散列值、指纹值)发生改变,让从你网站下载的文件的哈希值跟别人的不一样,就可以防止下载工具主动找上门了。
用这个方法配合方法6,可以达到较好的防盗链的效果。
缺点是,虽然文件被修改的部分不会被“看”、“听”出来,不过多多少少让知道的人觉得不爽。
另外就是如果别人把从你网站下载的文件放到其他网站,那么仍然存在下载工具主动找上门的情况(虽然实际上它下载不了内容)。
方法8:打包下载
这个方法跟方法7的道理是一样的,只不过这次不是往原始文件里修改,而是在原始的文件基础上再加个“外壳”,让资源的哈希值跟别人的不一样。
使用这个方法可以在不擅改资源原始的内容基础上实现方法6同样的效果,并且狠一点的话,甚至可以在打包的时候放入自己的一些广告。
缺点是用户每次下载都得加压缩,不过目前大部分人都懂得解压,所以这个缺点有时可以忽略不计。
好了,上面列了一些常见的防盗链的方法,如果大家还有其他的方法要补充,可以发表在评论中。