Djangoは、3つの主要な種類のWebアプリ攻撃(SQLインジェクション、XSS、CSRF)に対して組み込みの保護を提供します)を知っています。これは本当に素晴らしいことです。
それでも、私はいくつかのDjango=開発者と話をしました、そして彼らは本質的に、もしあったとしても、これらに過度に依存しないように私に言っています。
すべてのデータを「安全でない」ものとして扱い、適切に処理するように言われました。
私はこれについてみんなに質問する2つの質問があります:
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_safe
、safe
など)。このメカニズムは良いものですが、それだけでは十分ではありません。XSSを停止するには多くの方法が必要ですが、依然としていくつかの問題に注意する必要があります。
特に、Djangoの自動エスケープは、ほとんどのHTMLコンテキストに対して十分にデータをエスケープしますが、特別な場合には、手動で追加のエスケープを行う必要があります。
動的データが挿入されるすべての属性を引用符で囲んでください。良い:<img alt="{{foo}}" ...>
。悪い例:<img alt={{foo}} ...>
。 Djangoの自動エスケープは、引用符で囲まれていない属性値に対しては十分ではありません。
CSS(style
タグと属性)またはJavascript(script
ブロック、イベントハンドラー、およびonclick
/etc。属性)に挿入されたデータの場合、次を使用して手動でデータをエスケープする必要がありますCSSまたはJavaScriptに適したエスケープルール。
URLが必要な属性(a href
、img 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チートシートを参照してください。
その他のものあなたが言及しなかったいくつかの他のものがあります:
可能であれば、サイト全体でSSLを使用することをお勧めします。その場合は、HSTSを有効にし、すべてのCookieに「セキュア」フラグを設定します。そうすることのトレードオフの詳細については、このサイトを検索してください。もしそうしたいなら、Django これをサポートする であり、このサイトにもいくつかのリソースがあります: Djangoを作成しようとしています-ベースのサイトはHTTPSのみを使用します。安全かどうかは不明です
Djangoのクリックジャッキング保護 を有効にすることをお勧めします。
Djangoのドキュメントにあるその他のアドバイス に従ってください。
特にSSLを使用している場合は、いくつかのユーティリティについて Django-secure をチェックアウトして、基本的なセキュリティ手順を忘れないようにすることができます。
この良いものはすべて万能薬ではありません。ここからセキュリティを無視できるという意味ではありません。最も一般的な間違いのいくつかを回避するのに役立ちますが、安全なWebアプリケーションを構築するための最終的な責任は依然として負います。
詳細については、を参照してください Djangoのセキュリティに関するドキュメント を含む セキュリティに関する章 を= Django本。