ASP.NET 防注入

一、 输入验证
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文件夹。这些控件一般使用在用户输入的验证,如注册时用户名的验证:
  SetFocusOnError="false" ErrorMessage="用户名不能为空" Display="None">
防御手段二:业务逻辑层验证
保护级别:★★★★☆
描述:
  关键的地方(涉及到点数、金钱、权限)根据情况还需要在业务层或者数据访问层进行验证,以保证数据的合法性。对于HTML代码输入的地方,输入时一定要进行HTML格式化处理,否则有可能会引起全局显示错误。如输入:

你可能感兴趣的:(数据库,javascript,java,ViewUI)