【问题标题】:How to escape insecure content in form in order to prevent XSS?如何以形式转义不安全的内容以防止 XSS?
【发布时间】:2011-06-17 15:29:23
【问题描述】:

我知道这可能很愚蠢,但是当我在表单中显示它时如何逃避用户输入。我不是指任何输出,尤其是表单输入。例如,如果我有输入标签并将用户文本放入值中。

<input type="text" value="'test' "test" <script>alert('hacked');</script>" />

当我离开它时,它会正确显示

'test' "test" <script>alert('hacked');</script>

没有发生 XSS,但我不觉得安全,因为其他代码最终可能会崩溃。在将数据放入表单时,是否有类似浏览器内置方法来防止 XSS 或我遗漏了什么?

编辑:我没有说出整个故事。对于那个很抱歉。当我使用 htmlentities 或 htmlspecialchars 时,我得到了我不想要的转义数据。我在输入中看到了这个,这不是输入的内容:(

'test' &quot;test&quot; &lt;script&gt;alert('hacked');&lt;/script&gt;

我想防止 XSS 并在不更改内容的同时显示内容。这种情况下可以吗

【问题讨论】:

  • 您绝对不想在最终用户完全控制的客户端(网络浏览器)中处理这个问题。您应该在服务器端完全处理这个问题。至于如何做取决于您在问题中没有提到的所使用的编程语言。请更新您的问题。
  • @BalusC 如果之前的问题有任何迹象表明我的猜测是 PHP
  • 我现在如何转义 html,问题是当它在输入值中时,输出看起来不像输入。我想阻止 XSS,但最终用户能够看到并最终编辑输入的相同文本。

标签: php html forms escaping xss


【解决方案1】:

您应该对文本进行 HTML 编码,使其最终如下所示:

<input type="text" value="'test' &quot;test&quot; &lt;script&gt;alert('hacked');&lt;/script&gt;" />

您应该使用服务器语言来执行此操作。 Javascript 中没有对此的内置支持,因此您必须自己构建一个函数。

以 ASP.NET MVC 为例,它可能如下所示:

<input type="text" value="<%= Server.HtmlEncode(Model.UserInput) %>" />

MVC 2 还具有自动编码文本的&lt;%: %&gt; 标签:

<input type="text" value="<%: Model.UserInput %>" />

编辑:

在浏览器中检查页面的来源,看看结果是什么。

您似乎对文本进行了两次转义,例如," 转义为 &amp;amp;quot;,然后转义为 &amp;amp;quot;。

【讨论】:

  • 但我希望最终用户能够查看和编辑原始内容,而不是被转义的内容。我希望能够看到
  • @Yasen Zhelev:您对值进行 HTML 编码,以便浏览器正确解释它。输入中显示的值将是原始字符串。
  • 这是不转义还是转义?我附上了一张图片来显示我得到的输出,这就是我在 SO 中提出问题的原因。如果我逃跑我会失去理智,如果我不逃跑我会害怕 XSS。
  • @Yasen Zhelev:在浏览器中检查页面的来源,看看结果如何。看起来您正在转义文本两次,例如," 转义为 &amp;amp;quot;,然后转义为 &amp;amp;quot;。
  • 你完全正确。我想知道发生了什么以及为什么转义很奇怪。我两次转义数据。将此添加到您的答案中,我会接受。
【解决方案2】:

在 PHP 中,使用htmlspecialchars() 对任何 GET 或 POST 内容中的 XSS 字符进行转义(例如,如果您的数据称为 $_POST['data'],则将其转义为:$variable = htmlspecialchars($_POST['data']);)。此外,如果您使用数据库,请使用 addslashes() 转义引号和撇号。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    您如何放置用户文本?如果您有控制权,从服务器端,所有语言都支持在浏览器上呈现之前对输出进行编码。

    只要你清理输出。您基本上可以允许用户输入他们想要的任何内容。然后在显示内容的时候,只需要对它进行编码,这样浏览器就不会执行了。这可以通过任何语言 PHP、JScript、ASP、VB、C# 等来完成...

    【讨论】:

      【解决方案4】:

      由于引号是用来突破输入属性的,所以只需将所有引号替换为"

      【讨论】:

      • 文本区域怎么样?我是否应该寻找 或其他东西并将其转义以防止 XSS。
      • 看起来 textarea 标签将使用 &lt、&gt、&quot 等进行完全转义。
      猜你喜欢
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多