2010-09-22 55 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