- ベストアンサー
SQL実習サイトでのSQLインジェクション対策について
- HTML+CSS+PHP+MySQLで作成している「SQL実習サイト」では、フォームから直接SQL文を入力して実行できるようにしています。その際、SQLインジェクション対策について検討しています。
- IPAの「安全なSQLの呼び出し方」では、プレースホルダ(プリペアド・ステートメント)を使用することが有効とされています。しかし、直接SQLを実行するため、プレースホルダは使用できない可能性があります。
- 「SQL実習サイト」では、SELECT文のみ実行できるようにすることを考えています。ユーザが入力したSQL文の中で「SELECT」を検出して、自作のSQLインジェクション対策を行うことを検討しています。ただし、DELETEやUPDATEなどの文がある場合は無効化する必要があります。このような使い方では、SQLインジェクション対策は可能でしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
サブクエリなどもあるので、先頭がSELECTかどうかだけを判定するだけではさすがに不十分すぎます。オススメの方法としては、MySQLを捨ててSQLiteを使うことです。SQLiteであればユーザーごとにファイルを生成することができ、個別のデータベース空間を与えることが出来ます。この状態であれば何されても特に問題はありません。(重いSQL実行によるサーバー負荷とかは注意) PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 ・mysql_query関数は問答無用でやめましょう… ・ユーザーが実行不能なSQLを投げてくることも想定し、「PDO::ERRMODE_EXCEPTION」を有効にしておき、例外を捕まえられるようにしましょう。
その他の回答 (3)
>> また、想定しているレンタルサーバがMySQLのみ対応です。 SQLiteってただの "1つの" ファイルだけでデータベースのように扱えるものなんですよね。レンタルサーバーがもし「MySQLしか対応していない」という表記でも、SQLiteは使えるというケースがあります。レンタル前にサーバー管理者に「PDO_SQLITEは使えますか?」と聞いてみるのもいいと思います。
お礼
回答ありがとうございます。 SQLiteを使う方向で考えて見ます。 また、No5さんが回答してくださったように想定しているレンタルサーバでも SQLiteは使えるようです。
- yambejp
- ベストアンサー率51% (3827/7415)
所詮プレースホルダは「値を安全に渡せる」というだけのことですから SQLをそのまま走らせるような処理は無理ですね ただ考えてみれば、インジェクション対策の意義は (1)データ挿入・更新・削除など勝手にされないようにする (2)アクセスできるdbやtableを制限する (2)表示させるカラムやレコードを制限する という趣旨ですから、実行ユーザーの権限をうまく抑制すれば理論上問題は 極小化できます。むしろ、とかく手抜きでDSNにrootユーザーを設定しがちですが、 検索だけが目的なら本来どんなSQLの発行も権限を抑えられたユーザーにすべきです。 あとはたぶん汚いSQLが大量に流れてくるでしょうから、エラー処理など適切に 設定する必要はあるでしょう。
お礼
回答ありがとうございます。 PHPで対策をすることしか考えていませんでしたので、DBの権限のことは どのように実現できるかわかりませんので調べてみます。 また、エラー処理は現状では、 if(!$query) → エラーメッセージ と、クエリがおかしい場合のみのエラーメッセージ表示のみです。
- kosukejlampnet
- ベストアンサー率44% (126/282)
DBの接続ユーザーを新規に作成して、特権情報でselectのみを許可する。 root権限のない、レンタルサーバーじゃ無理だろうけど…。
お礼
回答ありがとうございます。 想定しているレンタルサーバはさくらインターネットです。 調べたところroot権限があるような感じはしなかったです…。 もう少し調べてみます。
お礼
回答ありがとうございます。 古い書籍を参考にしているので現状ではmysql関数でした… 実際に上げるときはPDOにしようと思います。 また、想定しているレンタルサーバがMySQLのみ対応です。 まだレンタルしていませんのでSQLiteも視野に入れて考えてみようと思います。 SQLiteでユーザーごとにファイルを生成する、ということに対しての理解は 私自身は不十分ですので調べてみます。ありがとうございます。