SQLインジェクション対策

2021/07/14に公開されました。
2021/07/14に更新されました。

SQLインジェクション対策を紹介


author: qwerty2501

Introduction

SQLインジェクション?プレースホルダ使えばいいんでしょ?と思ってる人向けのSQLインジェクション対策を短くまとめた記事です。

プレースホルダ

これはSQLインジェクション対策としてもっとも有名な対策方法。与えられたパラメタをもとにmysqlにおける ? やpostgresqlにおける $1 などにわりあてる。
SQLインジェクションの対策としては必須であるが、これだけでは防げない攻撃があるので対策が必要。

LIMIT 句を使用した DOS 攻撃対策

たとえばclient側からlimitをリクエストパラメタで指定して取得するデータ量に制限をかけられるような機能のAPIがあった場合、以下のようなSQLを実行するようなリクエストを行うことにより攻撃者は手軽にデータベースサーバーに対してDOS攻撃をできる。

SELECT * FROM table LIMIT 9999999999

対策としてはリクエストで与えられたLIMITの値に対して現実的な上限値を設けてバリデーションを行う。

LIKE クエリインジェクション対策

例えば前方一致を目的とした以下のようなSQLを発行するAPIを提供していた場合、パラメタにLIKEクエリを制御する文字である %_ を含ませることにより必要以上のデータを取得できるようになってしまう。

SELECT * FROM table where hoge like ?

このときアプリケーションコードでparameter+”%” といった値をプレースホルダに割り当ててしまうと、parameterに”%hoge”が与えられた場合中間一致でデータが取得できてしまう。
これを防ぐためにはエスケープを活用してparameter中にある %_ といったLIKEクエリ制御文字列を無効化する必要がある。

以上です。いかがでしたでしょうか?

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。