こんにちは。
今日は、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でのパラメータ化クエリの書き方メモでした。
実用上は、リスク軽減やユーザビリティの観点からも、フォーム送信前に入力内容の検証を行って想定しないフォーマットであればはじく、といった考慮も併せて検討するとよさそうです。
おしまい
コメントを残す