なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

データベースへの安全な接続の方法

以下の書籍に、「データベースへの安全な接続の方法」についても記載があったので、メモっときます。

背景

一般的にアプリケーションでは、MySQLなどのデータベースを利用しているかと思います。そのデータベースの操作(データ取得やデータ更新などのSQL操作)に不備があった場合「脆弱性」となります。
そのデータベースによる脆弱性により、以下の影響があったりします。

  • 情報漏えい
  • データ改ざん

そのような脆弱性を作らないためにも、データベースにアクセスする際には、出来る限り「安全にデータベースに接続する」必要があります。
ここでは、プレースホルダ方式についてメモっときます。

プレースホルダの方式

(上記書籍から引用)

静的プレースホルダは値のバインドをデータベースエンジン側で行います。プレースホルダのついたSQL文は、そのままデータベースエンジンに送られ、コンパイルなどの実行準備が行われ、SQL文が確定します。次にバインド地がデータベースエンジンに送られ、エンジン側で値を当てはめられた後にSQL文が実行されます。プレースホルダの状態でSQL文がコンパイルされるため、後からSQL文が変更される可能性は原理的にあり得ません。

コンパイル後にSQLの文法を変更後に変更することはできないということですね。よく言われる「Prepared Statement」はこちらの方式になります。

(上記書籍から引用)

動的プレースホルダは、SQLを呼び出すアプリケーション側のライブラリ内で、パラメータをバインドしてからデータベースエンジンに送る方式です。バインドに当たりリテラルは適切に構成されるため、処理系にバグがなければSQLインジェクションは発生しません。

原理的にSQLインジェクションの可能性がないという点で、静的プレースホルダを使ったほうが良いそうです。

Javaでの静的プレースホルダでの接続設定

(上記書籍から引用)

JavaからMySQLに接続する場合は、JDBCDriverとしてMySQL Connection/Jを利用します。この組合せの場合デフォルトでは動的プレースホルダとなるので、静的プレースホルダを用いるには接続時に以下を指定します。

useServerPrepStmtsを指定します。

Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbnamme?name=xxx&password=xxxx&useServerPrepStmts=true&useUnicode=true&characterEncoding=utf8")

デフォルトでは動的プレースホルダということで、ライブラリにバグがないとは限らないので上記の設定を必ず指定おいたほうがいいですね。