分享
 
 
 

在ASP.NET中防止注入攻击[翻译]

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

出处: MSDN

翻译:云中城 BLOG

应用范围:

ASP.NET vertion 1.1

ASP.NET vertion 2.0

概要:

文本主要介绍如何校验用户输入从而防止注入式攻击.校验用户输入是非常必要的,几乎所有程序级的攻击都包含恶意输入的手段.

你应该校验包括字段,查询字串参数,Cookie等一切用户输入项来保护你的程序免受注入攻击.你得假设所有的用户输入都是恶意的,确保在服务器端对所有的用户输入进行校验.使用基于客户端的验证可以减少页面的住返次数,改进性能,改善用户体验,但是不要仅仅依赖于此,因为客户端的验证很容易就可以被黑客骗过去.

为了验证输入内容,你应该为每一个输入字段定义可接受的输入规则.比较好的作法是从输入字段的长度,范围,格式,类型来作约束.使用可接受的字符约束列表而不是非法字符列表来约束输入.使用非法字符列表约束的方式不好,是因为你几乎不可能过滤所有的有害输入.

如果你需要接受HTML字符输入,最好使用HtmlEncode之类的方法将它进行编码确保安全再将它们显示出来.

内容:

目的

总括

分步实施提要

第一步. 使用ASP.NET 请求校验.

第二步. 使用权用约束输入.

第三步. 对不安全的输入进行编码.

第四步. 对Sql语句使用命令参数方式.

第五步. 验证ASP.NET的错误没有被返回客户端.

额外的资源

--------------------------------------------------------------------------------

目的:

对输入的字串长度,范围,格式和类型进行约束.

在开发ASP.NET程序时使用请求验证防止注入攻击.

使用ASP.NET验证控件进行输入验证.

对不安全的输出编码.

使用命令参数集模式防止注入攻击.

防止错误的详细信息被返回到客户端.

概述 :

你应该在程序中验证所有的不信任输入.你应该假定所有的用户输入都是非法的.用户可以在应用程序中提供表单字段,查询字串,客户端cookies和浏览器环境值比如用户代理字串和IP地址等.

弱输入校验通常为注入攻击提供了机会.下面是常见的利用弱输入校验或无输入校验进行攻击的手段.

SQL 注入(SQL injection). 如果你使用用户的输入值来动态构造SQL语句,那么数据库可能执行攻击性的有害SQL语句.

跨站脚本(Cross-site scripting). 跨站脚本攻击利用网页验证漏洞注入客户端脚本.接下来这些代码被发送到受信任的客户端电脑上并被浏览器解释执行.因为这些代码来自受信任的站点,所以浏览器无法得知这些代码是有害的.

未授权的文件访问(Unauthorized file access).如果你的代码从调用者那里接受输入,恶意用户可以看到你对文件的操作过程从而访问那些受保护的文件或者使用你的代码注入非法数据.

注意 : 注入攻击可通过使用HTTP或HTTPS Secure Socket Layer(SSL) 连接. 传输加密技术不能用来防御攻击.

通常的输入验证方法总结如下.你应在所有的需要通过网络输入的地方进行验证,比如文本框和其它表单输入字段, 查询字串参数,cookies,服务器端变量和网络方法参数.注意,过滤策略应该是只允许正确的输入然后拒绝非法输入.这是因为定义正确的输入策略比过滤所有的非法输入要容易,那通常很难包括所有的非法输入.

通入如下几个方面验证输入内容:

约束.验证是否输入的是正确的类型,字符长度,格式和范围.可以应用ASP.NET验证控件来约束服务器控件输入.约束其它来源的输入可以使用正则表达式和自定义的验证规则.

拒绝.检测已知的有害数据输入并拒绝.

过滤.有时候你会希望过滤掉用户输入中那些有安全隐患的那些部分.例如,你的程序允许自由格式的输入,比如备注字段,你会允许特定的安全HTML标记象<b>,<i>及其它的HTML标记.

步骤提要

通过以下步骤保护你的ASP.NET程序不受注入式攻击危害 :

第一步.使用ASP.NET请求验证.

第二步.约束输入.

第三步.对不安全的输出进行编码.

第四步.对SQL查询语句使用命令参数.

第五步.验证ASP.NET的出错信息没有泄漏至客户端.

下面的章节将对这些步骤进行详细讨论.

第一步.使用ASP.NET请求验证.

默认地,ASP.NET 1.1和2.0请求验证会对送至服务器的数据检测是否含有HTML标记元素和保留字符.这可以防止用户向程序中输入脚本.请求验证会对照一个有潜在威胁的字符串列表进行匹配,如果发现异常它会抛出一个HttpRequestValidationException类型的异常.

你可以在你的web.config文件中的<pages>元素中加入validateRequest="false" 或在单独的页面的@Pages元素里面设置ValidateRequest = "false"来禁用此项功能.

如果你想禁用请求验证功能,你可以仅在需要的页面禁用它.比如你在程序页面上包含一个可接受HTML格式输入的字段.

确定在Machine.config文件中请求验证功能被打开.

请求验证功能在ASP.NET中被默认启用.你可以在Machine.config.comments文件中看到如下的默认设置.

<pages validateRequest = "true" ... />

确认你没有修改你的服务器的Machine.config和应用程序的Web.config文件里的默认设置.

测试ASP.NET请求验证

你可以测试请求验证的作用.创建一个ASP.NET页面通过设置ValidateRequest = "fasle"禁用请求验证,代码如下 :

<%@ Language="C#" ValidateRequest="false" %>

<html>

<script runat="server">

void btnSubmit_Click(Object sender, EventArgs e)

{

// If ValidateRequest is false, then 'hello' is displayed

// If ValidateRequest is true, then ASP.NET returns an exception

Response.Write(txtString.Text);

}

</script>

<body>

<form id="form1" runat="server">

<asp:TextBox id="txtString" runat="server"

Text="<script>alert('hello');</script>" />

<asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"

Text="Submit" />

</form>

</body>

</html>

当你运行页面的时候,"Hello"被显示在一个消息框中,因为在txtString中的脚本被执行并被客户端的浏览器处理.

如果你设置ValidateRequest = "true" 或者移除ValidateRequest页面属性,ASP.NET请求验证会拒绝脚本输入并抛出一个象下面这样的错误信息.

A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert('hello").

注意 不要仅仅依赖请求验证功能,而只是把它作为自定验证的辅导手段.

第二步.约束输入

要约束输入通过如下方法 :

使用服务器端的输入验证.不要依赖于客户端的验证,因为它很容易就被绕过.使用客户端验证是为了减少页面返住次数提升性能,改进用户体验.

验证输入的长度,范围,格式和类型.确保输入内容是符合要求的正确内容.

使用强数据类型.为数字类型的输入指定如Integer或者Double的类型.为字符输入指定为String数据类型.为日期时间输入指定DateTime类型.

要验证表单里面的HTML控件输入字段,在服务器端代码中进行验证,使用Regex正则表达式类型可以帮助约束字符输入.下面的章节介绍如何约束普通输入类型的变量.

验证字符串字段

要验证字符串字段,如姓名,地址,传真,生份证号码,使用正则表达式.

约束可接受的字符范围.

启动格式规则.例如,基于模式的字段如税号,邮编,邮递区号需要规定的字符模式.

验证长度.

使用正则表达式验证控件(RegularExpresionValidator)

要使用则表达式验证控件需要设置待验证的控件名(ControlToValidate),验证表达式(ValidationExpression)和出错提示(ErrorMessage).相关的属性设置请看下面的代码示例.

<form id="WebForm" method="post" runat="server">

<asp:TextBox id="txtName" runat="server"></asp:TextBox>

<asp:RegularExpressionValidator id="nameRegex" runat="server"

ControlToValidate="txtName"

ValidationExpression="^[a-zA-Z'.\s]{1,40}$"

ErrorMessage="Invalid name">

</asp:regularexpressionvalidator>

</form>

在上面的代码中,正则表达式被用于限定输入的名字为字母(允许大写字母和小写字母),空格,单名省略号象O'Dell和句点.此外,输入的字符长度被限定在40个字符.

注意 正则表达式验证控件(RegularExpressionValidator)会自动加入脱字符(^)和美元符号($)作为开始和结束的分隔符.如果你没有在自定义的表达式中加入他们那么最好加入.加入分隔符只是为了让你的表达式得到想要的那部分数据内容.

使用正则表达式类(Regex Class)

如果你没有使用服务器端的控件(意味着你不能使用验证控件),或者你需要其它的输入字段源而非表单字段(比如查询字串参数和cookies),那么你可以使用正则表达式类(Regex class).

使用正则表达式类

加入使用using前缀的语句导入System.Text.RegularExpressions命名空间.

确认正则表达式包含"^"和"$"(字串开始处,字串结束处).

调用Regex类的IsMatch方法,下面是代码示例.

// Instance method:

Regex reg = new Regex(@"^[a-zA-Z'.\s]{1,40}$");

Response.Write(reg.IsMatch(txtName.Text));

// Static method:

if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z'.\s]{1,40}$"))

{

// Name does not match expression

}

如果你不能把经常使用的正则表达式缓存起来,你应该使用IsMatch静态方法来改进性能防止不必要的对象创建过程.

验证数字字段

在大多数情况下,应该验证数字的输入和范围.使用服务器控件验证数字字段的输入和范围,使用RangeValidator控件.RangeValidator支持货币,日期,整型,双精度和字符串类型的数据.

使用RangeValidator控件需要设置需要验证的控件名(ControlToValidate),类型(Type),最小值(MinimumValue),最大值(MaximumValue),和出错提示信息(ErrorMessage)属性.下面是代码示例 :

<asp:RangeValidator

ID="RangeValidator1"

Runat="server"

ErrorMessage="Invalid range. Number must be between 0 and 255."

ControlToValidate="rangeInput"

MaximumValue="255"

MinimumValue="0" Type="Integer" />

如果你没使用服务器控件,你可以将输入值转化成整型再进行验证来完成对数字的范围验证.例如,要验证一个整数是否合法,使用ASP.NET2.0提供的新方法Int32.TryParse将输入值转化为System.Int32的变量类型.这个方法会在转换失败时返回false.

Int32 i;

if (Int32.TryParse(txtInput.Text, out i) == false)

{

// Conversion failed

}

如果你使用早先的ASP.NET版本,可以在try/catch语句块中 使用Int32.Parse或者Convert.ToInt32方法并可以在转换失败时处理抛出的FormatException错误.

下面的示例代码演示了如何验证来自HTML文本框的整数类型的类型和范围.

<%@ Page Language="C#" %>

<script runat="server">

void Page_Load(object sender, EventArgs e)

{

if (Request.RequestType == "POST")

{

int i;

if (Int32.TryParse(Request.Form["integerTxt"], out i) == true)

{

// TryParse returns true if the conversion succeeds

if ((0 <= i && i

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有