2

我有一种情况,我不确定我得到的输入是否是 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

我可以避免转义与号 ( &),但这样做有什么风险?很感谢任何形式的帮助!

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

4

2 回答 2

2

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

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

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

如果您查看 fckEditor 之类的产品,您可以选择编辑源代码或使用富文本编辑器。这避免了对自动编码检测的需要。

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

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

上面的这个例子将检测 < 字符。

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

最后,我建议看看这个答案。他们建议使用解码功能和检测长度。

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 编码是正确的。

于 2013-08-05T14:57:29.810 回答
1

在将不受信任的输入连接成诸如 HTML 之类的结构化语言之前,您必须始终正确地对其进行编码。

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

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

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

于 2013-08-05T14:55:08.760 回答