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



这被视为XSS漏洞问题。我使用的是Imperavi的redactor组件,当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之前执行上述脚本。


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

第一张图片有红色边框。因为第二次消毒没有。

最新更新