ASP.NET站点构建之减少不必要的请求

简介:

服务端的要处理的请求越多,无疑服务端的压力也就越大,尤其是有些请求需要访问一些比较昂贵的资源,例如数据库,服务端的文件等。但是我们必须知道,在到达服务端的请求中,有些请求时我们希望的,例如网站的用户的请求,有些请求其实是不必要,甚至是我们不想要的,为此,我们要避免这样的请求,节省服务端的资源,从而提高性能。

搜索引擎

首先来看看有关搜索引擎的问题。

然后搜索引擎爬到我们的站点是一件好的事情,很多的SEO可以进行,推广站点。同时,在站点中,有些文件或者资源比较的私密,或者我们不希望被搜索引擎请求和收录的,因为每次搜索引擎在请求这些资源的时候,就是发送请求到我们的站点服务器,势必会加重服务器的负载。

不需要被搜索引擎请求的文件一般如下:

1. 图片资源

2. Js脚本,css等

3. 一些需要身份验证或者授权才能看的页面(如果页面需要验证之后才能看,搜索引擎收录了也作用不大)

我们可以设置一下,告诉搜索引擎的蜘蛛程序如何爬我们的站点。

步骤如下:

1. 在站点的根目录下面,创建一个robots.txt的文件。

2. 写入文件。如果我们希望阻止所有的搜索引擎来爬我们的站点的页面,那么就可以在文件中写入下面的配置:

User-agent: *

Disallow: /

如果希望阻止搜索引擎爬某个文件夹,可以配置如下:

User-agent: *

Disallow: /images/

Disallow: /js/

Disallow: /css/

Disallow: /private/

更有趣的是:对于某些搜索引擎,我们还可以改变他们的蜘蛛程序爬我们站点的频率,设置如下:

User-agent: *

Crawl-delay: 10

大家可以去上网找下一些如何影响Google,百度等蜘蛛程序的设置。

热链接问题

就是在A网站上面显示一个来自B网站的图片链接。例如我们在自己的站点上面有一个链接如下:<img src=”http://www.xxx.com/yyy.gif”/>,那么在别人在浏览我们的站点的时候,就回去别人的那个站点(http://www.xxx.com/yyy.gif)去请求这个图片,那么势必会消耗他们的服务器的资源。发过来,如果别人在他们的站点上采用了我们的图片或者其他的链接资料,那么用户在浏览别人的站点的时候就会消耗我们站点的服务端资源和带宽。

为一个组件就可以阻止这种情况的发生:http://www.iis.net/community/default.

aspx?tabid=34&i=1288&g=6.大家去看看。

验证码(CAPTCHA)

我们常常在站点中加入一些验证码的功能来防止网络注册机。一般是生成一张有文字的图片,然后根据验证用户输入的文字和图片中的文字是否一样来判断此时的用户是人还是注册机。

通过验证码阻止了注册机随意的消耗站点资源(如果没有验证码,注册机可以不断的注册信息,大小服务器和数据库资源,而且产生很多的垃圾数据)。

我们自己写生成验证码的程序,一般通过GDI+来做,同时也可以采用一些第三方的库实现,例如:reCAPTCHA: http://recaptcha.net/,大家上网找下,很多的。

网络刮刀(Scrapers)与Dos

这个问题必须引起重视。如果我们的站点上面有很多的有用的信息,那么别人可能就可能开发一个程序来到我们的站点抓取信息,然后把这些内容放到自己的站点上面。例如,很多的内容型的站点每天都从博客园的首页上面来抓取信息,然后放到他们的站点上,增加他们的访问量。

本来站点被搜索引擎抓就有点消耗性能了,如果还被很多的这样的网络刮刀来抓内容,对站点的性能影响可想而知。

如果那些网络刮刀程序的的IP地址变化不频繁,而且请求我们站点的频率比较的由规律,那么我们就可以采用一些代码的方式来防止这样的请求。例如,我们可以监测:同一个IP是否在20min之内发送了100个请求,如果是,我们就推测:可能是别人在抓我们的站点内容,我们就拒绝这个IP的请求。

当然了,上面只是一些简单的方法,对于一些复杂的Dos攻击,上面的监测代码基本没有作用。因为Dos攻击中,攻击的IP地址是变化的。

下面我们就写一些代码来防止简单的网络刮刀程序和简单的Dos攻击。基本的思想就是:如果在给定的时间段内,如果某个用户的请求很多,超过了一定的数量,那么我们就认为这个”用户”可能是网络刮刀程序,然后就拒绝下面的请求,一段时间之后,再次允许这个从这个IP发出的请求。

下面的代码中:假设如果一个用户在5秒之内发出了100个请求,那么我们就认为这是网络刮刀程序或者是网站的攻击者。当然,我们还考虑这个发送请求的”用户”是否是搜索引擎的蜘蛛程序。(下面的代码只是简单作为演示,不是实际生产的代码,抛砖引玉)

 
  1. private const int intervalSeconds = 30;  
  2. private const int maxRequestsInInterval = 5

如果认为这个”用户”是攻击者,那么我们就阻止用户的请求,阻止时间是20秒

 
  1. private const int blockedPeriodSeconds = 20

下面,我们创建一个类来描述一个访问者的信息。如下:

 
  1. private class VisitorInfo  
  2. {  
  3. public int nbrHits;  
  4. public bool blocked;  
  5.  
  6. public VisitorInfo()  
  7. {  
  8. nbrHits = 1;  
  9. blocked = false;  
  10. }  

在BotDefence类中加入一个方法IsBotAttach来判断一个请求是否是攻击性的请求。如下:

 
  1. public static bool IsDosAttack()  
  2. {  
  3. string visitorIP = HttpContext.Current.Request.UserHostAddress;  
  4.  
  5. VisitorInfo visitorInfo = (VisitorInfo)HttpContext.Current.Cache[visitorIP];  
  6. if (visitorInfo == null)  
  7. {  
  8. HttpContext.Current.Cache.Insert(  
  9. visitorIP, new VisitorInfo(), null,   
  10. DateTime.Now.AddSeconds(intervalSeconds),  
  11. System.Web.Caching.Cache.NoSlidingExpiration);  
  12. }  
  13. else 
  14. {  
  15. if (visitorInfo.blocked)  
  16. {  
  17. return true;  
  18. }  
  19.  
  20. visitorInfo.nbrHits++;  
  21. if (visitorInfo.nbrHits > maxRequestsInInterval)  
  22. {  
  23. visitorInfo.blocked = true;  
  24. HttpContext.Current.Cache.Insert(  
  25. visitorIP, visitorInfo, null,  
  26. DateTime.Now.AddSeconds(blockedPeriodSeconds),  
  27. System.Web.Caching.Cache.NoSlidingExpiration);  
  28. return true;  
  29. }  
  30. }  
  31. return false;  

上面的代码都是自解释的,很容易看懂,就不赘述了。

原文链接:http://www.cnblogs.com/yanyangtian/archive/2011/02/16/1955693.html
















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/501570 ,如需转载请自行联系原作者




相关文章
|
9月前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
383 10
|
1月前
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
98 26
|
6月前
|
前端开发 C# 开发者
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
88 12
|
6月前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
161 2
|
6月前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
7月前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
385 5
|
8月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
145 0
|
10月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
129 5
|
10月前
|
机器学习/深度学习 人工智能 算法
【悬念揭秘】ML.NET:那片未被探索的机器学习宝藏,如何让普通开发者一夜变身AI高手?——从零开始,揭秘构建智能应用的神秘旅程!
【8月更文挑战第28天】ML.NET 是微软推出的一款开源机器学习框架,专为希望在本地应用中嵌入智能功能的 .NET 开发者设计。无需深厚的数据科学背景,即可实现预测分析、推荐系统和图像识别等功能。它支持多种数据源,提供丰富的预处理工具和多样化的机器学习算法,简化了数据处理和模型训练流程。
217 1
|
10月前
|
存储 缓存 安全
.NET 在金融行业的应用:高并发交易系统的构建与优化之路
【8月更文挑战第28天】在金融行业,交易系统需具备高并发处理、低延迟及高稳定性和安全性。利用.NET构建此类系统时,可采用异步编程提升并发能力,优化数据库访问以降低延迟,使用缓存减少数据库访问频率,借助分布式事务确保数据一致性,并加强安全性措施。通过综合优化,满足金融行业的严苛要求。
164 1