在我们的Angular应用程序中,我们有一个链接,在服务器端填充了用户内容 . 因此,我们需要告诉Angular不要解释该链接内容 . 否则,如果用户或攻击者在其中放置Angular绑定表达式(比如说{}),那么Angular会对其进行评估,从而打开一个安全漏洞 - 一种XSS攻击 .
ng-non-bindable大多数都这样做 . 但是,我们还希望链接本身可以被Angular操纵 .
<a href="" class="side-bar-element" ng-class="{ 'side-bar-element-selected': isSiteSelected(@site.value.ID) }">@site.value.Name</a>
@ site.value.Name是插入内容的服务器端代码 .
如果我们将ng-non-bindable放在a元素上,那么ng-class将不起作用 . 我能看到的唯一解决方案是在其中插入另一个span / div并将ng-non-bindable应用于:
<a href="" class="side-bar-element" ng-class="{ 'side-bar-element-selected': isSiteSelected(@site.value.ID) }"><span ng-non-bindable>@site.value.Name</span></a>
这看起来很笨拙,不得不修改HTML结构只是为了阻止Angular干扰服务器端数据 .
有没有更清洁的解决方案?
理想情况下,我希望ng-non-bindable(或变体)表示“不绑定内容,但将此元素视为正常” .
1 回答
使用
$delegate
服务降低ng-non-bindable
指令优先级:或者只需通过
<script type="text/ng-template">
分隔用户内容:对
a
元素使用ng-include
指令,并使用带有ng-non-bindable
指令的span
元素将文本与元素分离 .References
Angular: Selectively compile templates
AngularJS standard directive priority list
Dart Docs: NgNonBindableDirective class
AngularJS Docs: search-data.json
AngularJS API: $compile - priority
Decorate Core Directives in Angular