【问题标题】:How to handle possibly HTML encoded values in javascript如何在 javascript 中处理可能的 HTML 编码值
【发布时间】:2013-08-06 07:59:06
【问题描述】:

我有一种情况,我不确定我得到的输入是否是 HTML 编码的。我该如何处理?我也有可用的 jQuery。

function someFunction(userInput){
    $someJqueryElement.text(userInput);
}

// userInput "<script>" returns "&lt;script&gt;", which is fine
// userInput "&lt;script&gt;" returns &amp;lt;script&amp;gt;", which is bad

我可以避免转义 & 符号 (&amp;),但这样做有什么风险?非常感谢任何帮助!

重要提示:此用户输入不在我的控制范围内。它从外部服务返回,有人可能篡改它并避免该服务本身提供的 html 转义。

【问题讨论】:

  • 真的需要避免这些情况。为什么不确定?
  • 输入已经编码为什么重要?如果用户输入文字&amp;lt;script&amp;gt;,那么这就是应该显示的内容。对其进行编码不会改变其呈现方式。
  • 我有一种情况,我不确定我得到的输入是否是 HTML 编码的——这很糟糕。
  • @Justus 如果你把它放在你原来的帖子里,你现在就不会有 4 个无用的 cmets 了;)
  • 如果您无法控制外部服务,则始终对所有内容进行 HTML 编码。如果结果是双重编码的,请直接向外部服务投诉。真的,情况听起来像是一场无法取胜的烂摊子。

标签: javascript jquery html encoding decoding


【解决方案1】:

您必须始终正确编码不受信任的输入,然后才能将其连接为 HTML 等结构化语言。

否则,您将启用 XSS 等注入攻击。

如果输入应该包含 HTML 格式,您应该使用 sanitizer 库去除所有可能不安全的标签和属性。

您也可以使用正则表达式/&lt;|&gt;|&amp;(?![a-z]+;) 来检查字符串是否有任何非编码字符;但是,您无法区分已编码的字符串和谈论编码的未编码字符串。

【讨论】:

  • 我完全同意,但是有没有办法检查它是否被编码,或者避免那些丑陋的双编码消息?
  • @JustusRomijn:if (!/&lt;|&gt;|&amp;(?![a-z]+;)/.test(source))。但是,您无法判断像 &amp;lt; 这样的文本是否应该是编码的 &lt; 还是应该是谈论 XML 的文字。
  • 不错的正则表达式,也许您想将它添加到您的答案中?我想我可以在某个地方找到它。
【解决方案2】:

您确实需要确保避免这些情况,因为它会引入非常难以预测的情况。

尝试向函数添加额外的变量输入。

function someFunction(userInput, isEncoded){
    //Add some conditional logic based on isEncoded
    $someJqueryElement.text(userInput);
}

如果您查看 fckEditor 之类的产品,您可以选择编辑源代码或使用富文本编辑器。这样就无需进行自动编码检测。

如果您仍然坚持自动检测 html 编码字符,我建议使用 index of 来验证某些关键短语是否存在。

str.indexOf('&lt;') !== -1

上面的这个例子将检测

~~~编辑后在此行下方添加了新文本。~~~

最后,我建议查看this answer。他们建议使用解码功能和检测长度。

var string = "Your encoded &amp; decoded string here"

function decode(str){
    return decodeURIComponent(str).replace(/&lt;/g,'<').replace(/&gt;/g,'>');
}

if(string.length == decode(string).length){
    // The string does not contain any encoded html.
}else{
    // The string contains encoded html.
}

同样,这仍然存在用户通过输入那些特殊编码的字符来伪造进程的问题,但这就是 html 编码。因此,一旦出现这些字符序列之一,就假设 html 编码是正确的。

【讨论】:

  • 我喜欢你的实用解决方案,但是通过在输入中的某处添加这个&amp;lt; 字符串也很容易让输入通过。
  • 感谢您的链接,很好地解释了为什么我不知道是否完成了转义。
  • 那个代码非常错误。 URI 转义与 HTML 转义无关,并且不能正确涵盖 HTML 转义。
  • SLaks,他没有要求任何带有 URL 的东西。除了以这种方式检测可能非常糟糕之外,代码没有任何问题。当然它没有正确覆盖,这就是为什么答案的文字说这不是一个好主意。 OP 要求提供代码,而不是要求以这种方式编写代码的道德理由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
相关资源
最近更新 更多