【问题标题】:Is sanitizing html by removing angle brackets safe?通过删除尖括号来清理 html 安全吗?
【发布时间】:2015-07-29 10:14:29
【问题描述】:

我想用一个人的名字清理一个简单的文本字段,以防止 XSS 等。 Stackoverflow 几乎说我必须列入白名单。我不明白这一点。如果我只是从输入值中删除所有<>,或者用>&ls; 替换它们,那不排除代码注入吗?还是我错过了什么?也许您只需要在不得不忍受尖括号的更复杂的场景中加入白名单?

抱歉,如果这是一个愚蠢的问题,请务必正确处理。

【问题讨论】:

  • <>,而不是 <ls;<gt;。那里有更复杂的系统来支持 HTML 的子集(像 <b><i> 之类的东西,但不是 <script>)。如果您根本不需要任何 HTML,只需删除尖括号就可以了。
  • 糟糕,已更正,谢谢!
  • 根据您选择使用名称的方式,您可能还需要替换引号和/或撇号(例如,如果您要将名称用作 input 元素的值)。它们可以替换为“”和&.您还应该用 & 替换 & 符号。如果您的语言有转义 HTML 的方法,请使用它(例如 .NET 中的 HttpUtility.HtmlEncode 或 PHP 中的 htmlspecialchars)。
  • 我正要问这个。 Java和Javascript中HTML转义的方法有哪些?
  • 我不知道 Java 或 JavaScript 中有任何内置方法,但有一些方法。对于 Java,请参阅 Recommended method for escaping HTML in Java,对于 JavaScript,请参阅 HTML-encoding in JavaScript/jQuery

标签: code-injection html-sanitizing javascript-injection


【解决方案1】:

是白名单还是编码取决于你想如何使用文本。

如果您打算将输入视为纯文本,则对特殊字符进行编码就足够了,只要您注意不要让未编码的文本出现在 HTML 输出中的任何位置,输入的任何 HTML 代码都会显示为文本. (这包括确保您与之交互的任何其他系统都不会不当使用未编码的文本。)

如果您想在输入中允许某些标记,例如文本样式或链接,则必须将您允许的标记列入白名单并删除所有其他标记。

【讨论】:

    【解决方案2】:

    不,这还不够,因为如果您要将人名包含在 html 属性中,您还需要转义其中包含的任何双引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多