- ベストアンサー
SQLインジェクションの例
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 この場合,ソース・フォーム入力内容・データベースなどのどの箇所をどのように修正すれば良いでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
MySQLは基本的にAPIからの複数のSQL文の同時処理には対応しておりません ただしバージョン4.1以降は接続時にパラメータを設定することにより可能になるそうです。 詳しくは以下のページを参照して下さい。 11.1.8. C API における複数クエリの実行の取り扱い http://dev.mysql.com/doc/refman/4.1/ja/c-api-multiple-queries.html 当然のことながらSQLインジェクション攻撃に対しては 非常に脆弱になるはずですのでご注意下さい。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
最低限、DELETE権限をつけなければ消されることはありません。 実行ユーザーの権限については常識的な範囲で制限をつけておいてください どちらかというとインジェクションの場合、全件表示をされてしまう方が通りやすいですね。 それにしても、ユーザーから送られてきたデータを無条件に信用する ことはありえませんので、あらじめ使われるべき変数に、サニタイズ しておけば済むでしょう。 JSPについてはよくわかりませんが、実際のところ今回の処理は プリペアドステートメントで処理しているのではないのですか? であればある程度基本的なリスクは回避してくれていると思いますが