在我的ASP.NET应用程序中,我正在记录发生的任何应用程序错误,而且偶尔出现的错误是:
A potentially dangerous Request.Form value was detected from the client (ctl00$MainContent$ddl_Months="<a").
我知道这与<
有关 - 但DropDownList
不包含此内容。
标记:
<select name="ctl00$MainContent$ddl_Months" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MainContent$ddl_Months\',\'\')', 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();
我无法复制此错误,并想知道我可以使用哪些选项来解决此问题?
答案 0 :(得分:3)
如果您无法重现这一点,并且您已经验证所有数据库值都没有HTML标记字符,那么您可能会看到的是对您网站的攻击。跨站点脚本(XSS)攻击者喜欢修改选择列表选项和隐藏字段的值,因为许多Web开发人员不会考虑验证这些值。 (错误的)想法是这些值是安全的,因为它们是由应用程序提供的,而“普通用户”不能改变它们。
如果可以,请捕获并查看导致错误的请求的上下文(堆栈跟踪,会话值,请求信息)。查看Referrer URL以查看它是否是您期望的其他内容。查看远程地址(客户端IP地址)并对其进行WhoIs查找。这可能有助于您确定请求的来源,这可以帮助您确定它是否是有效的请求,或者是否有点阴暗。
如果使用输入字段(如文本框)进行此操作,则可能是您的用户“意外”输入了无效字符。由于它是在预先填充的选择列表中发生的,我认为证据指向XSS攻击。 ASP.NET正在做它应该做的事情 - 防止你无意中将HTML标签保存在你不想要的地方。
WiseGuyEh 最初在评论中提到了XSS的可能性。我不认为HTML编码技巧会在这种特殊情况下为你做任何事情,因为你的数据库值都是数字,不包含需要编码的字符。
另一种(可能是偏远的)可能性是一些流浪的引用字符(“)导致DOM变得腐败。我之所以提到这只是因为我偶尔会成为这个人的受害者,但我怀疑它是否适用于此处因为你的错误是间歇性的。
答案 1 :(得分:0)
在页面指令
中设置以下代码ValidateRequest="false"