ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

クライアントサイドのPreparedStatementの問題点

クライアント側のPreparedStatementでは、クライアント側で文字列結合でSQL文を作成し、そのSQL文をDBに送信する。
文字列として取り扱うので、リテラルを結合する際、メタ文字がある場合、適切なエスケープ処理を行わなければならない。
パラメータ(言語側で使用しているデータ)の文字コードがDBで取り扱っている文字コードと同じ場合は、適切なエスケープ処理さえしておけば問題ない。しかし、これらのコードが異なる場合、文字コードの変換処理が必要となる。
UTF-8から他の日本語文字コードに変換すると一部の文字でn:1の変換されることがある。このため、正しい処理方法は、文字コードの変換処理->エスケープ処理である(そうしないとエスケープすべき文字が文字コード変換によってエスケープされずに残る可能性がある)。しかし、MySQLJDBCではエスケープ処理->文字コードの変換処理が行われているため、PreparedStatementを使用していても、SQLインジェクションが発生することがある。
今回発見したのは、MySQLJDBCに依存するものだったけど、他にも同様の処理を行っている場合に発生することがある。したがって、クライアントサイドのPreparedStatementを使用している場合は注意が必要。
最も、DBとインターフェースの文字コードを同じにしておけば問題は発生しないと思われるけど・・・最近は携帯とPCで同じDB使っていることがあるから、PCと携帯で文字コードが違う場合は注意が必要かな。