5

デフォルトですべてをエスケープするAngularの方法について読んだので、次のようにフィルターを介して$sceデータをホワイトリストに登録します(サービスで機能していないため):$sce.trustAsHtml()$sce

<sup class="ng-binding" ng-bind-html="row|logEntry"></sup>

しかし問題は、私が HTML の一部を信頼していないことです。

詳細に飛び込む - HTML を含む翻訳がありますが、置換可能なトークン/変数が含まれています。したがって、翻訳は HTMLをサポートしていますが、提供されたトークンに HTML を含めたくありません。

私のフィルターlogEntryは内部的に次のようになります。

var translated = $translate('Log.' + msg.context.entity_type) + '.' + msg.context.action, {
        'object_name': msg.context.object_name,
        'user': msg.context.user_name
});
return $sce.trustAsHtml(translated);

たとえば、記事を変更する userX について翻訳することはできますが、ユーザー名に含まれる場合、結果テキストで alert() をトリガーしたくありません。<script>alert('evilname')</script>

$translate.replace()それ自体は関係ありません。一部の部分を通常のJSに置き換えて、コンテンツを「テキストとして」保持したいHTML文字列にすることができます。

だから私の質問は -どうすれば HTML の一部をエスケープできますか? ビュー内の部分にスライスする必要がありますか? または、カスタム エスケープに頼る必要がありますか ( HTML タグを HTML エンティティとしてエスケープする最速の方法は? )。そのようなことのための好ましい慣行はありますか?

4

2 に答える 2