Security 防止流氓爬行器索引目录
我们有一个安全的网站(在运行Windows server和IIS 5的.NET 2.0/C#中开发),会员必须登录该网站,然后才能查看存储在虚拟目录中的一些PDF文件。为了防止蜘蛛在这个网站上爬行,我们有一个robots.txt,它将禁止所有用户代理进入。但是,这不会阻止流氓爬行器索引PDF文件,因为它们会忽略robots.txt命令。因为文档是安全的,所以我不希望任何爬行器进入这个虚拟目录(即使是好的也不希望) 在网上读几篇文章,想知道程序员(而不是网络管理员)是如何在他们的应用程序中解决这个问题的,因为这似乎是一个非常常见的问题。网上有很多选择,但我正在寻找一些简单和优雅的东西 我看到了一些选择,但似乎很薄弱。这里列出了他们的缺点:Security 防止流氓爬行器索引目录,security,iis,virtual-directory,web-crawler,Security,Iis,Virtual Directory,Web Crawler,我们有一个安全的网站(在运行Windows server和IIS 5的.NET 2.0/C#中开发),会员必须登录该网站,然后才能查看存储在虚拟目录中的一些PDF文件。为了防止蜘蛛在这个网站上爬行,我们有一个robots.txt,它将禁止所有用户代理进入。但是,这不会阻止流氓爬行器索引PDF文件,因为它们会忽略robots.txt命令。因为文档是安全的,所以我不希望任何爬行器进入这个虚拟目录(即使是好的也不希望) 在网上读几篇文章,想知道程序员(而不是网络管理员)是如何在他们的应用程序中解决这个
编辑:正如下面9000所指出的,流氓蜘蛛不应该进入需要登录的页面。我想问题是“如何防止知道链接表单的人在不登录网站的情况下请求PDF文件”。我发现两者之间存在矛盾 成员必须登录,然后才能查看存储在虚拟目录中的一些PDF文件 及 这不会阻止流氓爬行器索引PDF文件 为什么对这个目录的任何未经授权的HTTP请求都会得到代码401以外的服务?胭脂蜘蛛当然不能提供授权cookie。如果他们可以访问该目录,那么什么是“会员登录”
您可能需要通过检查授权的脚本来提供PDF文件。我认为IIS也可以仅为目录访问而要求授权(但我真的不知道) 成员必须登录,然后才能查看存储在虚拟目录中的一些PDF文件 及 这不会阻止流氓爬行器索引PDF文件 为什么对这个目录的任何未经授权的HTTP请求都会得到代码401以外的服务?胭脂蜘蛛当然不能提供授权cookie。如果他们可以访问该目录,那么什么是“会员登录”
您可能需要通过检查授权的脚本来提供PDF文件。我认为IIS也可以仅为目录访问而要求授权(但我真的不知道)。我假设您指向PDF的链接来自已知位置。您可以检查
Request.urlReferer
,以确保用户来自此内部/已知页面以访问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,因为人们经常使用它来寻找你认为你隐藏的东西。我假设你的PDF链接来自已知位置。您可以检查
Request.urlReferer
,以确保用户来自此内部/已知页面以访问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,因为人们经常使用它来寻找你认为你隐藏的东西。以下是我所做的(扩展Leigh的代码)