动易网站安全开发手册
作者:i100    文章来源:动易    点击数:    更新时间:2011-4-4          ★★★【字体:

标签权重网站漏洞aspweb服务器系统 端口后台防火墙

一、 输入验证
1. 什么是输入
    输入是编译时以外的全部数据交换。WEB应用程序从各种来源获取输入,例如所有用户发送的,或者应用程序运行的往返数据(用户提交的数据、视图状态、cookie、查询字符串参数等),以及后台数据(数据库、配置数据和其他数据来源)。所有输入的数据都会在某种情况下影响请求的处理。[1]


2. 输入验证的必要性
为什么输入验证如此重要?第一个原因非常明显:用户都不希望使用虚假的数据。应用程序会处理这些数据,根据它们得出结果,并最终存储到后台数据存储中。网络上的其他应用程序有可能在某种情况下需要这些数据,这些程序可能依赖于数据的正确性。(如果这些数据没有经过验证,就有可能会带来麻烦。)[1]
一切从外部获取的数据都可能是恶意的,如果缺少对数据的验证,将会带来很多安全问题。如EMAIL 验证、用户名验证等。如:缺少对EMAIL的长度验证,在存储EMAIL时将出现数据库溢出错误。缺少对EMAIL的格式验证,在发送邮件时将会给程序带来错误等。


3. 输入验证技术
3.1 主要防御方式
防御手段一:验证控件验证
保护级别:★★★★☆
描述:
      对于表现层, 可以利用验证控件,对用户输入的数据进行类型、大小、范围的验证。
验证控件必须做到在客户端和服务端同时验证,客户端的验证可以减轻对服务端请求的次数和用户操作的方便性。服务端验证确保数据的正确性,同时也防止用户伪造请求绕过客户端的验证。
优点: 验证简单有效,可重复使用,通常应用于客户端验证较多。
缺点: 验证不完整,有些验证用户可以绕过。
应用举例:
     动易SiteFactory系统中,除了使用VS自带的验证控件外,还扩展了和增加了部份验证控件,在PowerEasy.Framework.Controls 命名空间下,可以看到扩展的RequiredFieldValidator 控件,邮箱验证控件EmailValidator等。具体可以查看文件夹 Core Items 中PowerEasy.Framework.Controls项目下的ExtendedValidator文件夹。这些控件一般使用在用户输入的验证,如注册时用户名的验证:
<pe:RequiredFieldValidator ID="ReqTxtUserName" runat="server" ControlToValidate="TxtUserName"
                            SetFocusOnError="false" ErrorMessage="用户名不能为空" Display="None"></pe:RequiredFieldValidator>

 

防御手段二:业务逻辑层验证
保护级别:★★★★☆
描述:
      关键的地方(涉及到点数、金钱、权限)根据情况还需要在业务层或者数据访问层进行验证,以保证数据的合法性。对于HTML代码输入的地方,输入时一定要进行HTML格式化处理,否则有可能会引起全局显示错误。如输入:<!-- (html注释代码)等。
优点:验证的最后防线,确保数据正确。
应用举例:
      动易SiteFactory系统中,在服务端的验证可以用到数据验证类,在命名空间PowerEasy.Framework.Common下的 DataValidator 类里的相关函数。如:IsNumber(数字)、IsIP(IP验证)、IsEmail(邮箱格式验证)等。这些验证函数通常应用在紧接着的客户端验证,或处理重要数据时的验证。如:发送邮箱时 SendEMail(string email)函数里的在发送邮件前验证邮箱是否正确:DataValidator.IsEmail(email)。

 

防御手段三: 黑名单
保护级别:★★★
描述:
      黑名单是看来最简单的途径,不过同时也是最不可靠(有可能让用户绕过)。但在一些地方也是能起到作用的。
优点:应用简单,快捷。
缺点:不完全可靠,忘记验证的几率高。
应用举例:
      动易SiteFactory系统中,黑名单的应用有如:过滤系统标签的输入,先将数据库中所有系统标签转换成别的代替符,标签解释完成后再转换成原字符。函数:PELabelEncode(string value),PELabelDecode(string value)。又如:系统的过滤函数RemoveXSS也是黑名单的一种利用。适当利用黑名单验证可以直接过滤掉大部份恶意代码。
      

防御手段四:白名单
保护级别:★★★★★
描述:
      白名单是开发人员定义的合法条件集合,集合以外的任何情况都被视为非法。白名单可能是允许的字符集合,合法文件名称列表,或者只是可以接受的数据类型列表。它与黑名单完全相反。由于它把忘记验证的几率降到最小,而且更容易实现,扩展性更强,所以白名单更加强大。开发人员在验证数据时应该始终使用白名单方法。
优点:可靠性高,扩展性强。
缺点:应用范围较小,通常应用于内容确定的地方。
应用举例:
      动易SiteFactory系统中白名单的应用有(只列出部份):数据类型转换:DataConverter 类 CDate CLng 等;
      允许上传文件类型:m_FileExtArr = "gif|png|jpeg|jpg|gif|bmp|fla|swf";
      允许使用个别js:AllowString.xml 名件中的白名单;
      允许文件接收参数类型:QueryStrings.config。
      白名单一般应用在那些比较确定的输入类型。


3.2 辅助防御方式
除了使用上述技术验证输入外,还可以使用以下防御方式确保输入的正确性。

防御手段一:过滤技术
保护级别:★★★★
描述:
      过滤技术是通过特定过滤函数,把不允许的数据内容过滤掉,这种方法能确保数据的正确性,但同时也存在一些过滤不严和过滤太严的问题,总体来说,这也算是增强系统安全性的一种很有用的方法。
优点:应用范围较广,有一定可靠性。
缺点:函数设计考滤烦多,容易忘记需要过滤的内容。
应用举例:
     动易SiteFactory系统中,有多处使用过滤方法,这些过滤函数一般是放在命名空间PowerEasy.Framework.Common下的DataSecurity类和StringHelper类。如:FilterBadChar 函数、FilterSqlKeyword 函数 、RemoveXss 函数等应用。这些函数常用在内容过滤的地方,如RemoveXss函数主要用于跨站脚本的过滤。
    
防御手段二:强制转换技术
保护级别:★★★★
描述:
      除了过滤外,有时也需要强制转换,以确保数据正确和程序的正确运行。如数据层中的强制转换就是一个很好的例子,程序运行到数据层,如果没有对数据进行强制转换,程序的出错将暴出系统错误信息或系统的其他机密信息,更重要的是没有了友好的错误提示。
优点:是系统输入的最后一道防线,比较安全。
缺点:容晚转换出错,要带出错处理过程。
应用举例:
      动易SiteFactory系统中,强制转换函数一般放在命名空间PowerEasy.Framework.Common下的DataConverter类里,如:CDate(object input)、CLng(object input)等,还有一些强制转换防出错的函数,在命名空间PowerEasy.SqlServerDal中的DBHelper类,如:ToNumber 函数、ToValidId 函数、CLng函数等。经过这双重保护,确保进入数据库的数据正确性。

 

防御手段三:输出编码
保护级别:★★★
描述:
     输出编码也是一种有效的防止HTML注入(XSS攻击等)的解决方案,具体技术下一章详细说明。
优点:实现简单有效。
缺点:只针对特定输出。

 

防御手段四:数据库约束验证
保护级别:★★★
描述:
      数据库约束是为了保证数据的完整性而实现的一套机制,通过设计数据库约束,可以限制某些重要字段的数据输入,如: 非空约束,数据类型约束等。大大增强了系统数据的正确性。
应用举例:
      动易SiteFactory系统中,在数据库设计方面就考滤到了数据库约束验证,因此在数据设计时,就把数据类型都设计好,那些字段允许空,那些不允许都作好了规定。

 

二、 输出编码
1. 输出的种类
      输出编码是转换输入数据为输出格式的过程序,输出格式不包含,或者只是有选择性的包含允许的特殊字符。
输出的种类有:
1)支持HTML代码的输出
2)不支技HTML代码的输出
3)URL的输出
4)页面内容的输出(Keywords、Description等)
5)js脚本的输出
6)style样式的输出
7)xml数据的输出
8)服务控件的输出

 

2. 输出编码的必要性
      输出编码能有效地防止HTML注入(跨站脚本XSS攻击)等,也能确保输出内容的完整性和正确性。

 

3. 输出编码
防御手段一:过滤
保护级别:★★★☆
描述:
      对于支持HTML代码的输出,输出前要确保代码中不含有跨站攻击脚本才能输出。通过编写过滤函数,进行强制过滤。
优点:支持HTML,有交防止主流XSS攻击。
 缺点:有可能出错,函数设计难度大。
应用举例:
      动易SiteFactory系统中,目前而言,主要采用函数RemoveXss进行处理,由于RemoveXss并非十分完善,有待更好的过滤方案。但函数能防止目前主流的XSS攻击。所以在支持HTML代码的输出,一定要通过这个函数进行过滤(也可以输入到数据库前过滤)。

     

防御手段二:HTML编码
保护级别:★★★★★
描述:
      对于不支持HTML的输出,在输出到页面前要进行Server.HtmlEncode编码,部分服务器控件或者XSLT转换本身就支持Server.HtmlEncode编码,可不必进行重复编码。
优点:非常可靠。
缺点:不支持HTML输出。
应用举例:
      动易SiteFactory系统中,命名空间PowerEasy.Framework.Common中的DataSecurity类中有自定义的编码函数:HtmlDecode和HtmlDecode,这些函数更容易地控制编码的输出。函数主要用在那些不支持Html的输出。

      

防御手段三:URL编码
保护级别:★★★★★
描述:
     对于URL的输出,要对输出URL进行Server.UrlEncode处理。
     如:<img src="输出内容" border="0" alt="logo" /> 的输出
     要确保输出内容的url编码正确,不允许“ “ “ 的输出。
优点:可靠性高。
缺点:应用范围少。
应用举例:
      动易SiteFactory系统中,命名空间PowerEasy.Framework.Common中的DataSecurity类中有自定义的URL编码函数UrlEncode和UrlEncode来控制所有URL的输出,以确保输出的准确性。

     

防御手段四:转换特殊符号的编码形式
保护级别:★★★★★
描述:
      对于页面内容的输出,要确保输出的正确性和允许输出的数据。
如:页面 <meta content="输出内容" name="Keywords" /> 的输出。
要确保输出内容中不包含特殊符号:“ “ “ 输出前要转换特殊符号的编码形式,将“ “ “ 转为 " 同样的输出有 title="" 的输出等。

对于js脚本的输出,要确保输出代码中不包含跨站脚本,注意“‘ ”和“”“的输出,以免被组合成危险的js代码,还要注意对转义符号的输出“\”。
如:图片模块,图片地址的输出。
又例如下面例子,变量a 和 b 是由用户输入,如果用户输入a=“\” ,b=“;alert(/xss/);//”,输入结果后如下:
<script>
a="\";b=";alert(/xxs/);//"
<script>
注意,这就成了 a=“\”;b=” ;alert(/xss/) 后面的注释了。。

 

      对于style样式的输出,要确保样式的正确性,目前系统主要应用到标题颜色的输出,如果

[1] [2] [3] [4] [5] 下一页

文章录入:i100    责任编辑:i100 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    >> 专题栏目