2010-09-22 70 views
2

我正在一個網站上工作,我需要防止直接鏈接到幾個pdf文件。我正在使用ASP.net 2.0。代碼中有一個簡單的方法來做到這一點?或一些簡單的IIS設置?我如何防止直接鏈接到幾個pdf文件?

現在我只是使用一個標準的錨標記鏈接到文件。我可以在包含錨標記的頁面上驗證用戶,但仍然不會阻止用戶抓取網址並將其傳遞給其他人。

回答

2

我已經解決了這個問題,通過使用file-fetcher asp頁面並使用頭中正確的內容類型來流式傳輸所需文件的字節。大致爲:

  1. 創建頁面fetchfile.aspx

  2. 樣品網址:yoursite/fetchfile.aspx N = pdfname.pdf

  3. 在fetchfile:

    - Verify user is permitted to access file. 
    - Check chosen directory for presence of file from query string. 
    - Set content-type appropriately for file type. 
    - Open the file and stream all bytes of it to the client. 
    - Close the file and end the response. 
    

除了文件的字節之外,不要在響應中發送任何內容。如果發生錯誤,請將內容類型集正確地重定向或返回錯誤html。

我最後一次做這個時,我提供了圖像,所以我找到了一個合適的免費圖書館,並將我的錯誤消息寫入一個新的自定義圖像,然後可以顯示。爲了好玩,你可以使用這種技術就可以提供的內容是意想不到的,當有人通過熱聯這樣偷你的帶寬:

  1. 創建不必要的引用名稱的黑名單,在數據庫表或文本文件。

  2. 當文件請求進入時,如果用戶不被允許,檢查引用者是否在黑名單中,如果沒有,則讓文件被讀取。

  3. 定期檢查參考頁面並決定合適的pdf返回來懲罰該網站。

  4. 將您想要返回到您的黑名單中的內容添加到每個推薦人,以及當推薦人IS位於黑名單中時,然後返回備用內容。

這是讓人們真的不太可能偷走你的東西的好方法。他們的體驗如下:

  1. 他們發現一些他們想要「借」的好內容。

  2. 他們發佈在他們的網站上,它工作得很好。

  3. 第二天你看到他們的動作並將它們添加到黑名單表中,但是讓所有嘗試獲取內容的人都可以獲得某種好消息:「example.com正在竊取來自所有者的此內容在somecoolsite.com。請讓他們知道你對他們的行爲感到不滿。「

  4. 你有一個良好的笑。

如果被盜的內容,這可能特別美妙的圖像。糗事嘉豪在等着帶寬小偷!

一些額外的巧妙IP -address和時間比較可能會使得可以顯示正確的內容,以實際行爲人,但錯誤的內容,他的任何網站訪問者...邪惡和美味的。

0

將PDF文件放入目錄。使用.htaccess和或robots.text。

+1

是否與ASP.NET/IIS工作? – 2010-09-22 02:24:49

+0

robots.txt適合表現良好的服務,任何濫用行爲都會忽略它。 – annakata 2010-09-22 08:03:57

+0

Annakata - true。 – Moshe 2010-09-22 14:01:39

1

將文件放在您的App_Data文件夾中,併爲他們提供服務我們一個HttpHandler。在處理程序中,您可以檢查Session.IsNewSession屬性以查看請求是否來自網站外部。但是你可能想要在處理程序中包含某種認證和驗證。

3

創建一個HttpHandler來處理.pdf的所有請求。由於ASP.Net並不處理PDF文件,HttpHandler將干預並且web.config告訴IIS這樣做。

守則

namespace YourNameSpace 
{ 
    public class HttpHandlerClassName: IHttpHandler 
    { 
     public bool IsReusable 
     { 
      //We dont want this class to be reused simply        
       //because we dont want other requests to wait and lie pending        
      //suggests that an instance of this class cannot 
      //be reused to serve more than one request. 

      get { return false; } 
     } 

     public void ProcessRequest(HttpContext context) 
     {         
      string MyReferrer = context.Request.UrlReferrer.ToString(); 

      //do some regex to determine if the request is originating from 
      //your site. 
      //Put logic for the behavior your want for the outcome of your 
      //RegEx match here 
     }   
    }  
} 

的web.config

<system.web> 
     <httpHandlers> 
     <add verb="*" path="*.pdf" type="YourNameSpace.HttpHandlerClassName,YourAssemblyName"/> 
     </httpHandlers> 
    </system.web> 
+0

是的,這是另一種做法! – ErikE 2010-09-22 16:07:44

+1

這是**正確**的方式來做到這一點。使用aspx頁面是一個沉重的過程,因爲它貫穿整個頁面生命週期。 – 2011-12-11 08:04:41