【问题标题】:Jquery replacement for .html() function that won't try to rewrite the html on Redactor imperavi - Xss vulnerability.html() 函数的 Jquery 替换不会尝试重写 Redactor imperavi 上的 html - Xss 漏洞
【发布时间】:2022-01-21 19:02:49
【问题描述】:

这被视为 XSS 漏洞问题。我正在使用来自Imperavi 的编辑器组件,当 Html 无效时,它似乎无法生成正确的输出值。

问题是当我们插入这样的字符串时:

<<SCRIPT a=2>qssQ5GkdwWU=7;//<</SCRIPT>

编辑器删除脚本标签并生成此字符串。由于 XSS 攻击,这是意料之中的。

<qssQ5GkdwWU=7;//<

问题发生后,编辑器尝试使用html.(html) 将先前的值设置为编辑器元素。它会认为有一个元素,会输出这个:

<qssq5gkdwwu=7;> </qssq5gkdwwu=7;>

如何将值设置为元素但防止这种行为?

【问题讨论】:

  • 你能创建一个sn-p来说明这个问题吗?

标签: javascript html jquery xss redactor


【解决方案1】:

你可以覆盖 JQuery 的htmlPrefilterfunction:

htmlPrefilter: function( html ) {
  return html;
},

如果特殊字符是问题,那么尝试像这样转义它们:

// trying to set following string as innerHTML
let c = '<qssQ5GkdwWU=7;//<';

// with default jquery
$('.one').html(c);


// modify filter function, and do your own character escaping 
jQuery.htmlPrefilter = function(html) {
  let clean = html.replace(/[&<"']/g, function(m) {
    switch (m) {
      case '&':
        return '&amp;';
      case '<':
        return '&lt;';
      case '"':
        return '&quot;';
      default:
        return '&#039;';
    }
  });

  return clean;
}

// now try on second div
$('.two').html(c);
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
One:<span class="one"></span><br> 
Two:<span class="two"></span><br>

最好在加载 Redactor 之前执行上述脚本。


如果您决定自己进行清理,则可以使用 DOMPurify 或类似的库。

let content = 'Malicius content <img src="https://dummyimage.com/30" onload="this.style.border=`2px solid red`;alert(`attacked! :p`);" >';
// default jquery
$('.one').html(content);


// modify filter function, do your own sanitization
jQuery.htmlPrefilter = function(html) {
  html = DOMPurify.sanitize(html);
  console.log('sanitized: ', html)
  return html;
}

// trying on second div
$('.two').html(content);
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.3.4/purify.min.js" integrity="sha512-jGh38w63cHRzfBHtyKgEMMkJswUFXDA3YXrDjaE8ptzxV5DDkLDUDjtGUy5tmDkOXHWsItKfFjocaEtj1WuVnQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

One:<span class="one"></span><br> Two:
<span class="two"></span><br>

第一张图片有红色边框。而且由于消毒第二次没有。

【讨论】:

  • 感谢您的回答。您认为覆盖 htmlPrefilter() 是否安全?我的意思是,它会影响整个应用程序。只是想一想是否存在消毒不理想的情况。
  • 你是对的。我们只需要在您接受用户输入或将用户输入显示为 html 的情况下进行清理。在这种情况下,&lt;qssQ5GkdwWU=7;//&lt; 仅打开尖括号是问题所在。所以更正确的逻辑是,如果你没有找到相应的右括号,然后转义左括号。
猜你喜欢
  • 2021-09-03
  • 2017-01-02
  • 2013-09-16
  • 2023-04-07
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2012-06-08
  • 2012-03-10
相关资源
最近更新 更多