web-dev-qa-db-ja.com

Djangoの組み込みセキュリティで十分ですか?

Djangoは、3つの主要な種類のWebアプリ攻撃(SQLインジェクション、XSS、CSRF)に対して組み込みの保護を提供します)を知っています。これは本当に素晴らしいことです。

それでも、私はいくつかのDjango=開発者と話をしました、そして彼らは本質的に、もしあったとしても、これらに過度に依存しないように私に言っています。

すべてのデータを「安全でない」ものとして扱い、適切に処理するように言われました。

私はこれについてみんなに質問する2つの質問があります:

  1. Djangoの組み込みのセキュリティ機能は信頼できますか?
  2. 私の友人は「それ(安全でないデータ)を適切に処理する」とはどういう意味ですか?安全でないフレーズや文字のエスケープや削除については知っていますが、私が最も恐れているのは、自分でやろうとすると、Djangoの組み込みのものよりも悪い「フィルター」を作成してしまうことです。 Djangoの上に構築し、この点を上書きしないためのガイドはありますか?
51
pleasedesktop

SQLインジェクション。Djangoのオブジェクトリレーショナルマッパー(ORM)レイヤーを使用する場合、基本的にSQLインジェクションから保護されます。

唯一の注意点は、文字列連結を使用してSQLクエリを手動で作成することを避ける必要があることです。たとえば、未加工のSQLクエリ(raw()など)は使用しないでください。同様に、extra()メソッド/修飾子を使用して生のSQLを注入しないでください。しない カスタムSQLを直接実行 ; DjangoのORMレイヤーをバイパスすると、SQLインジェクションに対する保護がバイパスされます。

CSRF。Djangoの組み込みCSRF保護は優れています。必ず 有効にする にして、どこでも使用できるようにしてください。 Djangoは、ローカルまたはグローバルにそれを無効にする方法を提供します。明らかに、それを行わないでください。

GETリクエストに副作用がないことを確認することが重要です。副作用のあるリクエストの場合は、必ずPOSTリクエストを使用してください(これらのGETリクエストは受け入れないでください)。これは標準のWebデザインですが、一部の開発者はそれを台無しにしています; Djangoの組み込みのCSRF防止機能は、これが正しいことを前提としています。

サブドメインがある場合はいくつかの注意事項 があります(たとえば、Webアプリはwww.example.comでホストされており、ユーザー制御コンテンツをホストするサブドメインalice.example.comがあります);その場合、組み込みのCSRF保護では不十分な場合があります。これは、いくつかの理由でトリッキーなケースです。ほとんどのWebアプリケーションは、これらの警告について心配する必要はありません。

XSS。Djangoのテンプレートシステムを使用していて、自動エスケープが有効になっていることを確認している場合は、95%です。 Djangoは、XSSを停止するための自動エスケープメカニズムを提供します。テンプレートに動的に挿入されたデータがまだエスケープされていない場合は、自動的にエスケープします(たとえば、mark_safesafeなど)。このメカニズムは良いものですが、それだけでは十分ではありません。XSSを停止するには多くの方法が必要ですが、依然としていくつかの問題に注意する必要があります。

特に、Djangoの自動エスケープは、ほとんどのHTMLコンテキストに対して十分にデータをエスケープしますが、特別な場合には、手動で追加のエスケープを行う必要があります。

  • 動的データが挿入されるすべての属性を引用符で囲んでください。良い:<img alt="{{foo}}" ...>。悪い例:<img alt={{foo}} ...>。 Djangoの自動エスケープは、引用符で囲まれていない属性値に対しては十分ではありません。

  • CSS(styleタグと属性)またはJavascript(scriptブロック、イベントハンドラー、およびonclick/etc。属性)に挿入されたデータの場合、次を使用して手動でデータをエスケープする必要がありますCSSまたはJavaScriptに適したエスケープルール。

  • URLが必要な属性(a hrefimg srcなど)に挿入されたデータの場合、安全であることを確認するために手動でURLを検証する必要があります。許可されたプロトコルのホワイトリスト(http:https:mailto:ftp:など)に対してプロトコルをチェックする必要がありますが、javascript:は絶対にしないでください。

  • コメント内に挿入されたデータの場合、-sをエスケープするために何か特別なことを行う必要があります。実際には、HTMLコメント内に動的データを挿入しないほうがよいでしょう。これは、微妙な問題を要求するだけの、HTMLのあいまいなコーナーです。 (同様に、ユーザー入力が表示されるのがおかしい属性には動的データを挿入しないでください(例:foo class=...))。

  • ただし、クライアント側のXSS(DOMベースのXSSとも呼ばれる)は個別に回避する必要があります。 Djangoこれは役に立ちません。YOuは XSSの回避に関するAdam Barthのアドバイス を読んで、クライアント側のXSSを回避するのに役立ついくつかのガイドラインを確認できます。

  • mark_safeを使用して、Djangoが一部のデータがすでにエスケープされていて安全であることを手動で伝えた場合、何をしているのかをよく理解でき、本当に安全であることがわかります。簡単に何をしているのかわからない場合は、ここで間違いを犯してください。たとえば、プログラムでHTMLを生成し、それをデータベースに保存して、後でクライアントに送り返すと(明らかにエスケープせずに)、間違いを犯しやすくなります。あなたはあなた自身で、自動エスケープはあなたを助けません。

これらの場合のために何か特別なことをしなければならない理由は、Djangoの自動エスケープ機能が想定されるであるエスケープ関数を使用しているためです。常にすべてのケースに当てはまるわけではありません。場合によっては、自分で何か特別なことをする必要があります。

これらの特別なコンテキストで使用するエスケープルールの詳細については、OWASP XSSチートシートを参照してください。

その他のものあなたが言及しなかったいくつかの他のものがあります:

詳細については、を参照してください Djangoのセキュリティに関するドキュメント を含む セキュリティに関する章 を= Django本。

74
D.W.