我需要显示通过跨域请求加载的外部资源,并确保只显示“安全”内容。
可以使用Prototype的String#stripScripts来删除脚本块。但是像onclick
或onerror
这样的处理程序仍然存在。
有没有什么库可以至少
embed
或DOM那么有没有与JavaScript相关的链接和例子呢?
发布于 2009-01-10 00:19:59
更新2016:现在有一个基于Caja消毒剂的Google Closure包。
它有一个更干净的API,经过重写以考虑到现代浏览器上可用的API,并与Closure Compiler进行了更好的交互。
不知羞耻的插件:查看caja/plugin/html-sanitizer.js,获取经过彻底审查的客户端html消毒器。
它是白名单,不是黑名单,但白名单可根据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
,然后转义其中的实体。不要那样做。它很容易受到XSS注入的攻击,因为即使节点从未附加到DOM,<img src=bogus onerror=alert(1337)>
也会运行onerror
处理程序。
发布于 2012-07-05 19:31:07
通过将Google Caja HTML sanitizer嵌入到web worker中,可以使其“网络就绪”。任何由杀菌器引入的全局变量都将包含在worker中,并且处理将在它自己的线程中进行。
对于不支持Web Workers的浏览器,我们可以使用iframe作为单独的环境,让杀菌器在其中工作。Timothy Chien有一个polyfill就可以做到这一点,它使用iframe来模拟网络工作者,所以这一部分已经为我们完成了。
Caja项目在how to use Caja as a standalone client-side sanitizer上有一个维基页面
ant
html-sanitizer-minified.js
或html-css-sanitizer-minified.js
进行构建html_sanitize(...)
worker脚本只需要遵循这些说明:
importScripts('html-css-sanitizer-minified.js'); // or 'html-sanitizer-minified.js'
var urlTransformer, nameIdClassTransformer;
// customize if you need to filter URLs and/or ids/names/classes
urlTransformer = nameIdClassTransformer = function(s) { return s; };
// when we receive some HTML
self.onmessage = function(event) {
// sanitize, then send the result back
postMessage(html_sanitize(event.data, urlTransformer, nameIdClassTransformer));
};
(需要更多代码才能使simworker库工作,但这对本讨论并不重要。)
发布于 2009-01-10 00:53:24
永远不要相信客户。如果您正在编写服务器应用程序,假设客户端将始终提交不卫生的、恶意的数据。这是一条能让你远离麻烦的经验法则。如果可以,我建议在服务器代码中执行所有的验证和卫生操作,您知道(在一定程度上)不会修改这些代码。也许您可以使用服务器端web应用程序作为您的客户端代码的代理,这些代码从第三方获取并在发送到客户端本身之前进行清理?
对不起,我误解了你的问题。然而,我坚持我的建议。如果您在将服务器发送给用户之前对服务器进行杀毒,则可能会更安全。
https://stackoverflow.com/questions/295566
复制相似问题