javascript - .html() 函数的 Jquery 替换不会尝试在 Redactor imperavi - Xss 漏洞上重写 html

标签 javascript html jquery xss redactor

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

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

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

编校者删除脚本标签并生成此字符串。这是预期的,因为 XSS 攻击。

<qssQ5GkdwWU=7;//<

然后编校者尝试使用 html.(html) 将先前的值设置为编校者元素时出现问题。它会认为有一个元素并输出:

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

我怎样才能设置元素的值,同时防止这种行为?

最佳答案

您可以覆盖 JQuery 的 htmlPrefilter 函数:

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 之前执行上述脚本。


如果您决定自己进行 sanitizer ,那么您可以使用 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>

第一张图片有红色边框。并且由于第二次 sanitizer 没有。

关于javascript - .html() 函数的 Jquery 替换不会尝试在 Redactor imperavi - Xss 漏洞上重写 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70806407/

相关文章:

javascript - 隐藏内容的固定位置应该保持在顶部

javascript - paddingheight 具有不同的高度

html - Bootstrap Nav 标志问题

html - 为什么我的内容在页面上向下移动?

javascript - jQuery - 创建下拉工具栏组件

javascript - putImageData 不缩放/适合 Canvas 中的视频/图像(HTML5、CSS、JS)

javascript - 单击时将参数传递给 Angular Directive(指令)

javascript - JS to keep css selector hover state on - css animation, 已经尝试了多个答案但没有成功

c# - 如何从 URL 中获取网页标题和图片?

jquery - $.post 调用在 Safari 中未发生