2017-12-08 19 views
1

XSSのバグを体系的にブロックするために、Angularはデフォルトですべての値を信頼できないものとして扱います。属性、属性、スタイル、クラスバインド、または補間を使用して、テンプレートから値をDOMに挿入すると、Angularは信頼できない値をサニタイズしエスケープします。ユーザの入力をAngularで扱うとき、セキュリティ(XSS)についてどの程度心配していますか?

角型テンプレートは、実行可能コードと同じです。テンプレート内のHTML、属性、およびバインド式(ただし、値はバインドされていません)は安全であると信頼されています。これは、攻撃者がテンプレートのソースコードを作成することから制御できる値をアプリケーションが防止しなければならないことを意味します。ユーザー入力とテンプレートを連結してテンプレートソースコードを生成しないでください。これらの脆弱性を回避するには、テンプレートインジェクションと呼ばれるオフラインテンプレートコンパイラを使用します。

これはAngularがXSSについて述べたものです。しかし、ちょっと、最初の段落が2番目の段落と矛盾しているようです(私が間違っていれば私を修正してください)。だから私の質問です:私は私のユーザー入力を逃れると消毒する必要がありますか?

+0

私は答えとして投稿しませんが、これは私の意見です:生産時に '.map'ファイルなしでコードを小さくしてuglifiedした場合、フィールドのいくつかの妥当性検査、例えば' max'値、 'strings'または' numbers'が(ケースに応じて)許され、そのデータをバックエンドサービスにJSON文字列として送るだけで、あなたは「あなたの部分を完了しました」。残りの部分を処理するのは、バックエンドのフレームワークと開発者の責任です。誰かがXSSを防ぐ方法を追加したい場合は、どうかしてください。 – DrNio

答えて

1

コードは信頼されていますが、値は信頼されていません。通常の角度データバインディングを使用して値を挿入すると、適切な値としてエンコードされます。これは、Angularが値とコードを認識できるためです。

例えば、これは、追加のエスケープは必要ありません:

<h1>Hello {{yourName}}!</h1> 

をしかし、あなたは文字列の連結を使用してテンプレートを作成しようとした場合。例えば:

'<h1>Hello ' + yourName + '!</h1>' 

またはPHPのようなサーバー側の言語を持つ:

<h1>Hello <?= $_GET['name'] ?> !</h1> 

そして角度は、リテラルHTMLと挿入された値との間の違いを見分けることができません。このように挿入されたデータは、Angular構文と同様にJavascriptを注入できるようになりました。

値を挿入するための通常の角度機構に固執する限り、追加のエンコーディングは必要ありません。この脆弱性は、角度をバイパスして値を別の方法で直接挿入することによって発生します。

+0

'[innerHTML] =" getText() "' getText: 'return 'test'' これをエスケープする必要はありますか? –

+0

@MartijnvandenBergh挿入する値が実際にはHTMLでプレーンテキストでない場合は、[[innerHTML] 'のみを使用してください。次に、生成された値に応じて、挿入された値をエスケープするためにhtmlを生成したコードの責任があります。したがって、連結内で追加された値はすべてエスケープする必要があります。 – fgb

関連する問題