web-dev-qa-db-ja.com

PHP XSSを防ぐための関数

XSS攻撃を防ぐための機能を備えた実証済みのライブラリはありますか?多くの人々は、htmlspecialcharsではXSS攻撃を防ぐのに十分ではないことに気づいていません。独自のエスケープを必要とするさまざまなコンテキストがあります(htmlプロパティ、Javascriptなど)。これらすべてのコンテキストでエスケープするための関数を提供する実証済みのライブラリはありますか?

12
Casebash

はい、そのようなライブラリがいくつかあります。ライブラリの選択は、使用している言語/ Webプログラミングフレームワークによって異なります。

まず、XSSについて読むことから始める必要があります。次のドキュメントをお勧めします。

次に、これに慣れたら、十分にテストされたエスケープ関数を提供するいくつかのライブラリを紹介します。

ただし、これらの関数を適切に使用するには開発者の知識が必要であり、潜在的にエラーが発生しやすいことを警告します。動的データがHTML、CSS、またはJavaScriptコンテンツに挿入される可能性のあるさまざまな解析コンテキストが多数あります。各解析コンテキストには、異なるエスケープ関数(または一連のエスケープ関数)を適用する必要がある場合があります。開発者は、動的データをコンテンツに挿入するたびに、適切なエスケープ関数を適用する必要があります。これには、XSSリスクの知識とそれらからの防御方法が必要です。

このアプローチ(使用されるすべての場所で手動でデータをエスケープする)でもエラーが発生しやすくなります。エスケープ関数を適用することを忘れがちです。ドキュメントに動的データを含める場所が100ある場合、99の場所で覚えやすく、そのうちの1つでエスケープするのを忘れてしまいます。私たちは人間であり、そのような間違いは簡単に起こります。エスケープ関数のライブラリは、開発者がこの問題を回避するのに役立ちません。

より良い解決策は、開発者がこの問題を回避するのに役立つWebプログラミングフレームワークを使用することです。最先端の技術は、状況に応じた自動サニタイズです。これは、HTMLテンプレートシステムを提供するフレームワークで特にうまく機能します。このようなシステムでは、テンプレートエンジンは、テンプレートに挿入されるすべての非静的データを自動的にエスケープする責任があります。テンプレートエンジンは、データが動的に挿入されている解析コンテキストを識別できるため、適切なエスケープ関数を自動的に選択して適用できます。

状況依存の自動サニタイズの主な問題は、現在それをサポートしているWebプログラミングフレームワークが少ないことです。状況依存自動サニタイズをサポートするいくつかのWebフレームワーク: Google Cte​​mplate (クロージャーテンプレート)、GWT、Google Clearsilver。

このトピックの詳細については、次のリサーチペーパーを強くお勧めします。

9
D.W.

コンテキスト認識エスケープを使用する代わりに(おそらく、このようにしようとするさまざまなPHPライブラリが存在します))ドキュメントツリーを作成し、ホワイトリストに登録された要素、属性などのみを選択.

このアプローチを採用するプロジェクトは HTMLPurifier および Wibble です。たとえば、Wibble:

  • すべてのHTML入力をHTMLセーフUTF-8に変換します
  • HTMLをDOMDocumentオブジェクトにロードします
  • 1つ以上のフィルター(DOMマニピュレーター)をHTML DOMに適用します
  • フィルタリングされたHTMLをDOMから抽出し、HTML Tidy(ext/tidy)を適用します
  • 最終的なHTMLをユーザーが選択した文字エンコーディングに変換します(UTF-8でない場合)。

ほぼ有効なHTML構文からの悪意のあるコードがこれを通過する場所はありません。 HTMLに問題がある場合、それはおそらく不完全なホワイトリスト(またはいくつかの奇妙なhtml /整頓された攻撃ベクトルですが、私はそれを疑っています)です。

更新:本格的なHTMLパーサーが必要ない場合、別のオプションは、デフォルトでセキュアなテンプレートエンジンを使用することです。唯一のPHP私が知っているコンテキスト認識エスケープを使用するプロジェクトは Nette Latte テンプレートエンジンですが、それを使用しませんでした。他のエンジンでもエスケープ手法が異なりますが、自分でコンテキストを指定する必要があります(コンテキストを1回省略した場合、XSS攻撃を受けやすくなります)例は Twig または Smarty です。それらからコードをエスケープして、テンプレートエンジンの外部で使用します。

4

XSSに対する最善のソリューションは、プログラマーにデータがどのように危険であるかを理解させ、データを出力するときにコンテキスト認識エスケープを使用することです。常に。プログラマーに自分のしていることをもっと考えさせ、より堅牢なプログラムを提供します。私はそのアプローチに問題がないと思います:-)

3
chris

次の2つの点に注意してください。

  1. 入力ではなく、出力時に常にエスケープします。
  2. パフォーマンスが心配な場合は、エスケープされた出力をキャッシュできます。

HTML Purifierは優れていますが、それが使用されているコンテキストに影響を受けません。次のコードIS脆弱性:

_<input type="text" name="test" value="<?php echo $hp->purify($_GET['foo']); ?>" />
_

概念実証:/?foo=test%22%20onload%3D%22alert(%27XSS%27)%3B

コンテキスト認識エスケープは通常、テンプレートエンジンを通じてのみ取得します。最も一般的なケース:

  • HTMLを許可する必要がありますか?
    • はい:HTMLPurifierまたはStaurosを使用します。 (詳細は以下をご覧ください。)
    • いいえ: htmlentities()を_ENT_QUOTES_ とともに使用します。文字セットを指定します(例:_'UTF-8'_)。

リクエストごとにHTMLPurifierを介してユーザー指定のデータを実行するパフォーマンスに不安がある場合は、 Stauros XSSライブラリ を使用してください。 (readmeにはまだ実験段階だと書いてありますが、それを回避する方法はまだ見つけていません。)

3