日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载

發布時間:2025/7/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

昨天粗略講了一下IHttpHandler接口的作用和動態給圖片添加水印的處理,如果對這些不太清除的朋友,建議看看這篇《IHttpHandler的妙用(1):給圖片添加水印》:http://blog.csdn.net/zhoufoxcn/archive/2008/01/10/2033530.aspx 昨天也提到了IHttpHandler接口主要有一個IsReusable屬性和一個Proce***equest方法,利用這個方法我們可以處理很多事情的,昨天我們利用了這個方法給圖片動態添加了水印,今天我再來展示另一種用法。 大家查看一個msdn,可以看到它的聲明如下:
Visual?Basic(聲明)?
Sub?Proce***equest?(?_
????context?As?HttpContext?_
)
?
Visual?Basic(用法)?
Dim?instance?As?IHttpHandler
Dim?context?As?HttpContext

instance.Proce***equest(context)
?
C#?
void?Proce***equest?(
????HttpContext?context
)
注意這個HttpContext對象,它提供對用于為 HTTP 請求提供服務的內部服務器對象(如 Request、Response、Session 和 Server)的引用。? 有了它我們就方便多了,因為我們的下載資源一般都會有一個下載介紹(假設為details.aspx?id=***),用戶查看介紹之后,如果愿意下載,就會點擊下載鏈接,這個鏈接也是一個頁面(假設為download.aspx?id=***),我們就可以得出結論,只要是用戶通過我們的網站下載這些資源,那么在下載資源之前訪問那個頁面(簡稱前導頁,下同)一定是details.aspx,因此我們就可以得出結論只要是下載之前的前導頁不是details.aspx這個頁面,那個這個下載請求一定是別的網站盜鏈(其實還可以放寬一點,在下載之前的前導頁一定是本站的頁面,也還可以要求更緊一點,下載之前訪問的頁面的id值一定要與下載的id值一致,這就看大家的實際要求了)! 有了這個推論之后,我們就可以動手寫代碼了:
using?System;
using?System.IO;
using?System.Web;

///?<summary>
///?說明:DownloadHandler是一個防盜鏈的類,它可以防止本站資源被別的網站盜用
///?作者:周公
///?日期:2008-1-11
///?首發地址:http://blog.csdn.net/zhoufoxcn
///?</summary>
public?class?DownloadHandler:IHttpHandler
{
????
public?DownloadHandler()
????{
????????
//
????????
//?TODO:?在此處添加構造函數邏輯
????????
//
????}

????
#region?IHttpHandler?成員
????
///?<summary>
????
///?指示IHttpHandler?實例是否可再次使用
????
///?</summary>
????public?bool?IsReusable
????{
????????
get?{?return?true;?}
????}
????
///?<summary>
????
///?處理請求的方法
????
///?</summary>
????
///?<param?name="context">它提供對用于為?HTTP?請求提供服務的內部服務器對象(如?Request、Response、Session?和?Server)的引用。</param>
????public?void?Proce***equest(HttpContext?context)
????{
????????Uri?referrerUri?
=?context.Request.UrlReferrer;//獲取下載之前訪問的那個頁面的uri
????????Uri?currentUri?=?context.Request.Url;
????????
if?(referrerUri?==?null)//沒有前導頁,直接訪問下載頁
????????{
????????????
//輸出提示,可以根據自身要求完善此處代碼
????????????context.Response.Write("請不要盜鏈本站資源,請從首頁訪問。<a?href='index.aspx'>首頁</a>");
????????????
return;
????????}
????????
#region?判斷前導頁是否位于本站可以用此段代碼
????????
//if?(referrerUri.Host?==?currentUri.Host)//前導頁和當前請求頁位于同一個主機
????????
//{
????????
//????//用戶是通過正常路徑訪問的,向用戶提供下載文件
????????
//????//實際情況是根據id從數據庫找到文件的物理路徑,然后輸出
????????
//????//為了簡單代碼,僅僅演示流程,這里我直接輸出了文件
????????
//????//周公注。2008-1-11
????????
//????//獲取請求的物理文件路徑
????????
//????WriteFile(context);
????????
//}
????????
//else
????????
//{
????????
//????//輸出提示,可以根據自身要求完善此處代碼
????????
//????context.Response.Write("請不要盜鏈本站資源,請從首頁訪問。<a?href='index.aspx'>首頁</a>");
????????
//}
????????#endregion
????????
#region?判斷前導頁是否是我們的介紹頁面
????????
string?referrerPage?=?referrerUri.LocalPath.Substring(referrerUri.LocalPath.LastIndexOf('/')+1);
????????
if?(referrerPage?==?"Details.aspx")//如果前導頁是我們的介紹頁面
????????{
????????????
//用戶是通過正常路徑訪問的,向用戶提供下載文件
????????????
//實際情況是根據id從數據庫找到文件的物理路徑,然后輸出
????????????
//為了簡單代碼,僅僅演示流程,這里我直接輸出了文件
????????????
//周公注。2008-1-11
????????????
//獲取請求的物理文件路徑
????????????WriteFile(context);
????????}
????????
else
????????{
????????????
//輸出提示,可以根據自身要求完善此處代碼
????????????context.Response.Write("請不要盜鏈本站資源,請從首頁訪問。<a?href='index.aspx'>首頁</a>");
????????}
????????
#endregion

????}

????
private?void?WriteFile(HttpContext?context)
????{
????????
//用戶是通過正常路徑訪問的,向用戶提供下載文件
????????
//實際情況是根據id從數據庫找到文件的物理路徑,然后輸出
????????
//為了簡單代碼,僅僅演示流程,這里我直接輸出了文件
????????
//周公注。2008-1-11
????????
//獲取請求的物理文件路徑
????????string?path?=?context.Request.PhysicalPath;
????????
//注意這里rar文件的ContentType是application/octet-stream
????????
//不同格式文件的contentType有可能不同
????????context.Response.ContentType?=?"application/octet-stream";
????????context.Response.WriteFile(path);
????}

????
#endregion
}
對web.config的配置:
<?xml?version="1.0"?>
<!--?
????注意:?除了手動編輯此文件以外,您還可以使用?
????Web?管理工具來配置應用程序的設置。可以使用?Visual?Studio?中的
?????“網站”->“Asp.Net?配置”選項。
????設置和注釋的完整列表在?
????machine.config.comments?中,該文件通常位于?
????WindowsMicrosoft.NetFrameworkv2.xConfig?中
-->
<configuration>
????
<appSettings>
????????
<!--添加到圖片上的水印文字-->
????????
<add?key="WaterMark"?value="http://blog.csdn.net/zhoufoxcn"/>
????????
<!--水印文字的字體大小-->
????????
<add?key="Font-Size"?value="72"/>
????
</appSettings>
????
<connectionStrings/>
????
<system.web>
????????
<!--?
????????????設置?compilation?debug="true"?將調試符號插入
????????????已編譯的頁面中。但由于這會?
????????????影響性能,因此只在開發過程中將此值?
????????????設置為?true。
????????
-->
????????
<compilation?debug="true"/>
????????
<!--
????????????通過?<authentication>?節可以配置?ASP.NET?使用的?
????????????安全身份驗證模式,
????????????以標識傳入的用戶。?
????????
-->
????????
<authentication?mode="Windows"/>
????????
<!--
????????????如果在執行請求的過程中出現未處理的錯誤,
????????????則通過?<customErrors>?節可以配置相應的處理步驟。具體說來,
????????????開發人員通過該節可以配置
????????????要顯示的?html?錯誤頁
????????????以代替錯誤堆棧跟蹤。

????????<customErrors?mode="RemoteOnly"?defaultRedirect="GenericErrorPage.htm">
????????????<error?statusCode="403"?redirect="NoAccess.htm"?/>
????????????<error?statusCode="404"?redirect="FileNotFound.htm"?/>
????????</customErrors>
????????
-->
????????
<httpHandlers>
??????
<!--只處理UploadImages目錄下的jpg文件,別的目錄下的圖片不處理-->
????????????
<add?path="UploadImages/*.jpg"?verb="*"?type="ImageHandler"/>
??????
<!--所有的對zip、rar、iso文件的請求都由DownloadHandler處理-->
??????
<add?path="*.zip"?verb="*"?type="DownloadHandler"/>
??????
<add?path="*.rar"?verb="*"?type="DownloadHandler"/>
??????
<add?path="*.iso"?verb="*"?type="DownloadHandler"/>
????????
</httpHandlers>
????
</system.web>
</configuration> 前導頁(Details.aspx):
<%@?Page?Language="C#"?AutoEventWireup="true"?CodeFile="Details.aspx.cs"?Inherits="Details"?%>

<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????
<title>無標題頁</title>
</head>
<body>
????
<form?id="form1"?runat="server">
????
<div>
????
<a?href="Download.aspx?id=1">下載</a>
????
</div>
????
</form>
</body>
</html> 下載頁沒有什么html代碼,主要是后臺代碼。下載頁后臺代碼(Download.aspx.cs):
using?System;
using?System.Data;
using?System.Configuration;
using?System.Collections;
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?Download?:?System.Web.UI.Page
{
????
protected?void?Page_Load(object?sender,?EventArgs?e)
????{
????????
if?(!Page.IsPostBack)
????????{
????????????CheckUser();
????????????
//實際情況是根據id從數據庫找到文件的物理路徑,然后輸出
????????????
//為了簡單代碼,僅僅演示流程,這里我直接輸出了文件
????????????
//周公注。2008-1-11
????????????
//首發地址:http://blog.csdn.net/zhoufoxcn
????????????Response.Redirect("download/demo.rar");//這里就會交給DownloadHanddler處理了
????????}
????}
????
//檢查用戶登錄等信息
????private?void?CheckUser()
????{
????????
//僅僅演示,具體代碼根據具體要求編寫
????????
//比如用戶沒有登錄如何處理,用戶沒有下載權限如何處理等
????????return;
????}
}
正常流程截圖:
(一)先打開介紹頁面:

(二)點擊下載鏈接進入下載頁面:

此時出現文件保存對話框,情況正常。 再看盜鏈情況(非正常情況):
(一)打開首頁(非前導頁,跳過這一步也沒有關系)

(二)直接訪問下載頁面或者直接訪問下載文件的實際url地址:

此時出現了我們自定義的錯誤提示,甚至地址欄上都出現了該文件的物理地址,可是就是沒有辦法下載,此時就算是利用迅雷等下載軟件,下載到的也是一個無效的文件,如圖:

這樣就達到我們的目地了,不是通過正常途徑來下載是沒有辦法下載到他需要的文件的。 順便說一下,寫作本文時我是邊編寫代碼邊測試的(本博客原創的代碼都是如此,測試通過之后方才發表,所以一般不會有什么問題,如果你學習的過程中發現有任何錯誤,請仔細檢查你的代碼,因為各人本地環境不同,出錯原因各異,恕本人不一一指出你代碼的錯誤之處)。

轉載于:https://blog.51cto.com/zhoufoxcn/167036

總結

以上是生活随笔為你收集整理的IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。