防注入的Web安全组件开发
摘 要
分析Sql注入的编码防范方法,并结合Asp.Net组件编程技术,提出一种防范注入的web输入框组件,阐述其原理、实现和核心算法逻辑,并就其应用前景进行介绍。
【关键词】sql注入 web组件
1 引言
组件(Component)是对数据和方法的简单封装,使用组件可以实现拖放式编程、快速的属性处理,通过组件,可以将相同的逻辑和关系进行封装,达到多次应用的目的。面向组件(Component -Oriented)的开发方法近年来得到广泛应用,也得到了各大IT厂商的大力支持,在微软的.Net平台中,流行的Web Form框架就提供了对组件的支持,包括大量的服务器组件,同时提供了组件开发的基类和方法,大大提高了组件开发和基于组件来进行开发的效率。
随着Internet的推广,基于Web环境的互联网应用越来越广泛,Web安全也日益突出,黑客往往利用网站操作系统的漏洞和Web服务程序的漏洞等得到Web服务器的控制权限,对网站所有者和访问者造成伤害。而不幸的是,由于成本问题、制度控制、开发人员意识等多重因素,在关注业务的Web系统中,安全问题往往容易被忽视或遗漏,造成安全隐患。
本文以典型的Sql注入漏洞防范为例,结合Asp.Net的组件开发技术,来开发安全的服务器组件,目的是通过组件技术的通用性和易用性,提升Web系统的开发效率和安全性。
2 相关技术
2.1 SQL注入防范
SQL注入的原理是构造特殊的输入作为参数,传入Web应用,通过这些包含特殊语法的SQL语句执行,来完成攻击者所需要的操作,其根本原因是Web应用没有对用户输入进行仔细过滤。
一般来说,主要防护措施包括:对用户输入进行校验、使用参数化存储过程进行数据查询存取、敏感信息(如用户口令)进行加盐的Hash处理、屏蔽应用反馈的原始错误信息等。从Web代码开发部分来说,主要是对用户输入进行校验,包括:(1)使用正则表达式进行校验。(2)类型和长度限制。(3)SQL语法特殊字符转换处理。
2.2 Asp.Net服务器组件
ASP. NET服务器组件是 ASP.NET WebForm开发中用来进行WEB应用程序用户界面编程的基本模型单元。ASP.NET 服务器控件直接或间接地从 System.Web.UI.Control 类派生。编译 ASP.NET 应用程序时,具有 runat=server 属性的 HTML 服务器控件被编译为程序集。 ASP.NET服务器组件的开发过程如下:
(1)继承WebControl基类或者其派生类,例如继承按钮控件System.Web.UI.WebControls.Button。
(2)增加自定义的属性和方法。
(3)重写覆盖WebControl的WebForms生命周期相关方法,主要有Onload(控件加载时执行)、Render(呈现控件的Html内容)、RenderContents(呈现控件开始和结束之间的控件内容)。
(4)进行运行时和设计时特性设计。
3 安全控件开发
本文以常用的输入框组件为例,介绍安全控件开发方法。Asp.Net WebForms框架自带的输入框控件(System.Web.UI.WebControls.TextBox)提供了基本的输入框功能,我们在它的基础上进行扩展,并针对SQL注入防范的的几种措施进行安全控件开发。
首先,我们考虑对输入框的输入类型进行分类限制。为此,我们开发TextBox类,集成自System.Web.UI.WebControls.TextBox,并在此控件上面派生三种类型:MoneyTextBox、LetterTextBox、NumberTextBox。
关键核心代码如下:数值输入框和金额输入框的输入控制逻辑:
(1)编写前台Javascript校验脚本函数。输入:输入框数值、正则表达式;输出:是否通过校验;触发时机:输入框值改变时;
(2)开发控件,定义校验相关属性。精度:控制输入的小数位数。
(3)重写Render事件,输出相关控制代码。
if (this.Precision > 0){
writer.AddAttribute("data-Reg", "^-?(\\d+)(\\.\\d{{0,{0}}})?$".FormatEx (this.Precision)); this.RegisterStartupScript(Constant.JqueryStartupScript.FormatEx(RegVerifyScript.FormatEx("data-Reg")), JsKey + "reg"); }
(4)重写值获取方法,加入精度控制。
public override string Text
{
get{
if (this.Precision > 0){ return GetPrcisionText(base.Text)}
return base.Text;
}}
(5)编译发布组件。
然后,我们考虑SQL语法特殊字符转换处理。从前文分析,Sql注入根本原因在于未对输入值进行相关过滤。为此,我们为输入框组件新增一个属性,用于获取过滤后的值,当需要传递数据库操作时,从此值获取。我们以防范文本型注入为例,将字符串单引号进行过滤处理。
///
/// 值 防止SQL注入
///
public string TextSearchCondition
{
get
{
return Text.Replace("'", "''");
}
}
最后,我们编译发布组件,并在Visual Studio中加以引用。
4 结论
Sql注入是常见的Web攻击方式,本文通过组件库的开发,将SQL注入的防范,直接基于组件级别进行实现,从而在提升开发效率的同时,增加了基于组件开发的系统安全性。文中所示的防范内容可以进一步改进,加入跨站点脚本攻击(XSS)等内容。
参考文献
[1]吴暨,顾景文.一种开发 ASP.NET服务器组件的改进方法[J].计算机应用与软件,2006,23(3):33-35.
作者单位
煤炭科学技术研究院有限公司装备分院 北京市 100013