如果我们知道一个静态文件的实际路径如 如果服务器没有作特别的限制设置 我们就可以毫不费力的把它下载下来!当网站提供 windows pdf下载时 怎么样才能让下载者无法得到他的实际路径呢!本文就来介绍如何使用Asp来隐藏文件的实际下载路径 我们在管理网站文件时 可以把扩展名一样的文件放在同一个目录下 起一个比较特别名字 例如放pdf文件目录为the_pdf_file_s 把下面代码另存为down asp 他的网上路径为 我们就可以用?FileName= windows pdf来下载这个文件了 而且下载者无法看到这个文件实际下载路径的!在down asp中我们还可以设置下载文件是否需要登陆 判断下载的来源页是否为外部网站 从而可以做到防止文件被盗链 示例代码:<% From_url = Cstr(Request ServerVariables( HTTP_REFERER )) Serv_url = Cstr(Request ServerVariables( SERVER_NAME )) if mid(From_url len(Serv_url)) <> Serv_url then response write 非法链接! 防止盗链 response end end if if Request Cookies( Logined )= then response redirect /login asp 需要登陆! end if Function GetFileName(longname) /folder /folder /file asp=>file asp while instr(longname / ) longname = right(longname len(longname) ) wend GetFileName = longname End Function Dim Stream Dim Contents Dim FileName Dim TrueFileName Dim FileExt Const adTypeBinary = FileName = Request QueryString( FileName ) if FileName = Then Response Write 无效文件名! Response End End if FileExt = Mid(FileName InStrRev(FileName ) + ) select Case UCase(FileExt) Case ASP ASA ASPX ASAX MDB Response Write 非法 *** 作! Response End End select Response Clear if lcase(right(FileName ))= gif or lcase(right(FileName ))= jpg or lcase(right(FileName ))= png then Response ContentType = image/* 对图像文件不出现下载对话框 else Response ContentType = application/ms download end if Response AddHeader content disposition attachment filename= & GetFileName(Request QueryString( FileName )) Set Stream = server createObject( ADODB Stream ) Stream Type = adTypeBinary Stream Open if lcase(right(FileName ))= pdf then 设置pdf类型文件目录 TrueFileName = /the_pdf_file_s/ &FileName end if if lcase(right(FileName ))= doc then 设置DOC类型文件目录 TrueFileName = /my_D_O_C_file/ &FileName end if
if lcase(right(FileName ))= gif or lcase(right(FileName ))= jpg or lcase(right(FileName ))= png then TrueFileName = /all_images_/ &FileName 设置图像文件目录 end if Stream LoadFromFile Server MapPath(TrueFileName) While Not Stream EOS Response BinaryWrite Stream Read( * ) Wend Stream Close Set Stream = Nothing Response Flush Response End %>lishixinzhi/Article/program/net/201311/11977分类: 电脑/网络 >>程序设计 >>其他编程语言
问题描述:
有的网站的图片无法外链,如163等。它的原理是什么,为何别的网站用URL调不出它的图片
解析:
防盗链原理:
标准协议中有专门的字段记录referer
一来可以追溯上一个入站地址是什么
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么。
因此所有防盗链方法都是基于这个Referer字段
网上比较多的2种
一种是使用apache文件FileMatch限制,在d.conf中增加 ( 其实也可以将把下面的语句存成一个.htaccess文件),并放到你的网站的根目录(就是/目录),这样子别人就没有办法盗连你的东东了~~
SetEnvIfNoCase Referer "^yahoo/" local_ref=1
Order Allow,Deny
Allow from env=local_ref
Allow from 127.0.0.1
这种很方便禁止非允许访问URL引用各种资源文件
请大家注意,把第一句"^yahoo/"改为你的网站,比如我的网站是: linji
我应该这么写的
"^linji/"
第二种是使用rewrite,需要增加apache的mode_rewrite,支持.htaccess文件目录权限限制
在虚拟主机根目录增加.htaccess文件,描述从定向,把非本地地址refer的图片文件都从定向到警告图片或者警告网页上。
首先要确认你的服务器或空间的服务器解译引擎为Apache2,还有支持.htaccess客户设置文件,
如果你有自己的服务器就请先对./conf/d.conf 文件做以下修改
找到:#LoadModule rewrite_module modules/mod_rewrite.so
把前面的 # 给去丢
找到等一个 AllowOverride None 改为 AllowOverride All
重启Apache2服务器
接下就是做一个 .htaccess 文件了,其 .htaccess 文件内容为
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^aaoo/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^]aaoo$ [NC]
RewriteCond %{HTTP_REFERER} !^aaoo/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^]aaoo$ [NC]
RewriteRule .*.(|jpeg|gif|png|bmp|rar|zip|exe)$ down.yoyo.ru/err [R,NC]
其中有色的地方都是要改为你的:
红色:就是改为你提供下载页面的地址,也就是只有通过这个地址才可以下载你所提供的东东。
蓝色:就是要保护文件的扩展名(以|分开),也就是说以这些为扩展名的文件只有通过红色的地址才可以访问。
绿色:如果不是通过红色的地址访问蓝色这些为扩展名的文件时就回重定向到绿色地址上。
这个方法有个好处是,不同的虚拟主机用不同的描述定义。
接下就是怎么用 .htaccess 文件来实现防盗链了。
首先要在空间上建两个目录(当然目录名随你),一个为 web 另一个为 down ,
web 是用来放下载页面的(或下载程序),down 当然就是放你提供的东东的啦,
把 .htaccess 文件的红色部分改一下,改为你的域名/web。蓝色部分
改为你要保护文件的扩展名。绿色部分改为你的域名/web。改后保存
.htaccess 文件把它上传到 down 目录。
还有第三种:
我在解决plog禁止盗链的时候,发现个问题,也算个好方法。
plog把所有资源都自己管理起来,用resserver.php来动态显示,这样统一的入口方便添加权限 *** 作。
同时造成上面2种方法无法使用,因为不再是apache直接访问资源文件,而是php通过文件读取。
因此只能在代码中做手脚:在读取资源文件输出之前,加如下判断代码
引用
$referer = $_SERVER['HTTP_REFERER']
$selfurl = $_SERVER['HTTP_HOST']
if(false == strpos($referer,$selfurl))
{
echo '非法盗链!'
exit(1)
}
这里有些偷懒,直接看引用地址中是否包含host地址,不过原理就是这样,判断referer是否是本站地址。
我们常常在下载的时候,也碰到盗链网站无法下载,报盗链的问题。要下载这类文件最简单的方法就是改referer
比方flashget中,网址下面的"引用"一栏中,直接填写下载地址就可以了。
比如,别人上传的东西,你直接拿了LINK去,贴到别的论坛或者网站,宣称"有好东西,快来下载",又或者告诉你的朋友"你要这个文件?俺有连接,快下",然后在那里接受别人的滔滔不绝的景仰之情(当然,结果就是你就别想在这里混了)什么是盗链
“盗链”的定义是:此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
为什么会产生盗链
一般浏览有一个重要的现象就是一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片,那么客户端的浏览器会再发送一条Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器回将图片安放到页面的正确位置,就这样一个完整的页面也许要经过发送多条Http请求才能够被完整的显示。基于这样的机制,就会产生一个问题,那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站。这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现,这样显然,对于那个被利用了资源的网站是不公平的。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。
我遇到的盗链
我的网站遇到最多的是两类盗链,一是图片盗链,二是文件盗链。曾经有一个访问量极大的网站盗链我网站的图片,一天竟然消耗了数G的流量。同时,我站放的不少几十兆的大型软件也常遭到文件盗链,大量消耗我站资源。
盗链的解决方案
其实通过WEB服务器的URL过滤技术,这个伤脑筋的问题会很容易得到解决。
如果WEB服务器用的是APACHE的话,那么使用APACHE自带的Url Rewrite功能可以很轻松地防止各种盗链,其原理是检查REFER,如果REFER的信息来自其他网站则禁止访问所需要的资源。
那么,IIS支持UrlRewrite吗?
答案很简单,不支持。但是我们可以通过安装第三方服务器扩展让IIS支持。
目前有一种产品能比较好地支持IIS的UrlRewrite,名字叫ISAPI_Rewrite。
下载地址在: http://www.helicontech.com/download/
这里只有ISAPI Rewrite的一个LITE版本是免费的,其它都是trial版本。ISAPI Rewrite Lite的版本功能不支持虚拟站点配置,元数据监测和自动缓存清理。 但是基本的UrlRewrite功能都支持。
如何进行UrlRewrite的设置?
isapi_rewrite利用正则表达式进行替换规则的表示。
下面是一个简单的例子,我想让我们的用户输入 http://localhost/test-12314.html 实际上访问的是 http://localhost/test.asp?id=12314 。那么我们的匹配表达式应该是 /test-([0-9]*).html 对应的格式化表达式应该为 /test.asp\?id=$1 。
进行正则表达式的编写的时候,可以利用isapi_rewrite提供的正则表达式测试工具(默认安装提供),进行调试。做好了匹配表达式和格式化表达式,我们可以把它们放到安装目录下的httpd.ini里面。文件保存后,不需重新启动iis即可生效。
对于我的网站,我防盗链的方法是在httpd.ini里面加入如下语句
RewriteCond Host: (.+)
RewriteCond Referer: (?!http://\1.*).*
RewriteRule .*\.(?:gif|jpg|png|exe|rar|zip) /block.gif [I,O]
然后重启IIS,这时防盗链就开始起作用了,其他网站盗链过来的请求都会被拒绝。
至此,我也终于可以摆脱了被盗链的烦恼了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)