ASP.NET Core网站如何防范恶意URL循环爬取?
防止ASP.NET Core网站被URL遍历爬取的实用方案
你的网站URL包含自增数字ID(如24),很容易被攻击者循环遍历爬取数据,下面是针对性的解决思路和ASP.NET Core可用的实现方式:
一、IP限流但避开合法爬虫
你提到的IP限流思路可行,但需要区分正常用户和合法搜索引擎爬虫,避免误拦:
- 识别合法爬虫:检查请求头的
User-Agent,谷歌爬虫UA格式为Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html),Bing、百度爬虫也有固定的UA标识,可将这些加入白名单,限流规则不对其生效。 - ASP.NET Core实现方式:
- 内置RateLimiter(.NET 7+):直接用官方限流中间件,自定义拒绝逻辑时放行爬虫:
builder.Services.AddRateLimiter(options => { options.AddFixedWindowLimiter("specs-limit", opt => { opt.PermitLimit = 2; // 5秒内最多2次请求 opt.Window = TimeSpan.FromSeconds(5); opt.QueueLimit = 0; // 不排队,直接拒绝超额请求 }); options.RejectionStatusCode = StatusCodes.Status429TooManyRequests; options.OnRejected = async (context, token) => { var userAgent = context.HttpContext.Request.Headers.UserAgent.ToString(); // 放行谷歌、Bing等合法爬虫 if (userAgent.Contains("Googlebot") || userAgent.Contains("Bingbot")) { context.HttpContext.Response.StatusCode = StatusCodes.Status200OK; return; } await context.HttpContext.Response.WriteAsync("请求过于频繁,请稍后再试", token); }; }); // 在管道中注册限流中间件(注意顺序,要在路由之前) app.UseRateLimiter(); - AspNetCoreRateLimit库:功能更灵活,支持在配置文件中设置IP白名单、限流规则:
先在appsettings.json中配置:
再在Startup中注册服务和中间件,同时可通过自定义逻辑扩展UA白名单。"IpRateLimiting": { "EnableEndpointRateLimiting": true, "HttpStatusCode": 429, "IpWhitelist": [], // 可添加已知爬虫IP段 "GeneralRules": [ { "Endpoint": "get:/specs/*", "Period": "5s", "Limit": 2 } ] }
- 内置RateLimiter(.NET 7+):直接用官方限流中间件,自定义拒绝逻辑时放行爬虫:
二、修改URL结构,增加遍历难度
针对当前URL的数字ID易被遍历的问题,可从根源上优化:
- 替换自增ID为随机标识:把数字ID换成UUID或随机字符串,比如
https://test.com/specs/xyZ789/panasonic-24-inch,攻击者无法通过递增数字猜测合法URL。 - 给ID添加签名校验:在URL中增加一个基于ID生成的签名串,比如
https://test.com/specs/24/abc123/panasonic-24-inch,服务器收到请求后,用相同的算法(如HMAC)重新计算签名,与URL中的签名比对,不匹配则返回404。
三、其他辅助防范手段
- 人机验证:对短时间内请求多个不同ID的IP,弹出验证码(如reCAPTCHA),或用隐式验证(检查
Referer头,正常用户通常从站内链接跳转)。 - 动态加载内容:把核心数据通过AJAX异步加载,而非直接渲染在HTML中,普通爬虫因无法执行JS难以获取数据(注意:谷歌爬虫能解析JS,不影响SEO)。
- 日志与告警:记录所有请求的IP、UA、路径,设置异常告警规则(如1分钟内请求100个不同ID),及时发现并处理恶意爬取。
- Robots.txt声明:在网站根目录添加
robots.txt,告诉合法爬虫不要爬取/specs/路径,但恶意爬虫会忽略此规则,仅作为辅助手段:User-Agent: * Disallow: /specs/*
四、避免误拦谷歌爬虫的额外技巧
除了UA校验,还可以:
- 直接将谷歌公开的爬虫IP段加入白名单(谷歌官方会公布这些IP范围)。
- 通过Google Search Console验证网站,确保爬虫能正常访问,若出现抓取异常可及时排查。
内容的提问来源于stack exchange,提问作者Prageeth Liyanage
相关产品推荐
相关产品推荐

