0

我有一个 angular-translate指令,它接受混合的参数。有些是用户生成的,有些是必须编译的 HTML(使用translate-compile)。

请参阅此 plunker以获得一个工作的、大大简化的示例。

translate-sanitize-strategy设置为“null”时,不会对任何内容进行清理:

 <p translate
 translate-value-amount="<currency data-amount='balance'></currency>"
 translate-value-beneficiary="{{ beneficiary }}"
 translate-sanitize-strategy="null"
 translate-compile="true">PAY_TO</p>

这使得您必须向 john-doe 支付 13.37 欧元

但是当用户将昵称设置为 时john-<span onmouseover="this.textContent=\'h@ck3d\'">doe</span>,它将运行该昵称并在鼠标悬停后呈现,您必须向 john-h@ck3d 支付 13.37 欧元。显然是 XSS 的一个例子。

当我将策略设置为 时sanitizeParameters,这也是我们的全局设置,受益人得到了适当的消毒。但是amount,我信任(此时)并且需要编译的 也是如此!

<p translate
 translate-value-amount="<currency data-amount='balance'></currency>"
 translate-value-beneficiary="{{ beneficiary }}"
 translate-sanitize-strategy="'sanitizeParameters'"
 translate-compile="true">PAY_TO</p>

这使得You must pay to john-doe。因此,该beneficiary值已正确清理,但值量也是如此,我需要保持未经清理以便 Angular 编译它。

我已经搜索了一个解决方案,我使用过滤器手动清理受益人的价值:

{{ beneficiary | sanitize }}

但这似乎需要我编写一个使用ngSanitize服务的过滤器;不是那么难,但仍然有一些工作、测试和代码,我希望本机可用。某处。

我已经通读了角度翻译代码,以查找是否存在(隐藏)标志或命名约定等,允许按值设置清理,但找不到。诸如translate-sanitize-attributes="['foo', 'bar']" or even atranslate-value-amount-astrusted=` 之类的东西。但是找不到任何暗示能够按价值设置清理策略或省略它的东西。

这通常是如何在 angularjs 和 angular-translate 中实现的?

4

1 回答 1

2

怎么样:

<p translate
 translate-value-amount="<currency data-amount='balance'></currency>"
 translate-value-beneficiary="<span ng-bind='beneficiary'></span>"
 translate-sanitize-strategy="null"
 translate-compile="true">PAY_TO</p>
于 2017-11-23T10:22:55.720 回答