var str = '<script>alert(1)</script>';
var decoded = $("<div/>").html(str).text();
//document.write(decoded); THIS WORKS, but I want to avoid using document.write
var para = document.createElement("script");
var node = document.createTextNode(decoded);
para.appendChild(node);
var element = document.getElementById("div1");
element.appendChild(para);
问题是由于存在 script 标签,这个 createElement 方法不起作用。关闭编码 str 中的脚本标记将导致语法错误(未捕获的 SyntaxError:意外标记 '<')。Document.write 完美无缺,但由于解析器块等的缺点,我想避免。
在实际用例中,编码字符串将是用户输入的一些广告。请注意,我们无法从他们输入的代码中删除脚本标签,而是使用 htmlentities($adcode) 将其保存在数据库中。
用户输入是可信的,因此不存在任何可能由所提出的解决方案发生的 xss 漏洞问题。
示例用户输入之一:
<script async="async" src="someURL.js"></script>
<script>
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
</script>
<div id="xyzid">
<script type="text/javascript">
googletag.cmd.push(function() {
googletag.pubads().display("Mobile_ATF_300x250", [300,250],"div-gpt-ad-0");
});
</script>
</div>
可以有各种不同版本的广告集,其模式未知。
其他不太相关的信息:我们将进一步使用<script>if(var==1) { codeblock1 } else { codeblock2} </script>(这里的代码块是第一个代码块集)。因此,任何包含直接使用解码的用户输入的解决方案都不会有用,因为脚本块将在 if-else 中中断。