Pythonでパラメータ化クエリを利用してSQLインジェクション攻撃を防ぐ

こんにちは。

今日は、Pythonで書いたアプリケーションでSQLインジェクション攻撃対策の一般的な手法であるパラメータ化クエリを利用する方法を試してみたので、メモを残しておきます。

(社会人一年目の研修で習ったきりで、記憶が風化しつつあったので復習の意味も込めて・・)

ダメなSQLの書き方

まず、SQLインジェクション攻撃を受けてしまうコードの書き方。

cursor.execute(f"SELECT COUNT(1) FROM dbo.TestTable WHERE col2 = '{question}'")

こういうコードの書き方をしていると、以下のようなクエリを記入されたら、テーブルの全件を抜き出す、なんてこともできてしまいます。(通常キーワードに一致する1件だけが取得される想定が、100万件すべて取得しまった例)

パラメータ化クエリを利用する

# パラメータ化クエリ
params = (question,)
cursor.execute("SELECT COUNT(1) FROM dbo.TestTable WHERE col2 = ?", params)

パラメータ化クエリは、上記のようにして書くことができます。

この状態で同じSQLインジェクション攻撃をしかけてみると・・以下のようにヒット件数が0になりました・・!これは、上のような書き方をすることでパラメータ部分とクエリ部分が明示的に区別されるようになるからですね。

以上、簡単でしたがPythonでのパラメータ化クエリの書き方メモでした。

実用上は、リスク軽減やユーザビリティの観点からも、フォーム送信前に入力内容の検証を行って想定しないフォーマットであればはじく、といった考慮も併せて検討するとよさそうです。

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。