跳至正文
首页 » 博客 » 9 Tips for Writing Secure Applications in ASP.NET

9 Tips for Writing Secure Applications in ASP.NET

安全性是任何应用程序中最重要的方面之一-当我们谈论安全性时,尤其是在ASP.NET应用程序中,它不仅限于开发。安全应用程序涉及配置、框架、web服务器、数据库服务器等多个安全层。在这篇文章中,我们将看看在ASP.NET中编写安全应用程序的前九个技巧。 1-跨站点脚本 (XSS):此漏洞允许攻击者在输入数据时注入一些恶意代码。它可以是JavaScript代码,VB脚本或任何其他脚本代码。默认情况下,ASP.NET MVC会验证输入,并在脚本的情况下引发服务器错误。假设我们将脚本放在输入表单中: 当我们提交上述页面时,我们会得到以下错误:默认情况下,razor视图引擎可防止XSS攻击。但是在某些情况下 (博客,社交应用程序等),我们可能需要在输入控件中允许html标记。为此,我们可以选择添加ValidateInput筛选器为false: [HttpPost]][ValidateInput(false)] 公共 异步 任务 < ActionResult > 寄存器 (RegisterViewModel模型模型) { if (ModelState.IsValid) { // 等}}但这是非常危险的,因为在这里我们不验证完整的请求。假设模型有二十个属性,所有属性都将免于验证,而我们可能只需要在一个或几个控件中允许html。 在这种情况下,而不是使用这个ValidateInput ,我们应该把一个属性AllowHTML在特定的视图模型的属性为:公共 RegisterViewModel { [] [AllowHtml]][显示(名称 =“用户名”)] 公共 字符串Name {get; set;} }现在我们只能使用标签作为名称。 2-跨站点资源伪造 (CSRF):CSRF (也称为一键攻击) 是一种恶意攻击,其中从用户经过身份验证的受信任网站发出未经授权的命令。在现实世界的情况下,说用户登录到一个应用程序与基于windows/cookie的身份验证。现在,无需注销,用户即可访问恶意网站并单击按钮。外部网站通过您的网站发起请求,要求您进行不道德的操作。它将被视为有效请求,因为该请求已通过身份验证。 为了防止CSRF攻击,MVC提供了AntiForgeryToken机制。为此,我们需要在视图中使用AntiForgeryToken助手作为 @Html.AntiForgeryToken()和验证令牌,我们需要把Antiforgerytoken过滤器在行动为:[ValidateAntiForgeryToken] 公共 异步 任务 < ActionResult > 寄存器 (RegisterViewModel模型模型){ if (ModelState.IsValid){/等。} 返回视图 (模型);}它创建两个令牌响应,一个被设置为cookie,另一个被设置在一个隐藏字段为:<窗体行动= “/帐户/注册”= “窗体-水平”方法= “post”角色= “form”><输入姓名= “__RequestVerificationToken”类型= “隐藏”= “Qorw9RPABdHoRC7AojnSnQYYuGZP5iPF63UFVSw_[…]”/>在提交表单时,两个令牌 (cookie和隐藏字段) 都被发送到服务器。两者都在服务器上验证,并且如果其中一个不存在或被篡改,则不允许该请求。 3-正确处理错误: 错误肯定会发生,他们会找到接触用户的方式。但是,如果处理不当,错误可能会将内部信息泄漏到外部世界,这可能会对应用程序构成威胁。当发生未处理的异常时,以下YSOD是常见的: 但是看看它向外界显示了多少信息: 内部代码,物理文件结构,堆栈跟踪以及ASP.NET和.NET的版本。NET框架。 一个快速修复可以设置customErrors模式为:< customErrors 模式 = On > ></ customErrors >这将在每个错误的情况下显示ASP.NET默认错误页面。要以更好的方式处理它,请使用自定义错误模式RemoteOnly并有一个常见的错误页面,在错误的情况下显示。 <自定义错误 模式=RemoteOnly redirectMode=响应者写入 defaultRedirect=~/Error.aspx/>在这里,我们在错误的情况下显示我们自己的错误页面。 4-SQL注入:SQL注入是众所周知的安全漏洞,但在许多应用程序中仍未正确处理。SQL注入允许黑客篡改现有数据,修改事务,甚至删除数据或数据库,这可能会给业务造成重大损失。 使用这种技术,黑客通过输入注入一些恶意的SQL命令。这些命令可以更改服务器上运行的SQL语句。说在应用程序中验证用户,我们在类中编写了一个查询: “从用户名 = ‘的用户中选择 *”+ txtUserName.Text +“‘和密码 ='”+ txtPwd.Text +“‘”; 现在用户把以下值的用户名:现在查询将生成在服务器为:选择 * 从用户,其中用户名 = ”或1 = 1 — ‘和密码 ='” + txtPwd.Text + “‘;这将始终返回项目,并允许用户进入应用程序。 要处理这个问题,最好的方法是使用SQL存储过程,我们将传递值一个参数或至少使用参数:“选择 * 从用户,其中用户名 = @ 用户名和密码 = @ 密码”5-Click-顶起点击劫持是另一个通常被忽略的主要漏洞。在这种情况下,攻击者使用一个不透明层来欺骗用户点击不同页面上的按钮或链接 (比如银行网站上的转账按钮),同时他们打算点击顶级页面。 为了避免这个问题,我们不应该允许在iframe中打开任何不同域的网站。为了实现这一点,我们需要添加一个响应头x-frame-OPTIONS作为拒绝sameorigin。在ASP.NET中,我们可以在全球.asaxas: 无效Application_BeginRequest (对象发件人,EventArgse) {HttpContext。当前.Response.AddHeader (“X-frame-选项”,“拒绝”); }它将在应用程序发送的所有响应中添加标头。 我们也可以使用IIS添加相同的标题。在IIS中,转到目标网站,然后转到HTTP Headers选项卡,并添加一个自定义标头,其中包含标题x-frame-OPTIONS,如所讨论的。您需要重新启动IIS才能使其生效。 6-隐藏应用程序结构/目录列表-您想将应用程序的文件夹结构共享给最终用户吗?不!对吗?让我们看一个例子。我已经在IIS上部署了ASP.NET web窗体默认应用程序,所以现在当我访问URL时,它显示: 它显示帐户下可用的所有文件和文件夹。如果公开可用,则该信息可能是对应用的潜在威胁。 应在IIS中禁用目录浏览。当它被禁用时,我们看到: 它返回403 (禁止),但仍然留下一些漏洞,因为它告诉用户此文件夹可用。当我们尝试访问不可用的目录时,它会返回404。 为此,我们可以编写自己的自定义http处理程序并对其进行配置,以便每当有人尝试访问文件夹时,它总是返回404。 7.在Web.config中加密敏感信息+ 很多时候我们把关键信息放在Web.config中,最常见的是连接字符串。 要加密任何部分的连接字符串,我们需要导航到框架文件夹在命令提示符 (说C:\ Windows \ Microsoft.NET \ 框架 \ v4.0.30319),并运行以下命令:aspnet_regiis -pef “connectionStrings” 路径这里路径是Web.config所在的文件夹的路径。运行命令后,它显示为: 同样,我们可以加密其他部分,如 <appsettings> 等。7-保护cookie:Cookie是浏览器存储在用户机器上的小文本,在web服务器和浏览器之间传输。Cookie用于存储特定网站的用户相关信息。在ASP.NET中,会话Id是使用cookie保存的最常见信息之一。 由于此信息以纯文本形式存储在用户的计算机上,因此它很容易成为攻击者的目标。我们需要采取几个步骤来避免将数据存储在cookie中,例如设置到期日期和加密数据。除了这两个步骤,我们还应该做两件事:

1- 允许SSL使用cookie

2-将cookie设置为HTTPOnly。这确保了客户端脚本无法读取cookie,因此我们的会话或表单身份验证令牌无法在浏览器上读取。

我们可以在Web.config中设置为:<httpCookies domain = “String” httpOnlyCookies = “true”requireSSL = “true” /> 8-加密视图状态-视图状态是用于维护ASP.NET Web窗体中的页面回发之间的状态的最常用技术之一。视图状态保存在id为的页面上的隐藏变量中__VIEWSTATE。当我们在view source中看到它时,我们发现它包含一系列数字和字符。确保它不是加密的,而是base64格式。任何人都可以解码它来读取信息。 有两个选项可以加密并使其防篡改。有财产ViewStateEncryptionMode,它可以在aspx文件中的页面级别设置,也可以在Web.config这适用于应用程序中的所有页面。它在将视图状态放入响应之前对其进行加密。同样,另一个属性,EnableViewStateMac,可以在页面或Web.config中设置为true。它创建视图状态内容的哈希并添加到隐藏字段中。在下一篇文章中,哈希再次被创建和验证。如果不匹配,则回发被拒绝并抛出错误。 9- 删除敏感信息从响应头: 这里是一个页面的响应头ASP.NET应用程序:在这里,我们可以看到,它揭示了太多的信息给最终用户,他们不需要像在IIS版本,网站建立,和ASP.NET版本。如果攻击者知道其中任何一个漏洞,他或她就可以利用该漏洞。此信息是默认添加的,我们应该删除它,除非和直到特别要求。 a-

删除ASP.NET版本头,我们只需要添加以下在Web.config中:

< system.web > < httpRuntime enableVersionHeader = false/></ system.web >b

删除MVC版本,我们需要去AppliCation_StartGlobal.asax事件,并添加以下代码:

MvcHandler。DisableMvcResponseHeader =; c

x-powe-by是由IIS添加的,可以通过添加以下配置来删除:

< system.webServer > ><httpProtocol><customHeaders><删除 姓名=X-Powered-By/> < customHeaders > < httpProtocol > ></system.webServer>结论:在这篇文章中,我们讨论了安全性是任何web应用程序的关键,如果处理不当,它可能会严重损害业务。我们讨论了ASP.NET web应用程序的九个最常见的漏洞,并发现可以通过进行一些配置更改或较小的代码更改来修复其中的大多数漏洞。

使用Infragistics ASP.NET控件为任何浏览器构建功能齐全的业务应用程序!立即下载免费试用版

</p