ASP.NET潜在危险请求

时间:2011-02-16 10:40:51

标签: asp.net

在我的ASP.NET应用程序中,我正在记录发生的任何应用程序错误,而且偶尔出现的错误是:

A potentially dangerous Request.Form value was detected from the client (ctl00$MainContent$ddl_Months="<a"). 

我知道这与<有关 - 但DropDownList不包含此内容。

标记:

enter image description here

<select name="ctl00$MainContent$ddl_Months" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;ctl00$MainContent$ddl_Months\&#39;,\&#39;\&#39;)&#39;, 0)" id="ctl00_MainContent_ddl_Months">
    <option selected="selected" value="201011">201011</option>
    <option value="201010">201010</option>
    <option value="200906">200906</option>
    <option value="200905">200905</option>
    <option value="200904">200904</option>
</select>

代码:

标记

   <asp:DropDownList ID="ddl_Months" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_Months_SelectedIndexChanged" />

背后的代码

DataTable tblMonths = GlobFunctions.GetData("GetBureauReportsMonths", GlobVar.conStrX, new SqlParameter[1]
{
    new SqlParameter("@BureauNumber", BureauCode)
});

List<string> months = new List<string>();

for (int i = 0; i < tblMonths.Rows.Count; i++)
{
    months.Add(Server.HtmlEncode(tblMonths.Rows[i][0].ToString()));
}

ddl_Months.DataSource = months;

ddl_Months.DataBind();

我无法复制此错误,并想知道我可以使用哪些选项来解决此问题?

2 个答案:

答案 0 :(得分:3)

如果您无法重现这一点,并且您已经验证所有数据库值都没有HTML标记字符,那么您可能会看到的是对您网站的攻击。跨站点脚本(XSS)攻击者喜欢修改选择列表选项和隐藏字段的值,因为许多Web开发人员不会考虑验证这些值。 (错误的)想法是这些值是安全的,因为它们是由应用程序提供的,而“普通用户”不能改变它们。

如果可以,请捕获并查看导致错误的请求的上下文(堆栈跟踪,会话值,请求信息)。查看Referrer URL以查看它是否是您期望的其他内容。查看远程地址(客户端IP地址)并对其进行WhoIs查找。这可能有助于您确定请求的来源,这可以帮助您确定它是否是有效的请求,或者是否有点阴暗。

如果使用输入字段(如文本框)进行此操作,则可能是您的用户“意外”输入了无效字符。由于它是在预先填充的选择列表中发生的,我认为证据指向XSS攻击。 ASP.NET正在做它应该做的事情 - 防止你无意中将HTML标签保存在你不想要的地方。

WiseGuyEh 最初在评论中提到了XSS的可能性。我不认为HTML编码技巧会在这种特殊情况下为你做任何事情,因为你的数据库值都是数字,不包含需要编码的字符。

另一种(可能是偏远的)可能性是一些流浪的引用字符(“)导致DOM变得腐败。我之所以提到这只是因为我偶尔会成为这个人的受害者,但我怀疑它是否适用于此处因为你的错误是间歇性的。

答案 1 :(得分:0)

在页面指令

中设置以下代码
ValidateRequest="false"