Javascript Angular.js中的部分HTML字符串转义
我已经读过angular默认情况下转义所有内容的方法,因此我通过过滤器(因为Javascript Angular.js中的部分HTML字符串转义,javascript,angularjs,security,angular-translate,Javascript,Angularjs,Security,Angular Translate,我已经读过angular默认情况下转义所有内容的方法,因此我通过过滤器(因为$sce未在服务中工作)使用$sce.trustAsHtml()白名单数据,如下所示: <sup class="ng-binding" ng-bind-html="row|logEntry"></sup> 例如,我可以翻译有关userX更改文章的内容,但如果用户名包含alert('evilname') $translate本身是不相关的,它可以是任何HTML字符串,我想用常规JS替换其中的某些部
$sce
未在服务中工作)使用$sce.trustAsHtml()
白名单数据,如下所示:
<sup class="ng-binding" ng-bind-html="row|logEntry"></sup>
例如,我可以翻译有关userX更改文章的内容,但如果用户名包含alert('evilname')
$translate
本身是不相关的,它可以是任何HTML字符串,我想用常规JS替换其中的某些部分。replace()
将内容保留为“文本”
所以我的问题是-如何转义HTML的某些部分?我是否必须在视图内部将其分割成多个部分?还是我必须求助于海关逃跑(
)? 这类事情有没有更好的做法?让我们从重构
日志条目开始,以分离插值图
var translationId = 'Log.' + msg.context.entity_type) + '.' + msg.context.action;
var interpolateParams = {
'object_name': msg.context.object_name,
'user': msg.context.user_name
};
var translated = $translate(translationId, interpolateParams);
return $sce.trustAsHtml(translated);
您希望从插值图
中转义所有HTML,但将所有HTML保留在翻译模板中。使用此代码复制对象,迭代其值并替换为转义HTML
var safeParams = angular.copy(interpolateParams);
angular.forEach(safeParams, function(value, key, obj) {
obj[key] = encodeEntities(value)
// if you want safe/sanitized HTML, use this instead
// obj[key] = $sanitize(value);
});
var translated = $translate(translationId, safeParams);
最后,angular的encodeEntities
功能没有公开,因此我们不得不从
有关应用程序添加中的更多净化价值策略,请参阅文档
$translateProvider.useSanitizeValueStrategy('escapeParameters');
因此,您的代码如下所示:
myApp.config(function ($translateProvider) {
//...whatever
$translateProvider.useSanitizeValueStrategy('escapeParameters');
});
$translateProvider.useSanitizeValueStrategy('escapeParameters');
$translateProvider.useSanitizeValueStrategy('escapeParameters');
myApp.config(function ($translateProvider) {
//...whatever
$translateProvider.useSanitizeValueStrategy('escapeParameters');
});