论文部分内容阅读
[摘要] ASP.NET技术以其强大的功能在动态网页设计中得到广泛应用。由于ASP.NET本身的缺陷和程序员安全意识不强,使得应用ASP.NET技术的网站存在各种安全问题。本文结合ASP.NET网站的开发经验,讨论了基于ASP.NET网站中常见的安全漏洞,并给出了相应的防范策略。
[关键词] ASP.NET攻击安全防范
一、前言
Web服务应用正在爆炸式增长,越来越多的应用被推出到防火墙之外,安全性脆弱的Web应用面临的风险也有增无减。同时,为了在紧迫的时限之前快速完成应用开发,开发者面临的压力越来越大。因此注重编写代码时的安全问题,同时投入必要的资源,才能为未来Web的安全应用做好准备。
二、ASP.NET程序设计安全性分析
1.信息隐藏设置
在ASP.NET应用中,几乎所有HTML页面的__VIEWSTATE隐藏域中都可以找到有关应用的信息。由于__VIEWSTATE是BASE64编码的,所以常常被忽略,但攻击者可以方便地解码BASE64数据,从而得到__VIEWSTATE中提供的详细资料。
要解决这个问题,只需设置EnableViewStatMAC=”true”,启用__VIEWSTATE数据加密功能。然后将machineKey验证类型设置成3DES,要求ASP.NET用Triple DES对称加密算法加密ViewState数据。
2.用户输入的校验分析
在Web应用开发中,开发者最大的失误往往是无条件的信任用户输入、总是通过浏览器和服务器交互,从而打开了攻击Web应用的大门。
因此,只有严密地验证用户输入的合法性,才能有效抵抗入侵者的攻击。应用程序可以用多种方法执行验证,例如,在认可用户输入之前执行验证,确保用户的输入中只包含合法的字符,并且所有输入域的内容长度都没有超过范围。必要时不仅采取强制性的长度限制策略,而且还可以对输入内容按照明确定义的特征集执行验证。
应在所有的需要通过网络输入的地方进行验证,比如文本框和其他表单输入字段,字符串查询参数等。过滤策略应该是只允许正确的输入,拒绝非法输入。这是因为定义正确的输入策略比过滤所有的非法输入要容易得多。
要验证表单里面的HTML控件输入字段,在服务器端代码中可以使用Regex正则表达式类型进行字符串的验证,ASP.NET中通过正则表达式验证控件(RegularExpresionValidator)实现。
3.跨站攻击及防范
跨站脚本执行是指将恶意的用户输入嵌入到应答(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>
要纠正本例中的错误,只要在下面代码中加入一个HtmlEncode调用即可:
Label1.Text=Server.HtmlEncode(feedback.Text)
这样,应答HTML流将包含用户输入内容的HTML编码版本,浏览器就不会执行用户输入的JavaScript代码,从而保证代码的安全。同理,如果需要获取用户输入的URL参数,应使用HttpUtility.UrlEncode方法对地址字符串编码。
HttpUtility.UrlEncode(urlString);
4.SQL注入攻击及防范
(1)SQL注入攻击原理。盲目信任用户输入是保障Web应用安全的第一敌人。用户输入的主要来源是HTML表单中提交的参数,如果不能严格地验证这些参数的合法性,就有可能危及服务器的安全。
下面的代码查询后台SQL Server数据库,假设user和password变量的值直接取自用户输入:
SqlDataAdapter my_query = new SqlDataAdapter(
“SELECT * FROM accounts WHERE acc_user=”+ user +“ AND acc_password=”+ password, the_connection);
从表面上看,这几行代码毫无问题,实际上却可能引来SQL注入式攻击。攻击者只要在user输入域中输入“OR 1=1”,就可以顺利登录系统,或者只要在查询之后加上适当的调用,就可以执行任意Shell命令:
‘; EXEC master xp_cmdshell(shell command here)—‘
(2) SQL注入攻击防范。要防止上述攻击行为,有以下三种方法。
第一种方法是禁止引号之类的特殊字符输入。
第二种方法是限定输入域的内容必须属于某个合法字符的集合,例如“[a-zA-Z0-9]*”。
为了避免注入式攻击请使用SQL的参数方式。如果使用参数集合,输入的内容将被当作文本值来对待,数据库不会执行包含在其中的代码。使用参数集方式可以严格限定输入的类型和长度。如果输入型超出范围将会触发异常。
第三种方法是使用SQL参数API,让编程环境的底层API来构造查询。
使用这些API时,开发者或提供一个查询模板,或提供一个过程,然后指定一系列的参数值,由底层API将参数值嵌入到查询模板,然后将构造出来的查询提交给服务器执行。这种办法确保参数能够正确嵌入。例如,系統将对引号进行转义处理,从根本上杜绝SQL注入攻击的发生,同时,在表单中引号仍是一个允许输入的有效字符。
三、基于ASP.NET的网站安全性检测
由于客户需求不断变化,员工流动性强,所以对开发者开发健壮、高质量的代码提出更高的要求。虽然对所有开发者进行代码安全技术的培训是必要的,但不可否认,自动检测代码安全漏洞的工具对安全代码设计也大有裨益。
到目前为止,开发者常用的工具只能涵盖功能测试的特定方面,例如性能测试,故障点侦查。人工检查代码有着许多局限,而且要求开发者具有丰富的经验,所以对于编写高质量的web应用来说,面向应用程序安全的检测工具(如Domain、HDSI、CSAI等)是十分关键的。
要迅速提高应用的质量和安全性,最有效的办法是给开发者提供一个自动测试应用的工具。如果在单元测试期间,工具能够检测出应用的安全缺陷,并将修补建议嵌入到代码之中,开发者就能立即找出代码中存在的错误,这不仅方便了现有错误的修改,而且也有助于避免将来再犯同样的错误,不断地提高代码抗攻击的能力。
四、结论
在使用ASP.NET技术建站时,包括上述安全漏洞在内的一些代码安全问题都可能出现,因此需从服务器、程序员等方面加强安全防范。对服务器来说,要关掉所有用不到的网络服务,对提供网络服务的软件(如Apache、MySQL、iis等)经常进行更新,并检查各自的程序日志以及时发现入侵现象。对程序员来说,书写代码时要注意严格过滤用户的输入数据,并经常使用工具对ASP.NET网站进行安全检测。
参考文献:
[1][美]Mark M. Burnett著良忠译:拒绝黑客-ASP.NET Web应用程序安全性剖析[M].北京:电子工业出版社, 2005年
[2]张郭军:企业信息网络系统安全技术分析. 商场现代化[J]. 2006, 4:35~36
[3]中国黑客联盟, http://www.cnhacker.com
[4]华夏黑客同盟, http://77169.com
[关键词] ASP.NET攻击安全防范
一、前言
Web服务应用正在爆炸式增长,越来越多的应用被推出到防火墙之外,安全性脆弱的Web应用面临的风险也有增无减。同时,为了在紧迫的时限之前快速完成应用开发,开发者面临的压力越来越大。因此注重编写代码时的安全问题,同时投入必要的资源,才能为未来Web的安全应用做好准备。
二、ASP.NET程序设计安全性分析
1.信息隐藏设置
在ASP.NET应用中,几乎所有HTML页面的__VIEWSTATE隐藏域中都可以找到有关应用的信息。由于__VIEWSTATE是BASE64编码的,所以常常被忽略,但攻击者可以方便地解码BASE64数据,从而得到__VIEWSTATE中提供的详细资料。
要解决这个问题,只需设置EnableViewStatMAC=”true”,启用__VIEWSTATE数据加密功能。然后将machineKey验证类型设置成3DES,要求ASP.NET用Triple DES对称加密算法加密ViewState数据。
2.用户输入的校验分析
在Web应用开发中,开发者最大的失误往往是无条件的信任用户输入、总是通过浏览器和服务器交互,从而打开了攻击Web应用的大门。
因此,只有严密地验证用户输入的合法性,才能有效抵抗入侵者的攻击。应用程序可以用多种方法执行验证,例如,在认可用户输入之前执行验证,确保用户的输入中只包含合法的字符,并且所有输入域的内容长度都没有超过范围。必要时不仅采取强制性的长度限制策略,而且还可以对输入内容按照明确定义的特征集执行验证。
应在所有的需要通过网络输入的地方进行验证,比如文本框和其他表单输入字段,字符串查询参数等。过滤策略应该是只允许正确的输入,拒绝非法输入。这是因为定义正确的输入策略比过滤所有的非法输入要容易得多。
要验证表单里面的HTML控件输入字段,在服务器端代码中可以使用Regex正则表达式类型进行字符串的验证,ASP.NET中通过正则表达式验证控件(RegularExpresionValidator)实现。
3.跨站攻击及防范
跨站脚本执行是指将恶意的用户输入嵌入到应答(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>
要纠正本例中的错误,只要在下面代码中加入一个HtmlEncode调用即可:
Label1.Text=Server.HtmlEncode(feedback.Text)
这样,应答HTML流将包含用户输入内容的HTML编码版本,浏览器就不会执行用户输入的JavaScript代码,从而保证代码的安全。同理,如果需要获取用户输入的URL参数,应使用HttpUtility.UrlEncode方法对地址字符串编码。
HttpUtility.UrlEncode(urlString);
4.SQL注入攻击及防范
(1)SQL注入攻击原理。盲目信任用户输入是保障Web应用安全的第一敌人。用户输入的主要来源是HTML表单中提交的参数,如果不能严格地验证这些参数的合法性,就有可能危及服务器的安全。
下面的代码查询后台SQL Server数据库,假设user和password变量的值直接取自用户输入:
SqlDataAdapter my_query = new SqlDataAdapter(
“SELECT * FROM accounts WHERE acc_user=”+ user +“ AND acc_password=”+ password, the_connection);
从表面上看,这几行代码毫无问题,实际上却可能引来SQL注入式攻击。攻击者只要在user输入域中输入“OR 1=1”,就可以顺利登录系统,或者只要在查询之后加上适当的调用,就可以执行任意Shell命令:
‘; EXEC master xp_cmdshell(shell command here)—‘
(2) SQL注入攻击防范。要防止上述攻击行为,有以下三种方法。
第一种方法是禁止引号之类的特殊字符输入。
第二种方法是限定输入域的内容必须属于某个合法字符的集合,例如“[a-zA-Z0-9]*”。
为了避免注入式攻击请使用SQL的参数方式。如果使用参数集合,输入的内容将被当作文本值来对待,数据库不会执行包含在其中的代码。使用参数集方式可以严格限定输入的类型和长度。如果输入型超出范围将会触发异常。
第三种方法是使用SQL参数API,让编程环境的底层API来构造查询。
使用这些API时,开发者或提供一个查询模板,或提供一个过程,然后指定一系列的参数值,由底层API将参数值嵌入到查询模板,然后将构造出来的查询提交给服务器执行。这种办法确保参数能够正确嵌入。例如,系統将对引号进行转义处理,从根本上杜绝SQL注入攻击的发生,同时,在表单中引号仍是一个允许输入的有效字符。
三、基于ASP.NET的网站安全性检测
由于客户需求不断变化,员工流动性强,所以对开发者开发健壮、高质量的代码提出更高的要求。虽然对所有开发者进行代码安全技术的培训是必要的,但不可否认,自动检测代码安全漏洞的工具对安全代码设计也大有裨益。
到目前为止,开发者常用的工具只能涵盖功能测试的特定方面,例如性能测试,故障点侦查。人工检查代码有着许多局限,而且要求开发者具有丰富的经验,所以对于编写高质量的web应用来说,面向应用程序安全的检测工具(如Domain、HDSI、CSAI等)是十分关键的。
要迅速提高应用的质量和安全性,最有效的办法是给开发者提供一个自动测试应用的工具。如果在单元测试期间,工具能够检测出应用的安全缺陷,并将修补建议嵌入到代码之中,开发者就能立即找出代码中存在的错误,这不仅方便了现有错误的修改,而且也有助于避免将来再犯同样的错误,不断地提高代码抗攻击的能力。
四、结论
在使用ASP.NET技术建站时,包括上述安全漏洞在内的一些代码安全问题都可能出现,因此需从服务器、程序员等方面加强安全防范。对服务器来说,要关掉所有用不到的网络服务,对提供网络服务的软件(如Apache、MySQL、iis等)经常进行更新,并检查各自的程序日志以及时发现入侵现象。对程序员来说,书写代码时要注意严格过滤用户的输入数据,并经常使用工具对ASP.NET网站进行安全检测。
参考文献:
[1][美]Mark M. Burnett著良忠译:拒绝黑客-ASP.NET Web应用程序安全性剖析[M].北京:电子工业出版社, 2005年
[2]张郭军:企业信息网络系统安全技术分析. 商场现代化[J]. 2006, 4:35~36
[3]中国黑客联盟, http://www.cnhacker.com
[4]华夏黑客同盟, http://77169.com