web-dev-qa-db-ja.com

AngularJSサニタイズ関数とサーバー側の出力エンコーディング

私は主にWebアプリケーションを監査し、企業にセキュリティ対策と推奨事項を提供しています。現在、XSS保護に対するAngularJSのサニタイズ機能に関して、正しい推奨を与えることに問題があります。私はそれが大丈夫だと言ったり、サーバー側で出力エンコーディングを強制することを勧めたりすることに疑問を持っています。

誰かがこの問題で私を助けたり、違いを明確にしたりできますか?

2
sgres

tl; dr:エンコードは、データがコンテキストで使用されているときに行う必要があります-信頼できないデータからコードがHTML、JavaScriptなどを構成している場合-サーバーとクライアントのどちらで作成する場合でも同じです。その時点で、どの部分がデータであり、どのエンコーディングコンテキストであるかがわかります。 Angular)のバインディング(ng-bind)をコンテキスト固有のエンコーディングに活用する必要があります。AngularJSSanitize関数は、信頼できないHTMLの塊を「サニタイズ」する必要がある場合に役立ちます。

詳細:「サニタイズ」という用語を使用するときは注意が必要です。これは、ライブラリによって使用方法が異なるためです。つまり、検証、正規化、単純化を意味します。エンコーディング、解析、エンコーディング。

AngularJS Sanitize 関数は、HTMLをトークンに解析して入力を「サニタイズ」します。 (ホワイトリストからの)すべての安全なトークンは、適切にエンコードされた値にシリアル化されます。このように、それは OWASP HTML Sanitizer Project および古いOWASP Antisamyプロジェクトと同様に動作します。

ライブラリの使用の詳細については、 https://odetocode.com/blogs/scott/archive/2014/09/10/a-journey-with-trusted-html-in-angularjs.aspx を参照してください。

これは、HTML、JavaScript、またはURLをその一部から構成する余裕がない場合に、信頼できない入力をエンコードするための優れた方法です。しかしながら:

  • タグの解析と削除はバイパスされる傾向があります-現在の問題は知りません
  • HTMLを変更して、認識されないタグを削除します。このタグは壊れやすい場合があります
  • 基礎となるコンテンツがエンコードされているかどうかを想定する必要があります
  • タグのサポートはホワイトリストに限定されますが、$ sanitizeサービスを装飾してリストを変更できます

だからあなたができるところ:

  • データがコンテキストで使用されているときにエンコードします(たとえば、バインディングを使用する)。
  • 作成していない場合は、サニタイズ機能を活用する
  • 多層防御としてCSP(コンテンツセキュリティポリシー)を活用する
1
Egret