【问题标题】:JQuery - Add regular HTML along with escaped HTMLJQuery - 添加常规 HTML 和转义 HTML
【发布时间】:2018-06-15 17:38:06
【问题描述】:

我在 firebase 中存储了一些数据(可以在客户端中检索),然后,我使用 JQuery 将其添加到 HTML 中。这很简单——我只是将数据添加到 DOM 元素中。然而,问题是,这个原始代码很容易受到攻击,所以我需要在将其添加到 HTML 之前正确地转义从数据库中获取的数据。我认为下面的代码可以完成这项工作:

function escapeHTML(text) {
  var map = {
    '&': '&',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };
  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}

$('#element').prepend('<h1>Heading</h1><p>' + escapeHTML(data) + '</p>');

当我测试这段代码时,通过使数据的值类似于&lt;script&gt;alert('This should not work');&lt;/script&gt;,我认为它只会将此文本添加到&lt;p&gt;&lt;/p&gt;标签中,而不执行JS,但它实际上运行了代码。

我知道使用 $('#element').text() 会为我转义文本,但我不希望所有内容都被转义 - 我仍然想添加 &lt;h1&gt;&lt;/h1&gt;&lt;p&gt;&lt;/p&gt; 标签,我只需要变量“数据“要逃脱。我看到了一些关于类似主题的 StackOverflow 帖子,但似乎都没有解决这个问题 - post 1post 2post 3

【问题讨论】:

  • XSS 不仅仅是
  • @epascarello 你是什么意思?这不是运行插入的 JS 代码的唯一方法吗?
  • 不,还有更多方法可以做到。
  • @epascarello 好。你能给我一个例子或一些链接吗?

标签: javascript jquery html html-escape-characters


【解决方案1】:

您问题中的代码不起作用的原因是因为在解析 HTML 中的 JS 时,Javascript 中的所有实体(如 &amp;amp;)都被解析为它们所代表的字符。如果您将代码放在外部 .js 文件中,它会起作用,因为它不会被解析为 HTML。或者你可以对它们进行双重编码:

  var map = {
    '&': '&amp;amp;',
    '<': '&amp;lt;',
    '>': '&amp;gt;',
    '"': '&amp;quot;',
    "'": '&amp;#039;'
  };

但更好的方法是分别创建&lt;h1&gt;&lt;p&gt;元素,并使用jQuery方法将转义文本放入段落中。

const data = '<scr' + 'ipt>alert("foo");</scr' + 'ipt>';

$("#element").prepend("<h1>Heading</h1>", $("<p>", {text: data}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="element"></div>

如果要填写数据属性,类似方法:

$("#element").prepend($("<div>", {
    data: {
        attr: data,
        another: someMoreData
    },
    text: "hello world"
}));

【讨论】:

  • 怀疑如果内容包含粗体等标签,这将满足 OP 的需求。也许它是纯文本,会很好....
  • 为什么这么说?
  • @Barmar 我实际上是在像这样添加来自 firebase 的数据:$('#element').prepend('&lt;div data-attr="'+data+'" data-another="'+someMoreData+'"&gt;hello world&lt;/div&gt;')。所以,我不知道如何使用你的 JQuery 方法......另外,这已经在一个外部 JS 文件中,即使它不是,我认为它不会被解析为 HTML - 它在一个细绳。但这可能不是我问题的原因。但是,您的双重转义方法很有效!非常感谢!不过我还不能投票给你,因为我的代表太低了
  • 我添加了代码,展示了如何使用对象方法填充数据属性。
猜你喜欢
  • 2014-03-12
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多