ValidateRequest不起作用

时间:2009-12-08 20:09:33

标签: asp.net

以下是该方案:

我的.ascx上有一个常规超链接。 (不,我决定不使用asp.net控件) 单击时的超链接会在查询字符串中发送要删除的对象的ID,因此在我的页面的代码隐藏中,我抓住它,如果它在那里调用RemoveSomeItem方法删除它,然后将Response.Redirect返回到Request.Path,因为我们不知道.aspx页面将使用此控件。一切正常。

但是我需要在重定向“你刚刚删除[项目名称]”之后在.aspx页面顶部显示一条不错的消息

所以我所做的就是在响应重定向中,我添加了一个名为removedItemName的额外查询字符串参数,例如字符串中甚至包含一些HTML:

&removedName=<sup>©</sup> Hockey Cup - Large

问题 ASP.NET将此检测为可能不安全的字符串,但当然这绝不会是这样我尝试将其添加到.aspx页面指令中:

ValidateRequest="false"

但它无效。 ASP.NET仍在抛出错误:

从客户端检测到一个潜在危险的Request.QueryString值(removedName =“© Hockey ......”)。

第二,是否有人在完全有害的情况下在查询字符串中传递这样的Html?意思是这个常见吗?它是否会导致通过查询字符串参数传递带空格的字符串或者是否可以接受空格?

2 个答案:

答案 0 :(得分:4)

我首先要说这通常是一个坏主意。您不希望直接控制页面中呈现给用户的内容。他们可以在查询字符串中添加任何内容。你最好像这样缓存消息:

Guid id = Guid.NewGuid();
HttpRuntime.Cache.Add(id, "<sup>foo</sup>");
Response.Redirect("page.aspx?message=" + id.ToString());

然后检索邮件(如果需要,删除它):

string message = HttpRuntime.Cache[new Guid(Request.QueryString["message"])];
HttpRuntime.Cache.Remove(id);

但是如果你必须知道如何将HTML放在查询字符串中:

对其进行编码:

string value = HttpUtility.UrlEncode("<sup>foo</sup>");

收率:

%3Csup%3Efoo%3C%2Fsup%3E 

进行解码以获得相反的结果:

string value = HttpUtility.UrlDecode("%3Csup%3Efoo%3C%2Fsup%3E");

答案 1 :(得分:2)

允许在查询字符串中传递HTML非常危险,并且会使您的网站出现多种安全问题。您应该找到一种方法来通过查询字符串传递一些数据(如ID和消息类型)(或者更好,在Session或Cookie中),并让您重定向的页面确定要显示的消息。