专注于技术经验交流

水至清则无鱼、宁静而致远!

技术、经验、学习共同打造网络新生活!
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在ASP.NET中防止注入攻击(3)

Posted on 2006-07-13 18:30  小鱼儿  阅读(223)  评论(0编辑  收藏  举报
在ASP.NET中防止注入攻击(3)

验证日期字段

  你需要验证日期字段是否是正确的类型.在大多数情况下,你也需要验证它们的范围,如验证它们是否是将来或是过去的时间.如果你使用服务器控件来捕获一个日期输入值,同时你希望这个值在一个特定的范围内,你可以使用范围验证控件(RangeValidator)并设置它允许的类型为Date类型.这个控件允许你指定一个特殊的时间段通过设置起始的时刻.如果你需要以今天的时间作为参照来验证,比如验证一个时间是在将来还是过去,你可以使用CustomValidator验证控件。

  使用CustomValidator控件来验证一个日期需要设置ControlToValidate和ErrorMessage属性,在OnServerValidate事件中指定一个自定义的验证逻辑方法.下面是示例代码.

<%@ Page Language="C#" %>
<s cript runat="server">
void ValidateDateInFuture(object source, ServerValidateEventArgs args)
{
DateTime dt;

//
Check for valid date and that the date is in the future

if ((DateTime.TryParse(args.Value, out dt) == false) ||  (dt <= DateTime.Today))
{
args.IsValid = false;
}
}

</s cript>

<html>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Runat="server" 
Text="Future Date:"></asp:Label>
<asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox>
<asp:CustomValidator 
ID="CustomValidator1" Runat="server" 
ErrorMessage="Invalid date. Enter a date in the future."
ControlToValidate="futureDatetxt" 
OnServerValidate="ValidateDateInFuture">
</asp:CustomValidator>
<br />
<asp:Button ID="submitBtn" Runat="server" Text="Submit" />
</div>
</form>
</body>
</html>

  注意 上面的代码使用的方法DateTime.TryParse是ASP.NET2.0提供的新方法.

  过滤自由文本字段

  过滤输入,你需要使不安全的输入不被当作代码来对待.例如,你的程序使用户不能读取共享数据库内的数据,你首先需要过滤数据使它们在输出的时候没有危险.使用HttpUtility.HtmlEncode方法先对输入值进行编码.

  允许有限的输入HTML代码


在@ Page页面元素内加以下字段ValidateRequest = "false"禁用ASP.NET请求验证 
使用HtmlEncode方法对输入的字符串进行编码 
使用StringBuilder对象,调用它的Replace方法对字符中的HTML进行替换 
  下面的代码给出了这种办法的示例.此页面设置ValidateRequest = "fasle"禁用了ASP.NET请求验证.它的HTML编码为了显示简单的文本格式允许使用<b>和<i>标记.

<%@ Page Language="C#" ValidateRequest="false"%>
<s cript runat="server">
void submitBtn_Click(object sender, EventArgs e)
{
//
Encode the string input

StringBuilder sb = new StringBuilder(
HttpUtility.HtmlEncode(htmlInputTxt.Text));

//
Selectively allow and <i>

sb.Replace("<b>", "<b>");
sb.Replace("</b>", "");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
}
</s cript>
<html>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="htmlInputTxt" Runat="server" 
TextMode="MultiLine" Width="318px"
Height="168px"></asp:TextBox>
<asp:Button ID="submitBtn" Runat="server" 
Text="Submit" OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>

  验证查询字串的值 

  验证查询字串的长度,范围,格式和类型.通常,你使用一个合并的正则表达式来完成以下任务: 

约束输入值 
设置明确的范围检查条件 
指定输入的类型并将它转换成ASP.NET平台下的类型,处理任何由类型转换引发的异常下面的代码示例演示了使用Regex类验证由查询字串传递过来的名字字符串 

void Page_Load(object sender, EventArgs e)


{
if (!System.Text.RegularExpressions.Regex.IsMatch(
Request.QueryString["Name"], @"^[a-zA-Z'.\s]{1,40}$"))
Response.Write("Invalid name parameter");
else
Response.Write("Name is " + Request.QueryString["Name"]);
}

  验证Cookie值

  象查询字串这样被保存在Cookie里面的值很容易被用户修改.同样地验证这些值的长度,范围,格式和类型.

New Document