AngularJS 中 markdown filter 带来的 XSS

在 GitHub 上引用了一个哥们为 AngularJS 写的 markdown filter,在后台编辑的时候手痒试了下 XSS,果然弹出框了。

本来想直接在 GitHub 上换一套插件试试,结果研究了一下解决了这个问题。

AngularJS 中如果当前 module 引用了 ngSanitize,那么在页面中 ng-bind-html 默认是会进行 $sanitize 的过滤的,可以过滤掉 script 这种比较敏感的标签。

另外一种情况是,引用了 ngSanitize,但是在 controller 里面 $sce.trustAsHtml 函数返回,结果就是来什么执行什么,完全信任传入的 HTML 代码。

最安全的情况是不使用 ng-bind-html 而是使用 ng-bind,自动把符号都 HTML 编码了。但是显然 Markdown 从一开始就是拒绝的。

他的项目中 filter 是这么设计的,完全信任了 filter 获取到的 HTML 内容,导致 XSS 代码赤裸裸地被执行了。

.filter('markdown', ['$sce', 'markdown', function ($sce, markdown) {
        return function (text) {
            if(text == null) text = '';
            var html = markdown.makeHtml(text);
            return $sce.trustAsHtml(html);
        };
    }])

结果我改成,然后在 angular.module('markdown', ['ngSanitize']) 这里引入 ngSanitize,就可以让 AngularJS 自动的滤除 XSS 啦。

    .filter('markdown', ['markdown', function (markdown) {
        return function (text) {
            if(text == null) text = '';
            var html = markdown.makeHtml(text);
            return html;
        };
    }])

document of ngSanitize

reported issue

转载于:https://my.oschina.net/shinedev/blog/483104

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值