我需要显示通过跨域请求加载的外部资源,并确保只显示“安全”内容。
可以使用 Prototype 的 String#stripScripts删除脚本 block 。但是 onclick
或 onerror
等处理程序仍然存在。
有没有图书馆至少可以
- 剥离脚本 block ,
- 杀死 DOM 处理程序,
- 删除黑名单标签(例如:
embed
或object
)。
那么那里有任何与 JavaScript 相关的链接和示例吗?
最佳答案
2016 年更新:现在有一个 Google Closure基于 Caja sanitizer 的包装。
它有一个更简洁的 API,被重写以考虑现代浏览器上可用的 API,并与 Closure Compiler 更好地交互。
无耻外挂:见caja/plugin/html-sanitizer.js对于经过全面审查的客户端 html sanitizer 程序。
它是白名单,不是黑名单,但是白名单是可以根据CajaWhitelists配置的
如果要删除所有标签,请执行以下操作:
var tagBody = '(?:[^"\'>]|"[^"]*"|\'[^\']*\')*';
var tagOrComment = new RegExp(
'<(?:'
// Comment body.
+ '!--(?:(?:-*[^->])*--+|-?)'
// Special "raw text" elements whose content should be elided.
+ '|script\\b' + tagBody + '>[\\s\\S]*?</script\\s*'
+ '|style\\b' + tagBody + '>[\\s\\S]*?</style\\s*'
// Regular name
+ '|/?[a-z]'
+ tagBody
+ ')>',
'gi');
function removeTags(html) {
var oldHtml;
do {
oldHtml = html;
html = html.replace(tagOrComment, '');
} while (html !== oldHtml);
return html.replace(/</g, '<');
}
人们会告诉你,你可以创建一个元素,并分配 innerHTML
然后得到 innerText
或 textContent
,然后转义其中的实体。不要那样做。自 <img src=bogus onerror=alert(1337)>
以来,它容易受到 XSS 注入(inject)攻击将运行 onerror
处理程序,即使节点从未附加到 DOM。
关于javascript - 在客户端清理/重写 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/295566/