web-dev-qa-db-ja.com

Node.js /サーバーサイドjavascriptでのXSSの防止

Node.jsアプリでXSS攻撃を防ぐ方法はありますか? href、onclick属性などのjavascriptの削除を処理するライブラリ。 POSTされたデータから?

私はそのすべてのために正規表現を書く必要はありません:)

助言がありますか?

65
Techwraith

クライアント側のHTMLのサニタイズ/リライト に対する回答の1つは、Google CajaからJSのホワイトリストベースのHTMLサニタイザーを借用することを提案します。ブラウザのDOMに依存しないHTML SAXパーサー。

更新:また、Cajaサニタイザーには完全かつ専門的なセキュリティレビューが与えられていることを忘れないでください。正規表現はタイプミスが非常に簡単であることが知られています。セキュリティを損なう方法。

2017-09-24の更新:現在、 DOMPurify もあります。まだ使用していませんが、探しているすべてのポイントを満たすか超えているようです:

  • 可能な限り、ランタイム環境によって提供される機能に依存します。 (パフォーマンスと、十分にテストされ成熟した実装に可能な限り依存することでセキュリティを最大化するために重要です。)

    • Node.JSの場合、ブラウザのDOMまたは jsdom に依存します。
  • Javascriptの削除を保証しながら、できる限りストリップしないように設計されたデフォルト構成。

    • HTML、MathML、およびSVGをサポート
    • IE8およびIE9では、Microsoft独自の構成不可能なtoStaticHTMLにフォールバックします。
  • 高度な構成が可能で、WYSIWYGやMarkdownコメントフィールドなど、任意のHTMLを含むことができる入力に制限を適用するのに適しています。 (実際、ここの山の一番上です)

    • 通常のタグ/属性ホワイトリスト/ブラックリストおよびURL正規表現ホワイトリストをサポート
    • 特定の一般的なタイプのHTMLテンプレートメタキャラクターをさらにサニタイズする特別なオプションがあります。
  • 彼らは互換性と信頼性に真剣です

    • Node.JSの3つの異なるメジャーバージョンだけでなく、16種類のブラウザーで実行される自動テスト。
    • 開発者とCIホストがすべて同じページにいることを確認するために、ロックファイルが公開されます。
24
ssokolow

Caja HTML Sanitizerをバンドルするモジュールを作成しました

npm install sanitizer

http://github.com/theSmaw/Caja-HTML-Sanitizer

https://www.npmjs.com/package/sanitizer

フィードバックをお願いします。

54
theSmaw

通常のテクニックはすべてnode.js出力にも適用されます。つまり、次のことを意味します。

  • ブラックリストは機能しません。
  • HTML出力を保護するために入力をフィルタリングすることは想定されていません。動作しないか、データを不必要に不正な形式にすることで動作します。
  • HTML出力でテキストをHTMLエスケープすることになっています。

Node.jsにこのためのビルトインが付属しているかどうかはわかりませんが、そのようなものが仕事をするはずです:

function htmlEscape(text) {
   return text.replace(/&/g, '&').
     replace(/</g, '&lt;').  // it's not neccessary to escape >
     replace(/"/g, '&quot;').
     replace(/'/g, '&#039;');
}
16
Kornel

私は最近、 chriso によって node-validator を発見しました。

get('/', function (req, res) {

  //Sanitize user input
  req.sanitize('textarea').xss(); // No longer supported
  req.sanitize('foo').toBoolean();

});

XSS機能の廃止

XSS関数は、このライブラリでは使用できなくなりました。

https://github.com/chriso/validator.js#deprecations

15
Baggz

[〜#〜] esapi [〜#〜] もご覧ください。 ライブラリのjavascriptバージョン があります。かなり頑丈です。

5
jeandenis

validatorモジュールの新しいバージョンでは、次のスクリプトを使用してXSS攻撃を防ぐことができます。

  var validator = require('validator');

  var escaped_string = validator.escape(someString);
3
Paramore

Npmモジュールを試してくださいstrip-js。次のアクションを実行します。

  • HTMLをサニタイズします
  • スクリプトタグを削除します
  • JavaScriptコードを含む「onclick」、「onerror」などの属性を削除します
  • JavaScriptコードを含む「href」属性を削除します

https://www.npmjs.com/package/strip-js

1
Shivanshu Goyal

ライブラリnpm "insane"を試してください。 https://github.com/bevacqua/insane

私は本番で試してみましたが、うまくいきます。サイズは非常に小さい(gzip圧縮で約3 kb)。

  • HTMLのサニタイズ
  • Jsを評価するすべての属性またはタグを削除します
  • サニタイズしたくない属性またはタグを許可できます

ドキュメントは非常に読みやすく、理解しやすいです。 https://github.com/bevacqua/insane

0
Renan Bronchart