论文部分内容阅读
1 引言
近年来随着Internet的飞速发展,越来越多的用户利用Web获取、发布信息,这为一些非法入侵他人系统、窃取他人机密、破坏他人系统等恶意行为提供了可能,如果不采取必要的安全措施加以自我保护,后果不堪设想。ASP.NET Web 应用程序为结构设计人员、设计人员和开发人员提出了一系列复杂的安全问题。对Web应用程序来说,安全措施得当才能有效地抵御各种黑客的攻击,如:未授权访问、跨站点脚本、SQL注入等。本文提出了安全的ASP.NETWeb设计方法。
2 安全设计方法
2.1管理用户
用户是Web应用程序的安全性焦点,多数Web应用程序都是为了保护用户以及他们的私有信息。管理用户是控制Web站点安全性的基本依据。
2.1.1建立用户证书
用户名和密码的选择作为应用程序安全的机制,必须使用技术性方法和策略来确保强用户密码。建立一种策略,确保密码足够复杂,防止密码猜测。下面给出一些密码策略:
(1)实施最小长度为8位字符的密码;
(2)不限制密码的最大长度;
(3)密码包含多种字符集,包括大写字母、小写字母、数字和标点符号;
(4)允许在密码中使用任意键盘字符;
(5)不允许字典单词;
(6)不允许密码中出现用户名。
易于猜测的、可预测的或默认的密码容易受到密码猜测攻击和暴力攻击,易于猜测的用户名也是如此。设计系统时让用户在第一次使用应用程序时设置他们的密码。只有需要的时候才使用随机生成的密码,避免设计如下的系统:期望用户名和密码遵循特定的模式。
通过获取用户名,攻击者能够收集用于垃圾邮件攻击的电子邮件地址,使用社会工程技术来欺骗其他的用户提供密码,尝试对多个帐户使用暴力攻击。阻止证书获取实际是不显示用户名,并且不使用可猜测证书。设计系统时,避免使用户成为数据库的主键。允许用户改变用户名,以限制证书暴露。
2.1.2管理密码
当用户建立了用户名和密码,就要采取一些措施来保护密码。
存储密码是管理密码的首要问题,存储密码的一种简单策略是不在数据库中存储密码。
下面给出存储的有效方法:
(1) 将密码本身存储为普通文本;
(2) 加密密码,存储加密文;
(3) 创建单向密码哈希,将哈希表存储在指定的数据库中。
用户通常不会特地定期改变密码,很多用户持续使用一个密码,而很少有Web站点,特别是因特网服务提供者(ISP)的电子邮件帐户没有提供改变用户密码的简单方法。设计系统时可以考虑在固定时间间隔告之用户,他们的密码过于陈旧。
2.2验证和授权用户
在用户登录并访问站点时,Web安全性显得尤为重要。验证用户将确定用户的身份,在证明身份有效性以后,授权访问Web应用程序中不同功能的权限。
2.2.1验证用户
Web登录屏幕是一个关卡,强迫用户在这里提供有效的用户名和密码来证明其身份的合法性。严格地设计登录屏幕,以此确定用户的身份是确保应用程序安全的有效措施。
(1) 构建登录表单
登录表单在验证用户时起到很重要的作用,不安全的登录表单容易受到密码窃听、信息泄露和phishing的攻击。设计和构建表单时,尽量使其简单,避免将一个表单用于多个任务。总是使用SSL在安全连接上传送证书。尽量建立登录表单自身的安全连接,不在用户点击登录按钮后再建立连接。
(2) 使用表单验证
表单验证为Web应用程序提供良好的安全性,并且使用方便:构建一个登录页面,并且在web.config文件中改变一些设置。表单验证允许在web.config文件中直接添加用户名和密码,包括普通的未加密的密码。设计系统时在web.config文件中存储MD5或SHA-1哈希使文件的安全性提高。
(3) 使用windows验证
在表单验证外,ASP.NET支持本地IIS的验证方法,这些方法称为Windows验证。它是一种安全的解决方案,这种方法不通过网络传送用户名和密码。当用户已登录到域,并被证明有该站点的权限,他将不会收到输入用户名和密码的提示。
2.2.2授权用户
验证了用户的身份后,需要确定该用户是否具有访问请求资源的权限。授权用户是判断用户是否具有访问特定资源权限的过程。
(1) 使用文件授权
文件授权提供一个分层的、细致的安全方法。文件授权是通过设置Web内容文件适当的访问控制列表(ACL),以允许访问文件资源的过程。每个ASP.NET程序都自动使用文件授权,因此不需要在ASP.NET中配置任何内容。文件授权不由ASP.NET控制,但它是NTFS文件系统的一个功能。虽然由操作系统处理文件授权,但ASP.NET仍然提供一个文件授权模块。
(2) 实现URL授权
URL授权是一种用来控制基于用户、角色、资源或所用HTTP谓词访问的机制。URL授权基于与请求相关的主体,因此它可以对任何形式的验证起作用,也允许对任何未验证的用户设置限制。通过精确定义哪级用户可以访问什么内容及如何访问,URL授权提供了给Web应用程序强制实施最少特权的有效方法。通过编辑应用程序的web.config文件可以配置URL验证。
2.3加密私有数据
ASP.NET提供了一组功能强大的加密技术相关类,用来保护数据,并且简化了在整个应用程序中实现加密技术的过程。
2.3.1使用ASP.NET中的加密技术
(1)使用对称加密技术
对称加密又称为对称密钥加密。使用对称加密方法将简化加密的处理,通信双方采用相同的加密算法并只交换共享的专用密钥。对称加密要求消息发送者和接受者共享同一密钥来加密和解密一个消息。对称加密可用于保护已建立共享密钥的多个用户之间的数据,也常用于存储机密数据。DES算法是对称加密中最著名的算法。它使用64位块大小和56位的密钥长度的块密码。
(2)使用非对称加密技术
非对称加密技术可以很好地用于公共通信,但速度比对称加密技术慢得多。非对称加密技术使用公钥和私钥模型,解决了对称加密的密钥交换和可伸缩性问题。非对称加密使用两个单独的密钥,一个用于加密,另一个用于解密。一般来说加密密钥公之于众,解密密钥则只有解密人自己知道。
非对称加密技术通常涉及客户端和服务器上的代码,所以很少用于大多数公共Web应用程序上的自定义实现。但是有时协同其他技术如:SSL来使用非对称加密技术。
(3)使用哈希算法
哈希算法是单向函数用于验证数据的完整性。通过哈希算法能够证明数据未被修改,它与通过加密来保护数据同样重要。哈希以某种方式转换数据,给出一个哈希结果,并且无法通过计算回推原消息。.NET框架提供的哈希算法是非常有效和快速的,可以用于许多应用程序。
2.3.2利用.NET加密特性
(1)创建随机数
随机数是多数加密技术的关键部分。有时系统的强度取决于产生随机、不可预测数字的能力。如果没有这种随机特性,攻击者就可能预测密码计算。.NET框架使用RNGCryptoServiceProvider来生成随机数,该类是CrytpoAPI中CryptGenRandom函数的封装器。PRNG被认为具有足够的随机性,为生成强随机数推荐使用RNGCryptoServiceProvider类,避免使用System.Random类。
(2)保持内存清洁
使用敏感数据时,应总是确保在使用后清除,不在内存中留下未加密的数据。为了限制在内存中留下敏感数据的可能性,应该使用尽可能少的变量,避免缓存普通文本,同时在密码操作之后显式地清除它们。结束与加密技术相关的变量时,应清除它们的内容。这包含密文变量和普通变量,还包含密码对象、密钥、salt和IV变量。
(3) 保护机密内容
安全的Web应用程序关键的部分之一是保护机密内容的过程。
使用文件系统来存储机密内容时,确保使用Web根目录以外的文件,使用严格的文件权限来限制对文件的读写访问。传统上,在注册表中存储机密内容是Web应用程序中较好的机制,因为相比于确定匿名帐户的攻击者,需要更高的访问级别才能读取注册表。
2.4过滤用户输入
许多开发者面临一些担忧:他们的代码并不安全,有些黑客利用Web应用程序本身的缺陷就可以成功入侵。通过操纵程序输入,攻击者可以欺骗服务器使其泄露客户数据,或允许访问未授权文件。尽管有多种输入注入攻击法,但Web开发者有一个好的优势:通过仔细的输入过滤和明智的编码习惯,这些攻击可以完全被阻止。
2.4.1恶意输入处理
(1)识别输入源
识别应用程序接受输入的方式对于阻止恶意输入有重要作用。所有针对应用程序本身的攻击都是基于一定形式的合法用户输入操纵。正确处理表单输入,可以消除这样的攻击弱点。不仅要处理表单输入和查询字符串,而且攻击者可能修改的其他数据也要考虑到。常被忽略的是输入的间接资源和认为攻击者不可能访问的数据。
(2)防御性编程
针对Web应用程序的漏洞强调防御性编程。
有时,由于所有用户输入都与一个变量相关,控制了该变量就控制了用户输入。Web开发者可以用适当的方式编写代码,确保把用户的输入数据分配到一个变量,首先通过过滤函数检测输入数据,以确定它可以安全地使用,然后确定是没有改变的变量。
控制变量包括过滤或清除变量内的数据。不在每次接受用户输入时都编写代码,而是集中过滤代码,这样做能够减少复杂性并减少攻击面。
3.结束语
最安全、最有能力抵御攻击的Web应用程序是那些应用安全思想构建的应用程序。在设计初始阶段,应该使用可靠的体系结构和设计方法,同时要考虑程序部署以及企业的安全策略。
参考文献
[1] Mark M. Burnett.《ASP.NETWeb应用程序安全性剖析》.北京:电子工业出版社,2005.5.
[2]http://msdn.microsoft.com.
近年来随着Internet的飞速发展,越来越多的用户利用Web获取、发布信息,这为一些非法入侵他人系统、窃取他人机密、破坏他人系统等恶意行为提供了可能,如果不采取必要的安全措施加以自我保护,后果不堪设想。ASP.NET Web 应用程序为结构设计人员、设计人员和开发人员提出了一系列复杂的安全问题。对Web应用程序来说,安全措施得当才能有效地抵御各种黑客的攻击,如:未授权访问、跨站点脚本、SQL注入等。本文提出了安全的ASP.NETWeb设计方法。
2 安全设计方法
2.1管理用户
用户是Web应用程序的安全性焦点,多数Web应用程序都是为了保护用户以及他们的私有信息。管理用户是控制Web站点安全性的基本依据。
2.1.1建立用户证书
用户名和密码的选择作为应用程序安全的机制,必须使用技术性方法和策略来确保强用户密码。建立一种策略,确保密码足够复杂,防止密码猜测。下面给出一些密码策略:
(1)实施最小长度为8位字符的密码;
(2)不限制密码的最大长度;
(3)密码包含多种字符集,包括大写字母、小写字母、数字和标点符号;
(4)允许在密码中使用任意键盘字符;
(5)不允许字典单词;
(6)不允许密码中出现用户名。
易于猜测的、可预测的或默认的密码容易受到密码猜测攻击和暴力攻击,易于猜测的用户名也是如此。设计系统时让用户在第一次使用应用程序时设置他们的密码。只有需要的时候才使用随机生成的密码,避免设计如下的系统:期望用户名和密码遵循特定的模式。
通过获取用户名,攻击者能够收集用于垃圾邮件攻击的电子邮件地址,使用社会工程技术来欺骗其他的用户提供密码,尝试对多个帐户使用暴力攻击。阻止证书获取实际是不显示用户名,并且不使用可猜测证书。设计系统时,避免使用户成为数据库的主键。允许用户改变用户名,以限制证书暴露。
2.1.2管理密码
当用户建立了用户名和密码,就要采取一些措施来保护密码。
存储密码是管理密码的首要问题,存储密码的一种简单策略是不在数据库中存储密码。
下面给出存储的有效方法:
(1) 将密码本身存储为普通文本;
(2) 加密密码,存储加密文;
(3) 创建单向密码哈希,将哈希表存储在指定的数据库中。
用户通常不会特地定期改变密码,很多用户持续使用一个密码,而很少有Web站点,特别是因特网服务提供者(ISP)的电子邮件帐户没有提供改变用户密码的简单方法。设计系统时可以考虑在固定时间间隔告之用户,他们的密码过于陈旧。
2.2验证和授权用户
在用户登录并访问站点时,Web安全性显得尤为重要。验证用户将确定用户的身份,在证明身份有效性以后,授权访问Web应用程序中不同功能的权限。
2.2.1验证用户
Web登录屏幕是一个关卡,强迫用户在这里提供有效的用户名和密码来证明其身份的合法性。严格地设计登录屏幕,以此确定用户的身份是确保应用程序安全的有效措施。
(1) 构建登录表单
登录表单在验证用户时起到很重要的作用,不安全的登录表单容易受到密码窃听、信息泄露和phishing的攻击。设计和构建表单时,尽量使其简单,避免将一个表单用于多个任务。总是使用SSL在安全连接上传送证书。尽量建立登录表单自身的安全连接,不在用户点击登录按钮后再建立连接。
(2) 使用表单验证
表单验证为Web应用程序提供良好的安全性,并且使用方便:构建一个登录页面,并且在web.config文件中改变一些设置。表单验证允许在web.config文件中直接添加用户名和密码,包括普通的未加密的密码。设计系统时在web.config文件中存储MD5或SHA-1哈希使文件的安全性提高。
(3) 使用windows验证
在表单验证外,ASP.NET支持本地IIS的验证方法,这些方法称为Windows验证。它是一种安全的解决方案,这种方法不通过网络传送用户名和密码。当用户已登录到域,并被证明有该站点的权限,他将不会收到输入用户名和密码的提示。
2.2.2授权用户
验证了用户的身份后,需要确定该用户是否具有访问请求资源的权限。授权用户是判断用户是否具有访问特定资源权限的过程。
(1) 使用文件授权
文件授权提供一个分层的、细致的安全方法。文件授权是通过设置Web内容文件适当的访问控制列表(ACL),以允许访问文件资源的过程。每个ASP.NET程序都自动使用文件授权,因此不需要在ASP.NET中配置任何内容。文件授权不由ASP.NET控制,但它是NTFS文件系统的一个功能。虽然由操作系统处理文件授权,但ASP.NET仍然提供一个文件授权模块。
(2) 实现URL授权
URL授权是一种用来控制基于用户、角色、资源或所用HTTP谓词访问的机制。URL授权基于与请求相关的主体,因此它可以对任何形式的验证起作用,也允许对任何未验证的用户设置限制。通过精确定义哪级用户可以访问什么内容及如何访问,URL授权提供了给Web应用程序强制实施最少特权的有效方法。通过编辑应用程序的web.config文件可以配置URL验证。
2.3加密私有数据
ASP.NET提供了一组功能强大的加密技术相关类,用来保护数据,并且简化了在整个应用程序中实现加密技术的过程。
2.3.1使用ASP.NET中的加密技术
(1)使用对称加密技术
对称加密又称为对称密钥加密。使用对称加密方法将简化加密的处理,通信双方采用相同的加密算法并只交换共享的专用密钥。对称加密要求消息发送者和接受者共享同一密钥来加密和解密一个消息。对称加密可用于保护已建立共享密钥的多个用户之间的数据,也常用于存储机密数据。DES算法是对称加密中最著名的算法。它使用64位块大小和56位的密钥长度的块密码。
(2)使用非对称加密技术
非对称加密技术可以很好地用于公共通信,但速度比对称加密技术慢得多。非对称加密技术使用公钥和私钥模型,解决了对称加密的密钥交换和可伸缩性问题。非对称加密使用两个单独的密钥,一个用于加密,另一个用于解密。一般来说加密密钥公之于众,解密密钥则只有解密人自己知道。
非对称加密技术通常涉及客户端和服务器上的代码,所以很少用于大多数公共Web应用程序上的自定义实现。但是有时协同其他技术如:SSL来使用非对称加密技术。
(3)使用哈希算法
哈希算法是单向函数用于验证数据的完整性。通过哈希算法能够证明数据未被修改,它与通过加密来保护数据同样重要。哈希以某种方式转换数据,给出一个哈希结果,并且无法通过计算回推原消息。.NET框架提供的哈希算法是非常有效和快速的,可以用于许多应用程序。
2.3.2利用.NET加密特性
(1)创建随机数
随机数是多数加密技术的关键部分。有时系统的强度取决于产生随机、不可预测数字的能力。如果没有这种随机特性,攻击者就可能预测密码计算。.NET框架使用RNGCryptoServiceProvider来生成随机数,该类是CrytpoAPI中CryptGenRandom函数的封装器。PRNG被认为具有足够的随机性,为生成强随机数推荐使用RNGCryptoServiceProvider类,避免使用System.Random类。
(2)保持内存清洁
使用敏感数据时,应总是确保在使用后清除,不在内存中留下未加密的数据。为了限制在内存中留下敏感数据的可能性,应该使用尽可能少的变量,避免缓存普通文本,同时在密码操作之后显式地清除它们。结束与加密技术相关的变量时,应清除它们的内容。这包含密文变量和普通变量,还包含密码对象、密钥、salt和IV变量。
(3) 保护机密内容
安全的Web应用程序关键的部分之一是保护机密内容的过程。
使用文件系统来存储机密内容时,确保使用Web根目录以外的文件,使用严格的文件权限来限制对文件的读写访问。传统上,在注册表中存储机密内容是Web应用程序中较好的机制,因为相比于确定匿名帐户的攻击者,需要更高的访问级别才能读取注册表。
2.4过滤用户输入
许多开发者面临一些担忧:他们的代码并不安全,有些黑客利用Web应用程序本身的缺陷就可以成功入侵。通过操纵程序输入,攻击者可以欺骗服务器使其泄露客户数据,或允许访问未授权文件。尽管有多种输入注入攻击法,但Web开发者有一个好的优势:通过仔细的输入过滤和明智的编码习惯,这些攻击可以完全被阻止。
2.4.1恶意输入处理
(1)识别输入源
识别应用程序接受输入的方式对于阻止恶意输入有重要作用。所有针对应用程序本身的攻击都是基于一定形式的合法用户输入操纵。正确处理表单输入,可以消除这样的攻击弱点。不仅要处理表单输入和查询字符串,而且攻击者可能修改的其他数据也要考虑到。常被忽略的是输入的间接资源和认为攻击者不可能访问的数据。
(2)防御性编程
针对Web应用程序的漏洞强调防御性编程。
有时,由于所有用户输入都与一个变量相关,控制了该变量就控制了用户输入。Web开发者可以用适当的方式编写代码,确保把用户的输入数据分配到一个变量,首先通过过滤函数检测输入数据,以确定它可以安全地使用,然后确定是没有改变的变量。
控制变量包括过滤或清除变量内的数据。不在每次接受用户输入时都编写代码,而是集中过滤代码,这样做能够减少复杂性并减少攻击面。
3.结束语
最安全、最有能力抵御攻击的Web应用程序是那些应用安全思想构建的应用程序。在设计初始阶段,应该使用可靠的体系结构和设计方法,同时要考虑程序部署以及企业的安全策略。
参考文献
[1] Mark M. Burnett.《ASP.NETWeb应用程序安全性剖析》.北京:电子工业出版社,2005.5.
[2]http://msdn.microsoft.com.