我有一个 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 a
translate-value-amount-astrusted=` 之类的东西。但是找不到任何暗示能够按价值设置清理策略或省略它的东西。
这通常是如何在 angularjs 和 angular-translate 中实现的?