海妖 发表于 2015-1-16 22:19:41

ASP.NET编程:Asp.net避免盗链的完成道理剖析

你所列的那些其实差不多都可以称为应用服务器(servlet应该说是一种语言更合适)java是开放的,相同的工具就会有很多公司在做,加上java已经发展了很多年了,因此这些工具就很多了。他们很多都是类似的。假如被援用的站对照小如许外站盗链带来的“无感化”流量就给站长带来了压力了(流量也是要钱滴)。关于防盗链能够从两个方面来防,一个是服务器,一个是程序内里判别。各个服务器的判别纷歧样,iis必要安装特定的防盗链软件。我们明天次要会商的是程序里完成防盗链。

道理注释

网上如今对照盛行的是利用handler来完成防盗链。详细的意义以下:专门新建一个针对某种文件哀求的处置类(承继于IHttpHandler)并在web.config内里设置好一切的该文件哀求都指向该类。然后在类内里判别该哀求的前一次哀求是否是存在而且指向我们站的域名,假如存在则以为不是盗链,前往实在的文件。不然前往error图片。

让我们假想一下假如如今别的一个网站援用了我们站的图片,并使用到了一篇文章傍边。如今有团体哀求谁人网站的文章,用户的request是向他们的服务器收回的,他们站的服务器前往html让扫瞄器剖析。扫瞄器剖析到我们的图片地点时他会向我们站倡议这个图片的哀求。由于我们程序的设置这个哀求会被转发到我们特定的类做处置,程序判别这个request后面的哀求是否是为空(明显它只哀求了我们的图片其他没有哀求,以是固然没有后面的哀求),为空则前往error图片。了解了下面的历程就简单晓得为何哀求我们站的谁人网页时内里的图片则准确显现了,用户显现request了谁人页面,以是内里固然有后面会见的纪录。当扫瞄器剖析我们站的图片时分就准确前往了。不晓得人人懂了没呢?

代码完成

起首创立一个类承继于IHttpHandler,我这里就叫做ForbiddenInvaliteDownload类了:
代码
复制代码代码以下:
publicboolIsReusable
{
get{returntrue;}
}
publicvoidProcessRequest(HttpContextcontext)
{
if(null!=context.Request.UrlReferrer)
{
context.Response.Expires=0;
context.Response.Clear();
context.Response.ContentType="image/jpg";
context.Response.WriteFile(context.Request.PhysicalPath);
context.Response.End();
}
else
{
context.Response.Expires=0;
context.Response.Clear();
context.Response.ContentType="text/html";
context.Response.Write("盗链");
context.Response.End();
}
}

代码很少,人人一看就分明了。就是用context.Request.UrlReferrer这个判别一下后面一个哀求是不是存在,存在则以为是正当的,不然分歧法。
仅仅是这个类还不克不及将一切的jpg哀求转发过去,我们必要设置一下webconfig,在System.Web下设置:
代码
复制代码代码以下:
<httpHandlers>
<addverb="*"path="*.jpg"type="Namespace.ForbiddenInvaliteDownload,Namespace"/>
</httpHandlers>

这里还要提到的是IIS默许是不会为JPG文件发送哀求的,而是间接猎取。以是我们还要在iis内里设置一下让一切的jpg哀求都转发到我们的谁人处置程序,而不是iis默许的间接取得。设置如图:


至此,你的网站已能够避免jpg文件被盗了。固然,其他的zip等等文件一样也能够完成,您能够处置一个通用类,依据哀求的后缀判别是甚么范例从而举行操纵。上面是最终效果:


停止了吗
下面的体例其实不能避免迅雷等下载软件的下载,在迅雷内里输出这些地点还是能够下载。假如其余站援用了你的某个.zip的文件链接,如许仍是能够间接下载到的。那该怎样办理呢?我今朝想到的就是到场session考证。
假如用户会见了你的下载页面则在load内里设置session[“visited”]=”true”,然后鄙人载内里增添一个session考证,代码以下(注重,必要承继
System.Web.SessionState.IRequiresSessionState才干利用session):
代码
复制代码代码以下:
if(null!=context.Request.UrlReferrer&&context.Session["visited"]=="true")
{
context.Response.Expires=0;
context.Response.Clear();
context.Response.ContentType="image/jpg";
context.Response.WriteFile(context.Request.PhysicalPath);
context.Response.End();
}
else
{
context.Response.Expires=0;
context.Response.Clear();
context.Response.ContentType="image/jpg";
context.Response.WriteFile(context.Request.PhysicalApplicationPath+"Images/2.jpg");
context.Response.End();
}

如许我们调试的时分挪用迅雷下载这个图片就能够发明session内里是没有值的,固然就下载error图片了。
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。

灵魂腐蚀 发表于 2015-1-19 08:43:34

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。

小魔女 发表于 2015-1-25 21:52:48

PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。

分手快乐 发表于 2015-2-4 06:28:46

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。

简单生活 发表于 2015-2-27 13:24:37

目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.

若相依 发表于 2015-3-9 05:48:38

在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的

爱飞 发表于 2015-3-16 21:07:27

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

蒙在股里 发表于 2015-3-23 03:45:03

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
页: [1]
查看完整版本: ASP.NET编程:Asp.net避免盗链的完成道理剖析