我在客户端使用Angular(1.2 RC2)开发CMS驱动的网站.由于内容来自CMS,我不幸被迫在
JSON字符串中使用接收HTML.大多数HTML都被注入并渲染得很好,但是图像标签的src被剥离了.从我读到的src应该以“unsafe:”为前缀,如果这是Angular中的XSS安全问题,则不会完全删除..但我可能会弄错.
我已经在这个问题上待了一段时间,感觉我已经尝试了从合理到彻头彻尾的愚蠢的一切.将我的CMS网址列入白名单,将所有内容列入白名单,禁用$sce,强制html通过$sce.trustAsHtml()并且好……到目前为止,没有运气.由于该网站是CMS驱动的,我不幸的是不能创造一个掠夺者/小提琴,但我希望一个善良的灵魂无论如何都会尝试帮助.
更新:忘记提到我也尝试过ng-src,效果相同.
更新II:如果我使用HTTPS,则src属性仍然存在并显示图像.这是可以接受的,因为它将在生产中的HTTPS上运行,但我仍然想知道为什么禁用$sce不起作用.
浏览器看到的HTML(slide.body的内容)
<div class="row"> <div class="col-md-6 visible-md visible-lg"> <img alt="none" class="img-responsive"> </div> <div class="col-xs-12 col-md-6"> <div class="itx-article-header"> <h1>Sulvat Quis 1</h1> <h2>– Nullam dictum ac enim</h2> </div> <p>Proin quis justo vel felis varius soDales sit amet ut diam.</p> </div> </div>
JADE(HTML)
.my-carousel(ng-controller='CarouselCtrl') carousel(interval='myInterval') slide(ng-repeat='slide in slides',active='slide.active') .my-carousel-item(ng-bind-html='slide.body')
角度控制器
.controller('CarouselCtrl',['$sce','Article','$scope',function($sce,Article,$scope) { $scope.myInterval = -1; $scope.slides = Article.query( {category: 'carousel'},function(data){ for (var i = 0; i < data.length; i++) { $scope.slides[i].body = $sce.trustAsHtml(data[i].body); } },function() { // Fail }); }])
示例JSON响应(幻灯片)
抱歉宽盒子,没有设法格式化它.
{ "cmarId": 16,"corp": { "corpId": 2,"guiSelected": false },"createdAt": "Sep 27,2013","articleTag": "slide-1","headline": "Slide 1","highlighted": false,"body": " ","articlePriority": 0,"category": { "cmcaId": 9,"corp": { "corpId": 2,"guiSelected": false },"name": "carousel","visibleInMenu": false },"published": true
}