電子書籍の厳選無料作品が豊富!

Webページのフォームを使い,MySQLデータベースにSQLインジェクションを実行しようとしています.
環境はもちろんローカル環境です.

テーブルはこのようになっています.
mysql> DESC member;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| no | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | | |
+-------+--------------+------+-----+---------+----------------+

JSPページのソースの一部はこのようになっています.
PreparedStatement ps = db.prepareStatement("INSERT INTO member(no, name) VALUES(" + no + ",'" + name + "')");

noに
12

nameに
name'); DELETE FROM member; --

という入力を与えると
INSERT INTO member(no, name) VALUES(12,'name'); DELETE FROM member; --')

となり,テーブルのデータを全て消去できると考えましたが,文法エラーとなるらしく,消去されません.
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; DELETE FROM member; --')' at line 1

この場合,ソース・フォーム入力内容・データベースなどのどの箇所をどのように修正すれば良いでしょうか?

A 回答 (2件)

MySQLは基本的にAPIからの複数のSQL文の同時処理には対応しておりません


ただしバージョン4.1以降は接続時にパラメータを設定することにより可能になるそうです。

詳しくは以下のページを参照して下さい。

11.1.8. C API における複数クエリの実行の取り扱い
http://dev.mysql.com/doc/refman/4.1/ja/c-api-mul …



当然のことながらSQLインジェクション攻撃に対しては
非常に脆弱になるはずですのでご注意下さい。
    • good
    • 0

最低限、DELETE権限をつけなければ消されることはありません。


実行ユーザーの権限については常識的な範囲で制限をつけておいてください
どちらかというとインジェクションの場合、全件表示をされてしまう方が通りやすいですね。

それにしても、ユーザーから送られてきたデータを無条件に信用する
ことはありえませんので、あらじめ使われるべき変数に、サニタイズ
しておけば済むでしょう。

JSPについてはよくわかりませんが、実際のところ今回の処理は
プリペアドステートメントで処理しているのではないのですか?
であればある程度基本的なリスクは回避してくれていると思いますが
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!