1.Webアプリの代表的な脆弱性とは?

Python Web アプリを開発する際に特に意識すべき脆弱性は以下の3つです。

 

・XSS(クロスサイトスクリプティング)

・CSRF(クロスサイトリクエストフォージェリ)

・SQLインジェクション

 

これらはOWASP Top 10にも常にランクインしている深刻なセキュリティリスクです。次章から、それぞれの詳細と対策を見ていきましょう。

 

2.XSS(クロスサイトスクリプティング)とは?

XSSの仕組み

XSSとは、悪意のあるスクリプトをWebページに埋め込み、ユーザーのブラウザ上で実行させる攻撃です。例えば、以下のような入力がフォーム経由で表示ページにそのまま出力されると。

ユーザーのCookieが盗まれたり、フィッシングに使われる可能性があります。

PythonでのXSS対策

Flaskでの対策

Flaskのテンプレートエンジン(Jinja2)は、デフォルトで出力をHTMLエスケープします。

上記では name にスクリプトを入力されても自動的にエスケープされ、実行されません。

 

Djangoでの対策

Djangoも同様にテンプレート出力を自動でサニタイズ(無害化)します。ただし、safeフィルターを不用意に使うと脆弱になるので注意。


 

3.CSRF(クロスサイトリクエストフォージェリ)とは?

CSRFの攻撃例

CSRFは、ユーザーが意図しないリクエストを送信させる攻撃です。たとえば、ログイン中のユーザーが悪意あるサイトを開いたとき、そのユーザーの権限で自動送信されるフォームがあれば、それを悪用されます。

 

Flask・DjangoでのCSRF対策

Flaskでの対策

FlaskではFlask-WTFを利用してCSRFトークンを生成・検証します。

 

 

テンプレートでは{{ form.csrf_token }}を必ず含めます。

 

Djangoでの対策

DjangoはデフォルトでCSRF対策が有効です。フォームテンプレートに以下のタグを含めるだけでOK。


 

Ajaxの場合は、リクエストヘッダーにCSRFトークンを手動で追加する必要があります。

 

4.SQLインジェクションとは?

SQLインジェクションの脅威

SQLインジェクションは、ユーザー入力を通じて任意のSQLクエリを実行させる攻撃です。例えば、以下のようなコード。


 

に対して、' OR '1'='1 という入力を与えると、すべてのユーザー情報が漏洩する恐れがあります。

安全なクエリの書き方(Flask/Django)

Flask + SQLite など

常にプリペアドステートメントを使う。


 

Django ORMを使う

Django ORMでは変数を安全に渡せます。

 

 

SQL文を手書きするより、ORMを通じてアクセスすることで注入リスクが大幅に減少します。

 

5.よくある質問(FAQ)

Q1. FlaskではCSRF対策が自動で有効になりますか?

→ いいえ、Flaskは自動でCSRF対策を行いません。Flask-WTFなどのライブラリを使って明示的に実装する必要があります。

 

Q2. DjangoでCSRF対策を無効にできますか?

→ 可能ですが推奨されません。開発用APIなど限定された用途でのみ検討してください。

 

Q3. ORMを使えばSQLインジェクションは100%防げますか?

→ 高い防御力はありますが、完全ではありません。複雑な生SQLを使う場面では特に注意が必要です。

 

Python Webアプリを開発する際、セキュリティ対策は機能実装と同等、もしくはそれ以上に重要です。本記事では、代表的な脆弱性であるXSS(クロスサイトスクリプティング)、CSRF(クロスサイトリクエストフォージェリ)、SQLインジェクションについて、それぞれの攻撃手法の仕組みと、FlaskやDjangoにおける具体的な防御策を解説しました。HTMLの自動エスケープ、CSRFトークンの利用、プリペアドステートメントやORMによる安全なデータベース操作など、基本的な対策を正しく実装することで、Webアプリのセキュリティレベルを大きく高めることができます。ユーザーの信頼を守るためにも、「入力は信頼しない」「出力は制御する」という原則を徹底し、セキュアなPython Webアプリ開発を目指しましょう。