• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLを直接フォームから入力するプログラムについて)

SQL実習サイトでのSQLインジェクション対策について

このQ&Aのポイント
  • HTML+CSS+PHP+MySQLで作成している「SQL実習サイト」では、フォームから直接SQL文を入力して実行できるようにしています。その際、SQLインジェクション対策について検討しています。
  • IPAの「安全なSQLの呼び出し方」では、プレースホルダ(プリペアド・ステートメント)を使用することが有効とされています。しかし、直接SQLを実行するため、プレースホルダは使用できない可能性があります。
  • 「SQL実習サイト」では、SELECT文のみ実行できるようにすることを考えています。ユーザが入力したSQL文の中で「SELECT」を検出して、自作のSQLインジェクション対策を行うことを検討しています。ただし、DELETEやUPDATEなどの文がある場合は無効化する必要があります。このような使い方では、SQLインジェクション対策は可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

サブクエリなどもあるので、先頭がSELECTかどうかだけを判定するだけではさすがに不十分すぎます。オススメの方法としては、MySQLを捨ててSQLiteを使うことです。SQLiteであればユーザーごとにファイルを生成することができ、個別のデータベース空間を与えることが出来ます。この状態であれば何されても特に問題はありません。(重いSQL実行によるサーバー負荷とかは注意) PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 ・mysql_query関数は問答無用でやめましょう… ・ユーザーが実行不能なSQLを投げてくることも想定し、「PDO::ERRMODE_EXCEPTION」を有効にしておき、例外を捕まえられるようにしましょう。

sou-dan
質問者

お礼

回答ありがとうございます。 古い書籍を参考にしているので現状ではmysql関数でした… 実際に上げるときはPDOにしようと思います。 また、想定しているレンタルサーバがMySQLのみ対応です。 まだレンタルしていませんのでSQLiteも視野に入れて考えてみようと思います。 SQLiteでユーザーごとにファイルを生成する、ということに対しての理解は 私自身は不十分ですので調べてみます。ありがとうございます。

その他の回答 (3)

noname#244856
noname#244856
回答No.4

>> また、想定しているレンタルサーバがMySQLのみ対応です。 SQLiteってただの "1つの" ファイルだけでデータベースのように扱えるものなんですよね。レンタルサーバーがもし「MySQLしか対応していない」という表記でも、SQLiteは使えるというケースがあります。レンタル前にサーバー管理者に「PDO_SQLITEは使えますか?」と聞いてみるのもいいと思います。

sou-dan
質問者

お礼

回答ありがとうございます。 SQLiteを使う方向で考えて見ます。 また、No5さんが回答してくださったように想定しているレンタルサーバでも SQLiteは使えるようです。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

所詮プレースホルダは「値を安全に渡せる」というだけのことですから SQLをそのまま走らせるような処理は無理ですね ただ考えてみれば、インジェクション対策の意義は (1)データ挿入・更新・削除など勝手にされないようにする (2)アクセスできるdbやtableを制限する (2)表示させるカラムやレコードを制限する という趣旨ですから、実行ユーザーの権限をうまく抑制すれば理論上問題は 極小化できます。むしろ、とかく手抜きでDSNにrootユーザーを設定しがちですが、 検索だけが目的なら本来どんなSQLの発行も権限を抑えられたユーザーにすべきです。 あとはたぶん汚いSQLが大量に流れてくるでしょうから、エラー処理など適切に 設定する必要はあるでしょう。

sou-dan
質問者

お礼

回答ありがとうございます。 PHPで対策をすることしか考えていませんでしたので、DBの権限のことは どのように実現できるかわかりませんので調べてみます。 また、エラー処理は現状では、 if(!$query) → エラーメッセージ と、クエリがおかしい場合のみのエラーメッセージ表示のみです。

回答No.1

DBの接続ユーザーを新規に作成して、特権情報でselectのみを許可する。 root権限のない、レンタルサーバーじゃ無理だろうけど…。

sou-dan
質問者

お礼

回答ありがとうございます。 想定しているレンタルサーバはさくらインターネットです。 調べたところroot権限があるような感じはしなかったです…。 もう少し調べてみます。

関連するQ&A