MySQL SET NAMES でSQLインジェクションに脆弱

セキュリティに関することで参考にしている大垣 靖男さんのブログの少し古いエントリーの紹介です。

2007-08-22 SET NAMESは禁止

MySQLには文字エンコーディングを変更する「SET NAMES」SQL文が用意されています。(PostgreSQLも同様のSQL文、SET CLIENT_ENCODINGがあります)この機能はSQLコンソールからは使ってよい機能ですが、アプリケーションからは使ってはならない機能です。SQLインジェクションに脆弱になる場合があります。

少々衝撃でした。
文字エンコーディング変更に SET NAMES を使うのは良く例示されている解決策だったからです。
今でも EUC 運用の MySQL は数多く存在し UTF-8 でアプリケーションを構築したいことは良くあります。

PHP では

mysql_set_charset('utf8');

が使えるなら使った方が良いことになるのかと、エントリーを見て思いました。

mysql_set_charset は PHP 5.0.7 以降で使用できます。

PHP のドキュメントにもちゃんと注意として書かれていました。
http://jp.php.net/manual/ja/function.mysql-set-charset.php

注意: 文字セットを変更するにはこの方法を使うことを推奨します。 mysql_query() で SET NAMES .. を実行する方法はお勧めできません。

心に刻んでおかなければ、と思った重要な記事の1つです。