更新以下对话:
我建议你实现一个可以通过请求头识别爬虫的过滤器,并记录匿名 cookie,稍后解密并删除与关联 UserId 相关的匿名 aspnet_profile 和 aspnet_users 记录。这样你至少可以清楚地知道所有流量来自哪里。
AnonymousId cookie 和匿名配置文件在上次使用后有效期为 90 天。这可能会导致匿名配置文件堆积。
处理这个问题的一个非常简单的方法是使用 ProfileManager。
ProfileManager.DeleteInactiveProfiles(ProfileAuthenticationOption.Anonymous, DateTime.Now.AddDays(-7))
清除所有未在过去7天内访问的匿名档案。
但这会使得aspnet_Users中保留匿名记录。 Membership
不提供类似于ProfileManager
用于删除过时匿名用户的方法。
因此...
最好的方法是采用原始的SQL攻击,从aspnet_Profile中删除您认为已过时的记录,然后在aspnet_User上运行相同的查询,其中IsAnonymous = 1
。
祝你好运。一旦清理干净,请继续关注它。
更新更新:
以下代码仅在IIS7上有效,并且如果通过ASP.Net通道传输所有请求
您可以实现一个模块来监视对robots.txt
的请求,并获取匿名ID cookie并将其存储在机器人表中,以便您每晚安全地清除成员身份/配置文件表中的机器人元数据。 这可能有所帮助。
例如:
using System;
using System.Diagnostics;
using System.Web;
namespace NoDomoArigatoMisterRoboto
{
public class RobotLoggerModule : IHttpModule
{
#region IHttpModule Members
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += PreSendRequestHeaders;
}
public void Dispose()
{
}
#endregion
private static void PreSendRequestHeaders(object sender, EventArgs e)
{
HttpRequest request = ((HttpApplication)sender).Request;
bool isRobot =
request.Url.GetLeftPart(UriPartial.Path).EndsWith("robots.txt", StringComparison.InvariantCultureIgnoreCase);
string anonymousId = request.AnonymousID;
if (anonymousId != null && isRobot)
{
Trace.WriteLine(string.Format("{0} is a robot.", anonymousId));
}
}
}
}
参考资料: http://www.codeproject.com/Articles/39026/Exploring-Web-config-system-web-httpModules.aspx