Skip to content

Latest commit

 

History

History
42 lines (33 loc) · 6.77 KB

C04.エンコーディングおよびエスケープ.md

File metadata and controls

42 lines (33 loc) · 6.77 KB

C04:エンコーディングおよびエスケープ

説明

エンコーディングとエスケープは、インジェクション攻撃を止めるための防御手法です。エンコーディング(一般に「出力エンコーディング」と呼ばれる)は、特殊文字を、ターゲットインタープリタにおいて危険な解釈がされない形式に変換することを含む。たとえば、HTMLページに書き込む際に「<」を&lt;変換することが挙げられる。 エスケープは、誤って解釈されないように文字/文字列の前に特殊文字を追加する方法で、例えば、 "" "(二重引用符)文字の前に" \ "を追加し、文字列として閉じるものではなく、文字列として解釈されるようにします。 出力エンコーディングは、コンテンツがターゲットインタープリタに渡される直前に適用するのが最善です。この防御がリクエスト処理においてあまりにも早期に実施されてしまう場合、エンコードまたはエスケープがプログラムの他の部分におけるコンテンツの使用を妨げる可能性があります。たとえば、データベースに格納する前にコンテンツをエスケープした後に、UIが自動的にエスケープすると、コンテンツは2回エスケープされることになり正しく表示されなくなります。

コンテキスト出力エンコーディング

コンテキスト出力エンコーディングは、XSSを防止するのに必要なセキュリティプログラミングの重要な手法です。この防御は、信頼できないデータがHTMLに動的に追加される前の最終時点の出力で実行されます。エンコーディングの種類は、データが表示または格納されているドキュメントの場所(またはコンテキスト)によって異なります。セキュアなユーザインタフェイスを構築するために使用される円コーディング手法として、HTMLエンティティエンコーディング、HTML属性エンコーディング、JavaScriptエンコーディング、およびURLエンコーディング等があります。

Javaエンコーディングの例

コンテキスト出力エンコーディングを提供するOWASP Java Encoderの例として、OWASP Java Encoder Project Examplesをご確認ください。

.NETエンコーディングの例

.NET 4.5以降、Anti-Cross Site Scriptingライブラリはフレームワークの一部ですが、デフォルトでは有効になっていません。 このライブラリのAntiXssEncoderをweb.conf設定を使用してアプリケーション全体のデフォルトエンコーダとして使用するように指定することができます。デフォルトエンコーダとして指定した上で、出力をコンテキストでエンコードすることが重要になります。つまり、ドキュメント内のデータの適切な場所にAntiXSSEncoderライブラリの適切な機能を使用する必要があります。

PHPエンコーディングの例

Zend Framework 2 Zend Framework 2(ZF2)では、Zend \ Escaperを使用して出力をエンコードすることができます。 コンテキストでエンコーディングする例は、zend-escaperによるコンテキスト固有のエスケープを参照してください。

他のエンコーディング方法によるインジェクションの防御

エンコーディング/エスケープにより、他のインジェクションも防御することができます。例えば、オペレーティングシステムコマンドに入力を追加するときに、特定の特殊なメタキャラクタを無効にすることができます。 これは、「OSコマンドエスケープ」、「シェルエスケープ」などと呼ばれます。 この防御は、「コマンドインジェクション」の脆弱性を阻止するために使用できます。 さまざまな形式のXMLおよびXMLパスインジェクションを防止するXML属性のエスケープや、さまざまな形式のLDAPインジェクションを防止するために使用できるLDAP識別名のエスケープなど、インジェクションを防止するために使用できるエスケープ形式もあります。

文字エンコーディングおよび正規化

Unicode エンコーディングは、複数バイトの文字を格納する方法です。 入力データが許可されているところでは、悪意のあるコードを隠し、さまざまな攻撃を許可ためにUnicodeを使用してデータを入力することができます。RFC 2279は、テキストをエンコーディングする多くの方法を参照しています。 正規化は、システムがデータを単純または標準形式に変換する方法です。Webアプリケーションは、文字の正規化を使用して、格納または表示するときにすべてのコンテンツが同じ文字タイプであることを保証します。 正規化に関連する攻撃に対してセキュアであることは、不正な形式のUnicodeやその他の不正な文字表現が入力された場合に、アプリケーションがセキュアであることを意味します。

脆弱性の防止

参考情報

ツール