


Asp.net防止盜鏈的實現(xiàn)原理分析
添加時間:2014-8-11 18:56:14
添加:
思海網(wǎng)絡
如果被引用的站比較小這樣外站盜鏈帶來的“無作用”流量就給站長帶來了壓力了(流量也是要錢滴)。對于防盜鏈可以從兩個方面來防,一個是服務器,一個是程序里面判斷。各個服務器的判斷不一樣,iis需要安裝特定的防盜鏈軟件。我們今天主要討論的是程序里實現(xiàn)防盜鏈。
原理解釋
網(wǎng)上現(xiàn)在比較流行的是使用handler來實現(xiàn)防盜鏈。具體的意思如下:專門新建一個針對某種文件請求的處理類(繼承于IHttpHandler)并在 web.config里面配置好所有的該文件請求都指向該類。然后在類里面判斷該請求的前一次請求是不是存在并且指向我們站的域名,如果存在則認為不是盜鏈,返回真實的文件。否則返回error圖片。
讓我們設想一下如果現(xiàn)在另外一個網(wǎng)站引用了我們站的圖片,并應用到了一篇文章當中。現(xiàn)在有個人請求那個網(wǎng)站的文章,用戶的request是向他們的服務器發(fā)出的,他們站的服務器返回html讓瀏覽器解析。瀏覽器解析到我們的圖片地址時他會向我們站發(fā)起這個圖片的請求。因為我們程序的設置這個請求會被轉(zhuǎn)發(fā)到我們特定的類做處理,程序判斷這個request前面的請求是不是為空(顯然它只請求了我們的圖片其他沒有請求,所以當然沒有前面的請求),為空則返回 error圖片。理解了上面的過程就容易知道為什么請求我們站的那個網(wǎng)頁時里面的圖片則正確顯示了,用戶顯示request了那個頁面,所以里面當然有前面訪問的記錄。當瀏覽器解析我們站的圖片時候就正確返回了。不知道大家懂了沒呢?
代碼實現(xiàn)
首先創(chuàng)建一個類繼承于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這個判斷一下前面一個請求是否存在,存在則認為是合法的,否則不合法。
僅僅是這個類還不能將所有的jpg請求轉(zhuǎn)發(fā)過來,我們需要配置一下webconfig,在System.Web下配置:
代碼
<httpHandlers>
<add verb="*" path="*.jpg" type="Namespace.ForbiddenInvaliteDownload,Namespace"/>
</httpHandlers>
這里還要提到的是IIS默認是不會為JPG文件發(fā)送請求的,而是直接獲取。所以我們還要在iis里面配置一下讓所有的jpg請求都轉(zhuǎn)發(fā)到我們的那個處理程序,而不是iis默認的直接獲得。配置如圖:
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();
}
原理解釋
網(wǎng)上現(xiàn)在比較流行的是使用handler來實現(xiàn)防盜鏈。具體的意思如下:專門新建一個針對某種文件請求的處理類(繼承于IHttpHandler)并在 web.config里面配置好所有的該文件請求都指向該類。然后在類里面判斷該請求的前一次請求是不是存在并且指向我們站的域名,如果存在則認為不是盜鏈,返回真實的文件。否則返回error圖片。
讓我們設想一下如果現(xiàn)在另外一個網(wǎng)站引用了我們站的圖片,并應用到了一篇文章當中。現(xiàn)在有個人請求那個網(wǎng)站的文章,用戶的request是向他們的服務器發(fā)出的,他們站的服務器返回html讓瀏覽器解析。瀏覽器解析到我們的圖片地址時他會向我們站發(fā)起這個圖片的請求。因為我們程序的設置這個請求會被轉(zhuǎn)發(fā)到我們特定的類做處理,程序判斷這個request前面的請求是不是為空(顯然它只請求了我們的圖片其他沒有請求,所以當然沒有前面的請求),為空則返回 error圖片。理解了上面的過程就容易知道為什么請求我們站的那個網(wǎng)頁時里面的圖片則正確顯示了,用戶顯示request了那個頁面,所以里面當然有前面訪問的記錄。當瀏覽器解析我們站的圖片時候就正確返回了。不知道大家懂了沒呢?
代碼實現(xiàn)
首先創(chuàng)建一個類繼承于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這個判斷一下前面一個請求是否存在,存在則認為是合法的,否則不合法。
僅僅是這個類還不能將所有的jpg請求轉(zhuǎn)發(fā)過來,我們需要配置一下webconfig,在System.Web下配置:
代碼
復制代碼 代碼如下:
<httpHandlers>
<add verb="*" path="*.jpg" type="Namespace.ForbiddenInvaliteDownload,Namespace"/>
</httpHandlers>
這里還要提到的是IIS默認是不會為JPG文件發(fā)送請求的,而是直接獲取。所以我們還要在iis里面配置一下讓所有的jpg請求都轉(zhuǎn)發(fā)到我們的那個處理程序,而不是iis默認的直接獲得。配置如圖:
至此,你的網(wǎng)站已經(jīng)可以防止jpg文件被盜了。當然,其他的zip等等文件同樣也可以實現(xiàn),您可以處理一個通用類,根據(jù)請求的后綴判斷是什么類型從而進行操作。下面是效果圖:
結束了嗎
上面的方式并不能防止迅雷等下載軟件的下載,在迅雷里面輸入這些地址照樣可以下載。如果別的站引用了你的某個.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();
}
這樣我們調(diào)試的時候調(diào)用迅雷下載這個圖片就可以發(fā)現(xiàn)session里面是沒有值的,當然就下載error圖片了。
關鍵字:Asp.net、盜鏈、服務器
新文章:
- CentOS7下圖形配置網(wǎng)絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認iptable規(guī)則詳解