【问题标题】:Javascript sanitization: The most safe way to insert possible XSS html stringJavascript 清理:插入可能的 XSS html 字符串的最安全方法
【发布时间】:2012-07-02 18:39:18
【问题描述】:

目前我正在将此方法与 jQuery 解决方案一起使用,以从可能的 XSS 攻击中清除字符串。

sanitize:function(str) {
    // return htmlentities(str,'ENT_QUOTES');
    return $('<div></div>').text(str).html().replace(/"/gi,'&quot;').replace(/'/gi,'&apos;');   
}

但我觉得这还不够安全。我错过了什么吗?

我在这里尝试了 phpjs 项目中的 htmlentities: http://phpjs.org/functions/htmlentities:425/

但它有点错误并返回一些额外的特殊符号。可能是旧版本?

例如:

htmlentities('test"','ENT_QUOTES');

生产:

test&amp;quot;

但应该是:

test&quot;

你是如何通过 javascript 处理这个的?

【问题讨论】:

  • 你打算如何使用“净化”的字符串?
  • 以文本形式插入到 html 文档中。作为 href="sanitized" 或 src="sanitized" 或
    sanitized
  • 从哪里触发插入?您想使用 Javascript 将字符串动态插入到已打开的页面中,还是使用 PHP 将字符串插入到服务器生成的 HTML 文档中?
  • 是动态使用javascript。字符串来自不受信任的来源。
  • 使用 Caja 的 html_sanitize.js。 stackoverflow.com/questions/12253686/…

标签: javascript xss html-sanitizing


【解决方案1】:

如果您的字符串应该是没有 HTML 格式的纯文本,只需使用 .createTextNode(text)/assigning 到现有文本节点的 .data 属性。无论您放在那里,都将始终被解释为文本,无需额外转义。

【讨论】:

  • ' 或 " 和其他我可能不知道的符号呢?
  • 我写了“随便”,它确实是“随便”。您将在 DOM 结构中操作只能包含文本的字段。这些操作不会像著名的innerHTML 那样导致任何对 HTML 解析器的自动调用(顺便说一句,这仍然被认为是该功能最严重的设计缺陷之一)。
【解决方案2】:

是的,使用 javascript 动态地。字符串来自不受信任的来源。

那么您无需手动对其进行消毒。使用 jQuery 你可以编写

​var str = '<div>abc"def"ghi</div>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​';

​$​('test').text(str);
$('test').attr('alt', str);

浏览器会为您将数据与代码分开。

示例:http://jsfiddle.net/HNQvd/

【讨论】:

  • 虽然alt 是安全的,但您仍然会遇到可以被解释为非文本的属性的问题。最明显的是onclick 和其他处理程序,还有src
  • 一切都可以被认为是有害的。如果 OP 要更改任意属性(使用用户提供的名称),那么它们所面临的问题不仅仅是清理值。
  • 人。我的帖子中有一个可行的解决方案。如果在
    HERE
    或 中使用它,我只想让你们更新它。就这样。 :)
  • @Beck 再一次,你不应该重新发明自行车(可能有一些漏洞);您应该使用支持良好的标准解决方案,将数据和代码分开。例如,与其努力清理字符串,然后将清理后的结果写入innerHtml,不如让源字符串保持原样并将其写入innerText
【解决方案3】:

你也应该引用其他字符:

'
"
<
>
(
)
;

它们都可以用于 XSS 攻击。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多