mysql_set_charset() vs SET NAMESクエリ

php

先日のphp 5.2.3のアップデートで mysql_set_charset()(英語)という関数がセキュリティフィックスという名目で追加されました。

Sets the client character set.

php manual 『 mysql_set_charset()(英語)』より

どうしてこの関数が追加されたのかというと、おなじみのSET
NAMESクエリでは、SQLインジェクションの脆弱性になる可能性があるからです。
このSET NAMESクエリは、SQL文レベルでの文字コード対応なので、どうしても隙ができてしまう可能性があるとのことです。

本来であれば、my.cnf設定などでデフォルトで望んでいる文字コードが吐き出されるようにしておくべきなのですが、それができないphpユーザーもいるのが現状です。それがSET NAMESクエリがよく使われる理由です。php5.2.3では、打開策としてAPIレベルでの対応をするために、mysql_set_charset()関数を追加したものと思われます。

マニュアルにはMySQL 5.0.7以上に付属するlibmysqlが必要と記載されていますが,
PHP5のソースコードを読むと4.x系のlibmysqlでもmysql_set_charset関数が利用可能になるコードになっています。
mysql_set_charset関数が利用可能なPHPであれば問題ありません。

残り一年!PHP4からPHP5への移行:第5回 セキュリティ関連の違い|gihyo.jp』より

という記事もあります。

mysql_set_charset | Sarabande
http://sarabande.info/2007/07/31/mysql_set_charset/

なお、上記のサイトでは、mysql_set_charset()関数とSET NAMESクエリとで、
MySQLの設定がどう書き換わるのかが比較されています。参考にどうぞ。

yohgaki’s blog – SET NAMESは禁止
http://blog.ohgaki.net/index.php/yohgaki/2007/08/22/set_namesa_mcb_asc

CakePHP のおいしい食べ方: SET NAMESは禁止?
http://cakephp.seesaa.net/article/52562968.html

WEBツール研究所 ? CakePHPでmysql_set_charsetに対応する
http://li-pton.com/wordpress/php/cakephp_mysql_set_charset.html

About: uechoco