Djangoのセキュリティを徹底検証|リスクを理解して作るWebアプリ

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年2月)

✔このような方へ向けて書かれた記事となります

「Djangoで開発したアプリのセキュリティってどんなものなのだろうか?」

「そもそもWebアプリでセキュリティ対策って必要なのかな?」

「Djangoのセキュリティ対策を向上させる方法を具体的に知りたい」

✔当記事を通じてお伝えすること

  • Webサイト・アプリのセキュリティ対策について
  • Djangoに備わっているセキュリティ対策とは?
  • DjangoのWebアプリをより甲セキュリティするための具体策

当記事では、Djangoに備わっているセキュリティ対策についてはもちろん、そもそもWebアプリにはどのようなリスクが潜んでいるのかまで理解いただけます。

ぜひ最後までご覧ください。

created by Rinker
¥3,080 (2024/04/18 14:59:59時点 楽天市場調べ-詳細)

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Webアプリの構築で気を付けるべきポイント

情報処理推進機構(IPA)が喚起を促すWebサイト・アプリのセキュリティ対策を参考にしつつ、アプリ構築にあたっての注意点をカテゴリー別に見ていきます。

Djangoのセキュリティを判断する基準として、それぞれの概要だけでも理解しておきましょう。

  • Webサーバー
  • DNS
  • ネットワーク

(参考:安全なウェブサイトの作り方|情報処理推進機構(IPA))

それぞれについて簡単に解説していきますが、詳しくは別記事でご紹介していきます。

Webサーバー

Webサーバーでは、以下のようなことに気を付けましょう

  • ブルートフォース攻撃
  • クロスサイトスクリプティング
  • SQLインジェクション

Webサーバーは、ユーザーとのやり取りを担っているため、外部との接触が多くなります。

設定を間違えると、悪意のあるユーザーにより、情報を盗まれたり、サイトを破壊されたりしてしまいます。

DNS

DNSについては、以下のようなことに気を付けるべきとされています。

  • DDoS攻撃
  • DNSキャッシュポイズニング

DNSは、打ち込んだURLを元に、ユーザーを適切なサイトへ連れていく役割を担っています。

不正な書き換えにより、悪意あるサイトへ促されてしまう可能性があるのです。

ネットワーク

ネットワークについて、以下のようなことが注意事項となります。

  • HTTPヘッダインジェクション
  • CSRF

ネットワーク通信の際、データに不正な値を混ぜることで、情報漏洩を促したり、サーバー内に侵入しやすくなるのです。

不正な値に対しての対策が必要となります。

Djangoによる各リスクへの対策

Djangoでは、一定のリスクに対して、対策が施されています。

一から開発をするのではなく、フレームワークを活用するメリットのひとつといえるでしょう。

以下でそれぞれの対策を見ていきます。

  • ブルートフォース攻撃
  • クロスサイトスクリプティング
  • SQLインジェクション
  • DDoS攻撃
  • DNSキャッシュポイズニング
  • HTTPヘッダインジェクション
  • CSRF

それぞれの攻撃がどのようなものかを見ながら、Djangoに備わっているものやできることを解説していきます。

ブルートフォース攻撃

ブルートフォース攻撃とは、手当たりしだいパスワードを打ち込み、サーバ内に侵入したり、暗号を解読する方法です。

プログラムを使って自動化することで、短いパスワードであれば短時間で解除できてしまう可能性があります。

一般的な対策で、Djangoに備わっているかどうかは以下の表にてご確認ください。

対策Djangoでできること
強固なパスワードを設定するAUTH_PASSWORD_VALIDATORS変数で強度を設定する
2段階認証にする2段階認証パスワード用のアプリを作成する
パスワードの入力回数に制限をつける外部ライブラリ(django-axesなど)を導入する

ブルートフォース対策には、パスワードを強固なものにすることで、危険は少なくなるでしょう。

(2段階認証アプリについては、別記事でご紹介予定)

またパスワードの漏洩については、実際の値を保存するのではなく、ハッシュ値で保存しているため、リスクは小さいといえるでしょう。

クロスサイトスクリプティング

クロスサイトスクリプティング(XSS)は、悪意のあるスクリプトをサイトに埋め込み、一般のユーザーのセッション情報を盗んだり、悪意のあるページに遷移させたりする攻撃です。

ブログや掲示板、アンケートサイトなどがその対象といえるでしょう。

Djangoでは、エスケープ処理という、危険な文字を文字列に変更することを通じて、その対策としています。

Djangoが推奨する書き方で、テンプレートを記載していれば、リスクはかなり小さいと言って良いです。

SQLインジェクション

SQLインジェクションとは、悪意のあるユーザーがデータベースを操作するために、SQLコードを実行する攻撃です。

SQLコードを含めることにより、データベース内のデータが削除されたり、漏洩したりするリスクがあります。

これに対して、Djangoでは、クエリをパラメータ化すること(任意の変数にSQLコードを格納したうえで処理をおこなうこと)で、対策しています。

コード内にSQLコードを直接書くなどをしない限りは、リスクは小さいといえるでしょう。

DDoS攻撃

DDoS攻撃とは、大量のデータを送り込むことで、サーバーをダウンさせる攻撃などのことをいいます。

これについては、Webアプリケーション側でおこなえることは少なく、サーバ側でのファイアウォールの設定などが有効です。

DNSキャッシュポイズニング

DNSキャッシュポイズニングとは、URLの行き先を管理するDNSサーバーに偽の情報を埋め込み、ユーザーを悪意のあるサイトに誘導する方法です。

こちらについても、Webアプリ側でおこなえることは少なく、DNSサーバー側でおこなう設定になります。

一般的に名前の通ったレンタルサーバやVPSサービスなどであれば、ひとまずは安心できるといえるでしょう。

HTTPヘッダインジェクション

HTTPヘッダインジェクションとは、悪意のあるユーザーが、不正な文字列などを含むリクエストを送信し、Webサーバ所有者が意図しないスクリプトなどを実行させる攻撃です。

これにはWAFと呼ばれる対策が有効ですが、Django側ではなくApacheなどのサーバソフト側で設定することになります。

Djangoでおこなわれている対策としては、以下が挙げられます。

  • ランダムな文字列でセッションIDが発行される
  • LoginViewでは、古いセッションは廃棄される仕組になっている
  • HOST先を適切に管理するALLOWED_HOSTが備わっている

自前でおこなうことは少ないですが、既に備わっているものと、サーバ側での対策が必要です。

CSRF

CSRF(クロス・サイト・リクエスト・フォージェリ)は、ユーザーのCookieに保存している値を強制的に送信したり、読み込んだりする手法です。

強制的な送信をすることで、意図しない場面で商品を購入させられてしまうことなどがリスクとして存在します。

Djangoでは、リスクのあるPOSTメソッドでフォームを送信する際に特有のトークンを生成することで、送信者が正しいかの判断をする仕組みが備わっています。

Middlewareやテンプレートでは、CSRFトークンに関する記載があることを必ずチェックしておきましょう。

まとめ:Djangoのセキュリティは一定の水準以上

当記事の内容をまとめます。

  • Webアプリの構築では、そのセキュリティを気にしなければならない
  • Webアプリを守るには、どのような攻撃があるかを理解すべき
  • Djangoには、Webアプリでできる対策は備わっていることが多い

Djangoなどのフレームワークには、必要な機能が揃っていることが多いです。

これはセキュリティにおいても同様で、一から作るよりかはかなり安全性が高いと考えて良いでしょう。

ただし、Djangoが進めてないやり方やどうしても例外的なやり方でコードを書く場合は、必ずどんなリスクがあるのかを把握したうえで、コードを書くことが重要です。

タイトルとURLをコピーしました