【问题标题】:Is a url-encoded string html-safe (no injection possibilities)?url 编码的字符串是 html 安全的吗(没有注入的可能性)?
【发布时间】:2012-07-19 06:06:43
【问题描述】:

假设我的视图页面上有以下代码(在 asp.net mvc 3 razor 中):

<a href='https://example.com/search?q=@Url.Encode(Model.UserInput)'>Click here</a>

Model.UserInput 是可以包含任何字符的用户输入字符串。

就 html 注入和跨站点脚本而言,这完全安全吗?或者我应该在 URL 编码之后对查询字符串进行 HTML 编码吗?

当然,通常我会在这个阶段之前消除危险输入,但这不是重点。

【问题讨论】:

  • Url 编码和 HTML 编码是完全不同的东西。
  • @Oded 是的,当然 - 我想我应该更清楚。我想知道的是:我还需要对其进行 html 编码吗?
  • 如果你想完全安全。

标签: html asp.net-mvc urlencode


【解决方案1】:

必须对查询字符串参数进行 URL 编码;您不能也不应该以原始形式传递它们。参数(在您的情况下是用户输入)可能包含特殊的 URI 字符,例如 ?=&amp;。不编码,用户输入hansel&amp;gretel变成https://example.com/search?q=hansel&amp;gretelq 查询字符串参数只包含hansel

此外,您必须对任何 HTML 进行 HTML 编码;甚至那些在属性值中使用的片段。这是为了确保如果任何在 HTML 中具有特殊含义的字符(例如 &lt;&gt;&amp;)被转换为它们各自的 HTML 实体。 Url 编码消除了大多数这些情况,但您仍然应该养成这种习惯。

请注意,' 会绕过 URL 编码!它也会(我认为)通过 HTML 编码。不要使用 ' 作为 HTML 属性分隔符或确保您的 HTML 编码函数将 ' 转换为 &amp;#039;&amp;apos;

【讨论】:

    【解决方案2】:

    这完全安全吗

    也许是,也许不是。我会从另一个角度解决这个问题,暂时忽略安全性......

    URL 编码有一个目的:percent-encoding(它的实际名称是什么)一个 url。想象一下“url 编码”会用&lt;space width='1'&gt; 代替实际的%20 或它现在所做的任何事情来替换所有空格。在我们的假想示例中,网址“...?q=foo bar”将变为“...?q=foo&lt;space width='1'&gt;bar”,并且是正确的“网址编码”网址。这在 PDF 或 CSV 文件或您要创建的任何其他类型的输出中可能很有用,但在 HTML 中这会引起麻烦。在您的情况下,因为 ' 会“结束”href 属性,而将 1'&gt; 视为垃圾。

    <a href='https://example.com/search?q=foo<space width='1'>'>
    

    因为您的输出是针对 HTML 的,所以至少恕我直言,您实际上应该执行 HTMLEncode(URLEncode(MyUrl))(伪代码)。

    记住这一点:转义总是在特定的上下文中完成。对于 SQL,您需要一些类似“mysql_real_escape”的东西来转义引号等,以避免 SQL 注入漏洞。在 HTML 中,您需要转义 "&lt; 等字符,在 RTF 文件中,您甚至需要转义其他字符串/字符,例如(我实际上不知道)\ 会变成 \\ 或类似的东西,在 CSV 文件中,您需要在字段值中转义 ,;,在 JSON 输出中,您需要将包含 " 的字符串转义为 \"。每种类型的输出(格式)都需要自己的转义/编码。

    您现在所做的是“嵌套上下文”,您将“url 上下文”嵌套在“HTML 上下文”中。所以你必须相应地转义/编码。

    As TrueBlue demonstrates不安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2015-03-11
      • 2013-09-03
      • 2011-02-12
      相关资源
      最近更新 更多