在ASP.NET中防止注入攻击[翻译](2)
2008-02-22 09:33:32来源:互联网 阅读 ()
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 <= 255) == true)
{
Response.Write("Input data is valid.");
}
else
Response.Write("Input data is out of range");
}
else
Response.Write("Input data is not an integer");
}
}
</script>
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
