【问题标题】:ValidateRequest not working验证请求不起作用
【发布时间】:2009-12-08 20:09:32
【问题描述】:

场景如下:

我的 .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 以用于完全有害的情况?意思是这个普遍吗?它是否会导致通过查询字符串参数传递带空格的字符串出现问题,或者是否可以接受空格?

【问题讨论】:

  • 你能通过 Session 对象传递“removedName”吗?
  • 啊,我到底在想什么。我可以传递一个不同的ID。你看我删除了一个项目的克隆。但我仍然可以通过查询字符串传递原始 itemID。然后从仍在我们系统中的真实项目中获取名称。我不需要传递已删除克隆项目的名称。 (你可能不知道我在说什么,但它指的是我们的业务)。无论如何,重点是,尝试找到一种方法不要传递我试图传递的内容,尤其是像你说的那样,HTML 或将在页面上重新显示的内容,因为它对字符串注入是一个很大的禁忌。

标签: asp.net


【解决方案1】:

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

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");

【讨论】:

  • 天哪,呵呵!谢啦。我一直在使用 asp.net 控制方式太多。很高兴摆脱它们,只需使用更多重定向和请求。
  • 对不起,-1。你不应该在查询字符串中传递 HTML。
  • @John 永不言败。我确实添加了说明。
  • 我喜欢更新后的答案,但它说我的反对票太旧而无法撤消。
  • 是的,没用...6+Designs©+Hockey+Mug++ 最终得到了...混合 HTML 和编码值
【解决方案2】:

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

【讨论】:

  • 最好将删除的项目封装在我的 .ascx 中并处理在 .ascx.cs 中显示该消息。问题是我必须在用户单击超链接后进行重定向以刷新页面,然后我必须删除该项目并重定向到同一页面以刷新。因为我必须重定向,所以我在代码隐藏中丢失了所有内容,所以唯一的方法是通过查询字符串传递它,例如被删除的项目的名称。
  • 否则我必须在我的 .ascx 中设置一个处理程序,并在使用此控件的任何 .aspx 页面中处理项目的删除,这是冗余代码。因此,我将删除逻辑保留在 .ascx.cs 中,并在用户单击我的 .ascx 中的删除超链接并从后面的 .ascx.cs 代码处理它之后检查查询字符串中的 removedItemID。我重定向到 Request.Page(无论 .aspx 正在使用此控件),因此我还需要在我的控件上方显示一条确认消息,表明 x 项已在该 .aspx 页面上被删除。该消息已设置并显示在我的 .ascx 的顶部
  • 好答案。谢谢。我想给你们两个答案,但不能。
猜你喜欢
  • 2016-01-19
  • 2020-12-25
  • 1970-01-01
  • 2019-10-06
  • 2020-12-10
  • 1970-01-01
  • 2020-07-17
  • 2021-10-20
  • 2014-10-04
相关资源
最近更新 更多