我们有一个安全的网站(在Windows服务器和IIS 5上运行的.NET 2.0 / C#中开发),成员必须登录,然后他们才能查看存储在虚拟目录中的一些PDF文件。为了防止蜘蛛抓取这个网站,我们有一个robots.txt,它将禁止所有用户代理进入。但是,这不会阻止Rogue蜘蛛索引PDF文件,因为他们会忽略robots.txt命令。由于文件是安全的,我不希望任何蜘蛛进入这个虚拟目录(甚至不是好的)。
阅读网上的一些文章,并想知道程序员(而不是网站管理员)如何在他们的应用程序中解决了这个问题,因为这似乎是一个非常常见的问题。网上有很多选择,但我正在寻找简单而优雅的东西。
我见过的一些选项,但似乎很弱。在此列出他们的缺点:
创建一个Honeypot / tarpit,允许恶意蜘蛛进入,然后列出他们的IP地址。缺点:这也可以阻止来自同一IP的有效用户,需要手动维护此列表或者有一些方法让成员从列表中删除自己。我们没有一系列有效会员将使用的IP,因为该网站在互联网上。
请求标头分析:然而,流氓蜘蛛使用真正的代理名称,所以这是毫无意义的。
Meta-Robots标签:缺点:只有谷歌和其他有效的蜘蛛才能遵守。
有一些关于使用.htaccess的讨论,假设它很好,但那只会是apache,而不是IIS。
非常感谢任何建议。
编辑:正如9000所指出的那样,流氓蜘蛛不应该进入需要登录的页面。我想问题是“如何防止知道链接表单的人请求PDF文件而不登录网站”。
答案 0 :(得分:3)
我看到了
之间的矛盾成员必须登录,然后他们才能查看存储在虚拟目录中的一些PDF文件
和
这不会阻止Rogue蜘蛛索引PDF文件
对于此目录的任何未经授权的HTTP请求是如何使用除代码401以外的其他内容提供的?胭脂蜘蛛当然不能提供授权cookie。如果目录可供他们访问,那么什么是“成员登录”呢?
您可能需要通过检查授权的脚本来提供PDF文件。我认为IIS也只需要一个目录访问授权(但我真的不知道)。
答案 1 :(得分:1)
我认为您的PDF链接来自已知位置。您可以查看Request.UrlReferrer
以确保用户来自此内部/已知页面以访问PDF。
我肯定会强制下载通过一个脚本,您可以在允许下载之前检查用户是否实际登录到该站点。
protected void getFile(string fileName) {
/*
CHECK AUTH / REFERER HERE
*/
string filePath = Request.PhysicalApplicationPath + "hidden_PDF_directory/" + fileName;
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
if (fileInfo.Exists) {
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileInfo.Name);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.ContentType = "application/pdf";
Response.WriteFile(fileInfo.FullName);
Response.End();
} else {
/*
ERROR
*/
}
}
未经测试,但至少应该给你一个想法。
我也会远离robots.txt,因为人们经常会用它来实际寻找你认为隐藏的东西。
答案 2 :(得分:1)
这就是我所做的(扩展Leigh的代码)。
为PDF文件创建了一个HTTPHandler,在安全目录上创建了一个web.config,并配置了Handler来处理PDF。
在处理程序中,我检查用户是否使用应用程序设置的会话变量登录。
如果用户有会话变量,我创建一个fileInfo对象并在响应中发送它。注意:不要做'context.Response.End()','Content-Disposition'也是过时的。
现在,即使在安全目录上有PDF请求,HTTP处理程序也会获取请求并检查用户是否已登录。如果没有,则显示错误消息,否则显示该文件。
不确定是否因为我创建fileInfo对象并发送它而导致性能下降,而不是发送已存在的文件。问题是您不能将Server.Transfer或Response.Redirect转移到* .pdf文件,因为您正在创建一个无限循环,并且响应将永远不会返回给用户。