常见的ASP.NET安全缺陷(下)

  2.3 信息泄漏

  ◎ 让隐藏域更加安全

  在ASP.NET应用中,几乎所有HTML页面的__VIEWSTATE隐藏域中都可以找到有关应用的信息。由于__VIEWSTATE是BASE 64编码的,所以常常被忽略,但黑客可以方便地解码BASE 64数据,用不着花什么力气就可以得到__VIEWSTATE提供的详细资料。

  ■ 风险分析

  默认情况下,__VIEWSTATE数据将包含:

  ⑴ 来自页面控件的动态数据。

  ⑵ 开发者在ViewState中显式保存的数据。

  ⑶ 上述数据的密码签字。

  ■ 解决方案

  设置EnableViewStatMAC="true",启用__VIEWSTATE数据加密功能。然后,将machineKey验证类型设置成3DES,要求ASP.NET用Triple DES对称加密算法加密ViewState数据。

  2.4 SQL注入式攻击

  ◎ 使用SQL参数API

  正如前文“篡改参数”部分描述的,攻击者可以在输入域中插入特殊字符,改变SQL查询的本意,欺骗数据库服务器执行恶意的查询。

  ■ 风险分析

  恶意查询有可能获取后端数据库保存的任何信息,例如客户信用卡号码的清单。

  ■ 解决方案

  除了前面介绍的办法——用程序代码确保输入内容只包含有效字符,另一种更加健壮的办法是使用SQL参数API(例如ADO.NET提供的API),让编程环境的底层API(而不是程序员)来构造查询。

  使用这些API时,开发者或者提供一个查询模板,或者提供一个存储过程,然后指定一系列的参数值,由底层API将参数值嵌入到查询模板,然后将构造出来的查询提交给服务器查询。这种办法的好处是确保参数能够正确地嵌入,例如,系统将对引号进行转义处理,从根本上杜绝SQL注入式攻击的发生。同时,在表单中引号仍是一个允许输入的有效字符,这也是使用底层API的一个优点。

  按照这种思路修改前文“篡改参数”部分的例子,结果如下:

  

      SqlDataAdapter my_query = new SqlDataAdapter("SELECT * FROM accounts

  WHERE acc_user= @user AND acc_password=@pass", the_connection);

  SqlParameter userParam = my_query.Select_Command.Parameters.Add(

  "@user",SqlDb.VarChar,20);

  userParam.Value=user;

  SqlParameter passwordParam = my_query.Select_Command.Parameters.Add(

  "@",SqlDb.VarChar,20);

  passwordParam.Value=password;

  2.5 跨站脚本执行

  ◎ 对外发的数据进行编码

  跨站脚本执行(Cross-site scripting)是指将恶意的用户输入嵌入到应答(HTML)页面。例如,下面的ASP.NET页面虽然简单,却包含着一个重大的安全缺陷:

  

      < %@ Page Language="vb" %>

  < asp:Label id="Label1" runat="server">

  标签文字

  

      < /asp:Label>

  < form method="post" runat="server" ID="Form1">

  请在此处输入反馈信息< br>

  

      < asp:Textbox ID="feedback" runat="server"/>< br>

  < asp:Button id="cmdSubmit" runat="server"

  Text="提交!" OnClick="do_feedback">

  < /asp:Button>

  < /form>

  < script runat="server">

  Sub do_feedback(sender As Object, e As System.EventArgs)

  Label1.Text=feedback.Text

  End Sub

  < /script>

  ■ 风险分析

  攻击者可以用JavaScript代码构造一个恶意的查询,点击链接时JavaScript就会运行。举例来说,脚本可以通过下面的用户输入来嵌入:

  

      < script>alert(document.cookie)

  < /script>

  ■ 解决方案

  在一个双层的安全体系中,对HTML页面中出现的外发用户数据执行输入验证和HTML编码,确保浏览器只把用户输入数据当成纯粹的文本,而不是其他具有特殊含义的内容,例如HTML代码、JavaScript脚本。

  对于本例,只要加入一个HtmlEncode调用即可:

  Label1.Text=Server.HtmlEncode(feedback.Text)

  这样,应答HTML流将包含用户输入内容的HTML编码版本,也就是说,浏览器不会执行用户输入的JavaScript代码,因为根本不存在HTML的“< SCRIPT>”标记,用户输入的“< ”和“>”字符已经被替换成HTML编码版本,即“< ”和“>”。

  三、使用自动安全测试工具

  由于客户需求不断变化,一些单位平均每三个月就要部署新的应用,同时由于人员流动,所以对开发者快速开发健壮的、高质量的代码寄予很高的期望。虽然对所有开发者进行代码安全技术的培训是十分必要的,但不可否认,自动检测代码安全漏洞的工具也有助于快速开发安全的应用程序。

  到目前为止,开发者常用的工具只能涵盖功能测试的特定方面,例如性能测试,BUG/故障点侦查。人工检查代码有着许多与生俱来的局限,而且要求开发者具有丰富的代码安全经验,所以对于编写高质量的应用来说,面向应用程序安全及其在恶意环境下行为的工具也是十分关键的。

  要迅速提高应用的质量和安全性,最有效的办法是给开发者提供一个自动测试应用的工具。如果在单元测试期间,工具能够检测出应用的安全缺陷,并将修补建议嵌入到代码之中,开发者就能立即找出代码中存在的错误,不仅方便了现有错误的修改,而且也有助于避免将来再犯同样的错误,不断地提高代码抗御攻击的能力。

  结束语:Web服务应用正在爆炸式增长,越来越多的应用被推出到防火墙之外,安全性脆弱的Web应用面临的风险也只会有增无减。同时,为了在紧迫的时限之前快速完成应用开发,开发者面临的压力也越来越大。注重编写代码时的安全问题,同时投入必要的资源,这样才能为未来的Web服务应用做好准备,同时确保当前应用的高质量。只有从应用的出生之日开始就采取正确的措施来确保其安全性,才能构造出高质量、安全的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值