Asp.net防止盜鏈的實(shí)現(xiàn)原理分析
原理解釋
網(wǎng)上現(xiàn)在比較流行的是使用handler來(lái)實(shí)現(xiàn)防盜鏈。具體的意思如下:專門新建一個(gè)針對(duì)某種文件請(qǐng)求的處理類(繼承于IHttpHandler)并在 web.config里面配置好所有的該文件請(qǐng)求都指向該類。然后在類里面判斷該請(qǐng)求的前一次請(qǐng)求是不是存在并且指向我們站的域名,如果存在則認(rèn)為不是盜鏈,返回真實(shí)的文件。否則返回error圖片。
讓我們?cè)O(shè)想一下如果現(xiàn)在另外一個(gè)網(wǎng)站引用了我們站的圖片,并應(yīng)用到了一篇文章當(dāng)中?,F(xiàn)在有個(gè)人請(qǐng)求那個(gè)網(wǎng)站的文章,用戶的request是向他們的服務(wù)器發(fā)出的,他們站的服務(wù)器返回html讓瀏覽器解析。瀏覽器解析到我們的圖片地址時(shí)他會(huì)向我們站發(fā)起這個(gè)圖片的請(qǐng)求。因?yàn)槲覀兂绦虻脑O(shè)置這個(gè)請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到我們特定的類做處理,程序判斷這個(gè)request前面的請(qǐng)求是不是為空(顯然它只請(qǐng)求了我們的圖片其他沒有請(qǐng)求,所以當(dāng)然沒有前面的請(qǐng)求),為空則返回 error圖片。理解了上面的過(guò)程就容易知道為什么請(qǐng)求我們站的那個(gè)網(wǎng)頁(yè)時(shí)里面的圖片則正確顯示了,用戶顯示request了那個(gè)頁(yè)面,所以里面當(dāng)然有前面訪問(wèn)的記錄。當(dāng)瀏覽器解析我們站的圖片時(shí)候就正確返回了。不知道大家懂了沒呢?
代碼實(shí)現(xiàn)
首先創(chuàng)建一個(gè)類繼承于IHttpHandler,我這里就叫做ForbiddenInvaliteDownload類了:
代碼
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
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這個(gè)判斷一下前面一個(gè)請(qǐng)求是否存在,存在則認(rèn)為是合法的,否則不合法。
僅僅是這個(gè)類還不能將所有的jpg請(qǐng)求轉(zhuǎn)發(fā)過(guò)來(lái),我們需要配置一下webconfig,在System.Web下配置:
代碼
<httpHandlers>
<add verb="*" path="*.jpg" type="Namespace.ForbiddenInvaliteDownload,Namespace"/>
</httpHandlers>
這里還要提到的是IIS默認(rèn)是不會(huì)為JPG文件發(fā)送請(qǐng)求的,而是直接獲取。所以我們還要在iis里面配置一下讓所有的jpg請(qǐng)求都轉(zhuǎn)發(fā)到我們的那個(gè)處理程序,而不是iis默認(rèn)的直接獲得。配置如圖:
至此,你的網(wǎng)站已經(jīng)可以防止jpg文件被盜了。當(dāng)然,其他的zip等等文件同樣也可以實(shí)現(xiàn),您可以處理一個(gè)通用類,根據(jù)請(qǐng)求的后綴判斷是什么類型從而進(jìn)行操作。下面是效果圖:
結(jié)束了嗎
上面的方式并不能防止迅雷等下載軟件的下載,在迅雷里面輸入這些地址照樣可以下載。如果別的站引用了你的某個(gè).zip的文件鏈接,這樣還是可以直接下載到的。那該如何解決呢?我目前想到的就是加入session驗(yàn)證。
如果用戶訪問(wèn)了你的下載頁(yè)面則在load里面設(shè)置session[“visited”]=”true”,然后在下載里面增加一個(gè)session驗(yàn)證,代碼如下(注意,需要繼承
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();
}
這樣我們調(diào)試的時(shí)候調(diào)用迅雷下載這個(gè)圖片就可以發(fā)現(xiàn)session里面是沒有值的,當(dāng)然就下載error圖片了。
相關(guān)文章
Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能
這篇文章主要介紹了Asp.net Core 3.1基于AspectCore實(shí)現(xiàn)AOP實(shí)現(xiàn)事務(wù)、緩存攔截器功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12.net通過(guò)Action進(jìn)行Options參數(shù)的傳遞的方法
在.NET Core中,使用Action和Options參數(shù)方式配置服務(wù)并將配置信息對(duì)象注冊(cè)到IServiceCollection的好處在于,它提供了更高級(jí)別的可配置性和可擴(kuò)展性,這篇文章主要介紹了.net通過(guò)Action進(jìn)行Options參數(shù)的傳遞,你知道是怎么實(shí)現(xiàn)的嗎,需要的朋友可以參考下2023-12-12asp.net下出現(xiàn)其中的組件“訪問(wèn)被拒絕”的解決方法
asp.net下出現(xiàn)其中的組件“訪問(wèn)被拒絕”的解決方法...2007-04-04asp.net(c#)獲取內(nèi)容第一張圖片地址的函數(shù)
C#獲取文章類第一張圖片的地址的函數(shù)(留著以后用),先說(shuō)一下思路2009-11-11DataGrid使用心得(調(diào)用及連接數(shù)據(jù)庫(kù)等等)
在工作中遇到把DataGrid中綁定的后臺(tái)數(shù)據(jù)庫(kù)數(shù)據(jù)展示給用戶時(shí)把負(fù)數(shù)變?yōu)?的小問(wèn)題,現(xiàn)在把它記錄下來(lái)包括DataGrid的調(diào)用/連接數(shù)據(jù)庫(kù)進(jìn)行操作等等,感興趣的朋友可以了解下,或許本新得對(duì)你有所幫助2013-02-02