首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在客户端清理/重写HTML

在客户端清理/重写HTML
EN

Stack Overflow用户
提问于 2008-11-17 13:34:33
回答 10查看 108.9K关注 0票数 83

我需要显示通过跨域请求加载的外部资源,并确保只显示“安全”内容。

可以使用Prototype的String#stripScripts来删除脚本块。但是像onclickonerror这样的处理程序仍然存在。

有没有什么库可以至少

  • 条带脚本块、
  • 删除DOM处理程序、
  • 删除黑名单标记(例如:embed或DOM

那么有没有与JavaScript相关的链接和例子呢?

EN

回答 10

Stack Overflow用户

发布于 2009-01-10 00:19:59

更新2016:现在有一个基于Caja消毒剂的Google Closure包。

它有一个更干净的API,经过重写以考虑到现代浏览器上可用的API,并与Closure Compiler进行了更好的交互。

不知羞耻的插件:查看caja/plugin/html-sanitizer.js,获取经过彻底审查的客户端html消毒器。

它是白名单,不是黑名单,但白名单可根据CajaWhitelists进行配置

如果要删除所有标记,请执行以下操作:

代码语言:javascript
复制
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, '&lt;');
}

人们会告诉你,你可以创建一个元素,分配innerHTML,然后获取innerTexttextContent,然后转义其中的实体。不要那样做。它很容易受到XSS注入的攻击,因为即使节点从未附加到DOM,<img src=bogus onerror=alert(1337)>也会运行onerror处理程序。

票数 113
EN

Stack Overflow用户

发布于 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
  • Include html-sanitizer-minified.jshtml-css-sanitizer-minified.js进行构建
  • Call html_sanitize(...)

worker脚本只需要遵循这些说明:

代码语言:javascript
复制
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库工作,但这对本讨论并不重要。)

演示:https://dl.dropbox.com/u/291406/html-sanitize/demo.html

票数 40
EN

Stack Overflow用户

发布于 2009-01-10 00:53:24

永远不要相信客户。如果您正在编写服务器应用程序,假设客户端将始终提交不卫生的、恶意的数据。这是一条能让你远离麻烦的经验法则。如果可以,我建议在服务器代码中执行所有的验证和卫生操作,您知道(在一定程度上)不会修改这些代码。也许您可以使用服务器端web应用程序作为您的客户端代码的代理,这些代码从第三方获取并在发送到客户端本身之前进行清理?

对不起,我误解了你的问题。然而,我坚持我的建议。如果您在将服务器发送给用户之前对服务器进行杀毒,则可能会更安全。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/295566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档