• ベストアンサー
  • すぐに回答を!

MySQLとPostgreSQLについてのSQLインジェクション

はじめて質問させていただきます。 よろしくお願いします。 現在、私は大学の研究テーマでデータベース(MySQL、PostgreSQL)を使っているCGIを自作し、それぞれのデータベースについてSQLインジェクションの脆弱性について調べる、という研究を行っています。 ブラインドSQLインジェクションについて調べているのですが、 PostgreSQLの場合、pg_tablesというテーブルにデータベースのテーブル一覧表がのっていて、それを参照することでテーブル名が取得でき、いろいろ悪いことができてしまいますが、MySQLの場合、ブラインドSQLインジェクションを起こそうと思った場合どのようなコマンドを使えばよいのでしょうか? SHOW TABLESで使用中のデータベースのテーブル一覧は取得できますが、それをクエリの一部として使うことはできるのでしょうか・・・? また、全く関係ない質問なのですが、このCGIはRubyで記述して作りました。Rubyにはプリペアドステートメントという機能があるのですが、これをデータベースにアクセスするすべての箇所で用いればSQLインジェクションは100%起きないといえるのでしょうか?(現在考え得る範囲でよいのでお願いします) 卒論で困っているので知っている方がおられましたらどうかよろしくお願いいたします。

共感・応援の気持ちを伝えよう!

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

  • ベストアンサー
  • 回答No.1

主要なRDBMSでは、表や列の定義情報を表形式で管理し、SQLで検索可能にしています。 MySQLのように、SHOWコマンドといった特別なコマンドで操作させるのは、特殊な例です。 MySQLもバージョン5.0から、情報スキーマを公開しており、SQLでの操作を可能にしています。 >SHOW TABLESで使用中のデータベースのテーブル一覧は取得できますが、それをクエリの一部として使うことはできるのでしょうか・・・? 「できるのか?」との質問に関しては、工夫次第でできます。 例えばMySQLでは操作内容をログとして残す機能があるので、その結果を拾うツールを作るのは、プログラミング経験のある人にとっては、容易です。

参考URL:
http://dev.mysql.com/doc/refman/5.0/en/information-schema.html

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 実際に確認して見たらinformation_schemaやmysqlというデータベースにシステム情報が入っていました! 私の知識不足でした。。。 あと、どなたかプリペアドステートメントについて詳しい方がいれば教えていただけないでしょうか・・・・・・・?

その他の回答 (1)

  • 回答No.2

すべての箇所で prepared statement を使えば(そして実装にバグが無ければ)、文字列を不正に終端させることは出来ません。 そのため文字列の不正な終端によるSQLインジェクションは100%起こりません。 その他の原因(私は知りませんが)による SQLインジェクションが防止できるかどうかは、私にはわかりません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答していただいてどうもありがとうございます。 やはりデータベースにアクセスするメソッドをひとまとめにして管理し、すべての箇所でプリペアドステートメントを使えば、現状ではかなり安全だといえるのですね。 MySQLのことでわからないことがあって、もうひとつ質問を投稿させていただいたので、そちらもご存知でしたら答えていただけないでしょうか・・・・・・・

関連するQ&A

  • データベースのメンテナンスについて、PostgreSQLとMySQLについて

    MySQLのように show tables;などデータベースの情報をSQLコマンド等で見れるような仕組みは PostgreSQLにあるのでしょうか?

  • postgreSQLでDB名やテーブル名・フィールドを表示させるSQLコマンド

    MySQLでは show databases; show tables; show fields from テーブル名; でSQLコマンドとしても実行できますが、PostgreSQLで 同じことのできるSQLコマンドはあるのでしょうか?

  • SQLインジェクション時の最小値、最大値以外の取得

    ascii(substring((select min(TABLE_NAME) from information_schema.tables where TABLE_SCHEMA != 'mysql' AND TABLE_SCHEMA != 'information_schema'),2,1))>100; ↑MySQLの場合です。 前回ここで疑問に答えていただいて、このようにすることで、tablesというテーブルから、データベースinformation_schemaとmysql以外のデータベースにあるテーブルを取得できるというのはわかったのですが、上のような記述だとmin(TABLE_NAME)にあるとおり、TABLE_NAMEで並べたときの最小のものしか取得できないんです。。。 min(TABLE_NAME)のminをmaxに変えることで最大のものは取得できますが、その2つ以外のテーブル名を取得する記述(例えば2番目を取得するなど)はあるのでしょうか? データベースの種類はMySQLでなくても良いです。 連続の質問になるのですがよろしくお願いします。。。

  • カラムの一覧を取得したい

    これまでMySQLを利用していたのですが、諸事情によりPostgreSQLへ 移行することになりました。そんなにMySQLへ依存した作り方をして いなかったので、簡単に考えていたのですが、ちょっと躓いている ことが出てきたのでご質問させて戴きます。 MySQLでは「show tables;」というコマンドを送ることにより、 データベース内のテーブル一覧を取得することが出来ました。 かなり色々調べ回ったところPostgreSQLでは 「select * from pg_stat_user_tables」 というコマンドが、それに相当することがわかりました。 同じように、MySQLでの「show fields from TABLE_NAME;」という 指定したテーブルのカラム一覧を取得するためのコマンドに相当する ものを探しているのですが見つかりません。 どなたかご存知であれば、ご教授下さい。 以上、宜しくお願い致します。

  • PostgreSQLとMySQL

    データベースの学習のため、 PostgreSQLかMySQLを利用しようと考えていますが、 どちらにするか決め手が無く、悩んでいます。 利用方法はプログラムからSQL文を発行し、 データの取り出し、書き込みを行う程度なので どちらでも特に何も問題は無いと思いますが、 「こっちの方がオススメ!」みたいなものはあるでしょうか?

  • SQLインジェクションの危険性について[MYSQL]

    下記のコードはPHPプログラマ一年生の自分から見ても、 POST入力値をチェックしていない危険なコード(一部を抜粋)だと 思うのですが先輩は問題ないと言い、修正する気がありません。 そこで、SQLインジェクションのようなSQL文を送信された場合に ユーザー名とパスワードが表示されれば納得すると思い いろいろテストしてみたのですが、うまく表示されません。 実はSQLインジェクションなどの問題ないソースなのでしょうか? ご教授、よろしくお願いいたします。 ■テーブル構成(ユーザ・パスワード管理テーブル) CREATE TABLE `sample`.`test` ( `user_id` INT NOT NULL , `passwd` VARCHAR( 32 ) NOT NULL ) ■問題の処理分 <?php $user_val = "" ; $pass_val = "" ; if (isset($_POST["user_id"]) == TRUE) {   $mysql_c = mysql_pconnect('******' , "******" , "******");   mysql_select_db("******" , $mysql_c);   $sql = 'select * from test where user_id = ' . $_POST["user_id"] ;   $result = mysql_query($sql , $mysql_c);   if ( $result != false)   {     if(($row = mysql_fetch_object($result)) != false )     {       // パスワードチェック       if ( $row->passwd != $_POST["pass"] )       {         echo "check NG" ;       }       else       {         $user_val = $row->user_id ;         $pass_val = $row->passwd ;       }     }   } } ?> <FORM action="index.php" method="post" > <input type="text" name="user_id" value="<?php echo $user_val ?>" > <input type="text" name="pass" value="<?php echo $pass_val ?>" > <input type="submit"> </FORM>

    • ベストアンサー
    • MySQL
  • postgreSQLでテーブルの一覧

    他人が管理していたUNIXマシンのデータベースがあります。 postgreSQLです。 さて、SQLコマンドで、SELECTとかINSERTとかはわかった(というか 教わった)のですが・・・・ テーブルが複数あるようなので、そのテーブルの一覧というか、 すべてのテーブルの名称を見るにはどうしたらよいのでしょうか?

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

    • ベストアンサー
    • MySQL
  • SQLインジェクションの対策

    SQLインジェクションの対策 いつもお世話になっております。 SQLインジェクションの対策についてお伺いいたします。 もともと↓のようなSQL文だったものを "select user_id from table where user_id='{$user_id}'" 以下のように変更しました。 "select user_id from table where user_id='" . mysql_real_escape_string($user_id) . "'" 以下のように実行されていたSQL文は select user_idfrom table where user_id='10001' and 'a'='a' ↓のようにエスケープ処理して実行されるようになりました。(入力値は「10001' and 'a'='a」) select user_id from table where user_id='10001\' and \'a\'=\'a' ですが、phpMyAdminで実行してみるとどちらのSQL文も同じ結果が取得できてしまいます。 これでは対策になっていないと思ったので、質問させていただきました。 (magic_quotes_gpcはoffに設定しています。) なにか他の方法がいいのでしょうか。 ご教示よろしくお願いいたします。 <環境> PHP 5.1.6 MySQL 5.0.45

    • ベストアンサー
    • PHP
  • PostgreSQL と MySQL の速度の比較

    私は仕事の一つでゲームのサーバーを管理をしている者です。ゲームサーバーのデーターベースは昔からPostgreSQLを使っております。おかげさまでそれなりの会員数を持つサイトなのですが、慢性的にDBの負荷が大きい状態が続いております。 そこで質問なのですが、現在のPostgreSQL(8.1.4)をMySQLに差し替えることによりどの程度の改善が期待できるか知りたいのです。 なお、現在のPostgreSQL環境では速度の最適化でできることはほぼやっております。(buffer数の最適化、fsyncをoff、update頻度の高いテーブルを高速なハードディスクに置くなど)