デフォルトですべてをエスケープする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 エンティティとしてエスケープする最速の方法は? )。そのようなことのための好ましい慣行はありますか?