HTML+CSS+PHP+MySQLで「SQL実習サイト」を作っています。
SQLを入力し、その結果を確認するという学習用のサイトです。
現在はXAMPP上で動かしているだけですが、上手くできたらWeb上に上げる予定です。
質問は、そのサイトでのSQLインジェクション対策についてです。
作成している「SQL実習サイト」では、フォームにSQL文を直接入力してもらい、そのままその
SQL文をPHPで実行するようにしています。
具体的には、POSTで自分自身(index.php)にSQLを送信し、それをクエリとして実行しています。
<h2>SQL入力</h2>
<form action="index.php" method="post">
<textarea name="input_sql" cols=38 rows=3></textarea>
<input id="sql" type="submit" value="SQL実行">
</form>
(~略~)
$_SESSION['jikkou_sql'] = $_POST['input_sql'];
(~略~)
$sql = $_SESSION['jikkou_sql'];
$query = mysql_query($sql, $conn);
IPAの「安全なSQLの呼び出し方」等から調べると、SQLインジェクション対策としては
プレースホルダ(プリペアド・ステートメント)が有効だとありますが、
作成しているケースだとSQLを直接実行するのでプレースホルダが使えない気がします。
「SQL実習サイト」ではSELECT文のみ実行できるようにしたいと考えています。
入力してもらったSQLの中で「SELECT」を探すようにして自作のSQLインジェクション対策を
行えばよろしいのでしょうか?(DELETEやUPDATEがあれば無効化したり・・・)
それとも、そもそもこのような使い方ではSQLインジェクション対策はできないのでしょうか?
ご教授よろしくお願いします。
No.2ベストアンサー
- 回答日時:
サブクエリなどもあるので、先頭がSELECTかどうかだけを判定するだけではさすがに不十分すぎます。
オススメの方法としては、MySQLを捨ててSQLiteを使うことです。SQLiteであればユーザーごとにファイルを生成することができ、個別のデータベース空間を与えることが出来ます。この状態であれば何されても特に問題はありません。(重いSQL実行によるサーバー負荷とかは注意)PHPでデータベースに接続するときのまとめ
http://qiita.com/mpyw/items/b00b72c5c95aac573b71
・mysql_query関数は問答無用でやめましょう…
・ユーザーが実行不能なSQLを投げてくることも想定し、「PDO::ERRMODE_EXCEPTION」を有効にしておき、例外を捕まえられるようにしましょう。
回答ありがとうございます。
古い書籍を参考にしているので現状ではmysql関数でした…
実際に上げるときはPDOにしようと思います。
また、想定しているレンタルサーバがMySQLのみ対応です。
まだレンタルしていませんのでSQLiteも視野に入れて考えてみようと思います。
SQLiteでユーザーごとにファイルを生成する、ということに対しての理解は
私自身は不十分ですので調べてみます。ありがとうございます。
No.4
- 回答日時:
>> また、想定しているレンタルサーバがMySQLのみ対応です。
SQLiteってただの "1つの" ファイルだけでデータベースのように扱えるものなんですよね。レンタルサーバーがもし「MySQLしか対応していない」という表記でも、SQLiteは使えるというケースがあります。レンタル前にサーバー管理者に「PDO_SQLITEは使えますか?」と聞いてみるのもいいと思います。
回答ありがとうございます。
SQLiteを使う方向で考えて見ます。
また、No5さんが回答してくださったように想定しているレンタルサーバでも
SQLiteは使えるようです。
No.3
- 回答日時:
所詮プレースホルダは「値を安全に渡せる」というだけのことですから
SQLをそのまま走らせるような処理は無理ですね
ただ考えてみれば、インジェクション対策の意義は
(1)データ挿入・更新・削除など勝手にされないようにする
(2)アクセスできるdbやtableを制限する
(2)表示させるカラムやレコードを制限する
という趣旨ですから、実行ユーザーの権限をうまく抑制すれば理論上問題は
極小化できます。むしろ、とかく手抜きでDSNにrootユーザーを設定しがちですが、
検索だけが目的なら本来どんなSQLの発行も権限を抑えられたユーザーにすべきです。
あとはたぶん汚いSQLが大量に流れてくるでしょうから、エラー処理など適切に
設定する必要はあるでしょう。
回答ありがとうございます。
PHPで対策をすることしか考えていませんでしたので、DBの権限のことは
どのように実現できるかわかりませんので調べてみます。
また、エラー処理は現状では、
if(!$query) → エラーメッセージ
と、クエリがおかしい場合のみのエラーメッセージ表示のみです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL #1062 - '0' は索引 'PRIMARY' で重複しています。とでています。 1 2023/01/01 06:13
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
php5-extensions を make でき...
-
mysql複数レコードをまとめて削...
-
PHPからCプログラムを実行して...
-
一時停止のコマンドはありますか?
-
PHPの中間コード
-
PHPからlhaコマンドを使いたい
-
PHPで、C#のプログラムを実行す...
-
CRON でPHPスクリプトをGET変数...
-
ヒアドキュメントの中で演算子...
-
php実行中に実行中のphpファイ...
-
onedrive にexcelファイルをア...
-
phpでPEAR::DBを使っているので...
-
フォントの色を変えるには?
-
PHPのみでの背景色は指定できる...
-
リンク先を隠す方法はないでし...
-
index.phpって何ですか? 具体...
-
トランザクションが原因?DBに...
-
CFileDialogの最初のディレクト...
-
2つの画像ファイルが異なるファ...
-
バッチを用いたフォルダの自動移動
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
php実行中に実行中のphpファイ...
-
phpからエクセルのマクロを実行...
-
ヒアドキュメントの中で演算子...
-
PHPからバッチファイルの実行
-
【PHP】命令は記述順に処理...
-
シェルスクリプトをPHPで動かそ...
-
Switch文における、returnとbre...
-
httpdのプロセスが自動で消えな...
-
copy() で属性保存
-
Prompt入力値をphp変数として取...
-
JSのWINOW.CONFI...
-
htmlでsubmitで指定したAction...
-
unix(freebsd)でmysqldumpコマ...
-
PHPのsystem()でjava
-
別サーバのプログラムを起動
-
PHPでコマンドプロンプトを実行...
-
社内LANで複数台のPCからApache...
-
PHPからCプログラムを実行して...
-
PHPで、C#のプログラムを実行す...
おすすめ情報