web-dev-qa-db-ja.com

angularjs +クロスサイトスクリプティング防止

AngularjsはXSS攻撃を処理します。 ng-bindが面倒を見ると読みました。しかし、それをテストするためのサンプルを実行しようとすると、ng-modelを使用して入力タイプにhtmlタグを挿入できます... Htmlタグをエスケープしませんでした。

Ng-modelにバインドする入力要素がページにたくさんあります。htmlタグを入力した場合、angularはhtml/scripタグを無視します。

例.

<input id="name" ng-model="name"></input>

として入力した場合

'Hello, <b>World</b>!'

$ scope.nameには、入力したものと同じものが含まれていますが、タグは除外されていません。すなわち

  var val = $scope.name;
  console.log(val); 

同じように印刷する

'Hello, <b>World</b>!'

Angularjsでこれを解決する方法を教えてください。

感謝

20
dav10

こちらをご覧ください: http://docs.angularjs.org/api/ngSanitize/service/$sanitize

ng-bindを使用してエスケープしたい場合、そのような解釈なしにタグをレンダリングします:

Hello <b>World</b> Helloとは異なりWorld

わかりますか ? ng-bindはHTMLタグを考慮しないため安全です。

HTMLタグを解釈したいが、安全にng-bind-htmlを使用してください!

たとえば、この文字列を表示する場合:

'Hello <b>World</b><input type="text" />'

結果は次のようになります。こんにちは 世界 ただし、AngularJSコンパイラは$ sanitizeサービスを使用してHTML要素のホワイトリストをチェックし、入力は許可されないため、入力はありません。

たぶん、ng-bind-htmlがあなたが探しているものです。

ユーザーが入力にhtmlタグを配置できないことを確認したい場合は、入力でディレクティブng-patternを使用するだけです!

http://docs.angularjs.org/api/ng/directive/input

入力で許可される文字の正規表現が必要です!

それが役に立てば幸い !

27
Thomas Pons

AngularJSにデフォルトのホワイトリスト入力検証があるとは思わないが、これはテストで行うことです。そのため、ユーザーは好きなものをほとんど入力できます。これは驚くことではありません-ホワイトリストは非常にドメイン固有であり、Angularは幅広いドメイン向けに設計されたフレームワークです。

XSSに対する主な防御策は、信頼できないデータをすべて適切にエンコードすることです( https://www.owasp.org/index.php/Top_10_2013-A3-Cross-Site_Scripting_(XSS) を参照)。これは、Angularはデフォルトで行います。

要するに、AngularJSはデフォルトでXSSから保護されることを目的としており、特別なアクションは必要ありません。通常の{{scopevariable}}表記を使用してビューに入力した内容を出力することにより、いくつかの基本的なシナリオを検証できます。

AngularJS XSS脆弱性の詳細な分析を見つけました: https://code.google.com/p/mustache-security/wiki/AngularJS 。コメントの最後に、Googleドキュメントへのリンクがあり、angularチームからのさらなる議論と回答があります。

10
Steve Campbell