トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

MySQL、スクリプト言語から SET NAMES はセキュリティに問題あり

[カテゴリ:MySQL]
[カテゴリ:PHP]

****************************************
以下も関連あり。
2007/04/23-01、skip-character-set-client-handshake について
****************************************

MySQL、スクリプト言語から SET NAMES はセキュリティに問題あり(2007/10/04)

$conn = mysql_connect('127.0.0.1', 'root', '');
mysql_query('SET NAMES cp932' ,$conn);

なんてやるのはNGらしい。

正解は、

$conn = mysql_connect('127.0.0.1', 'root', '');
mysql_set_charset('cp932');

なのだが、mysql_set_charset() が使えるのは
PHP5.2.3以上
http://jp.php.net/manual/en/function.mysql-set-charset.php

# mysql_set_charset() が使えない環境では、
# mysql側の設定(my.cnf)で変更するしかなさそう。
# で、実際のところ問題になるのは SJIS は確実っぽい。
# EUCとかUTF-8はよくわかんない。

なぜ駄目なのかというと、

まず、
mysql_real_escape_string() でエスケープするとき、
現在の文字セットを考慮してエスケープしてくれる。

問題は、
SET NAMES で文字セットを変更しても mysql_real_escape_string() は
考慮してくれないという点

SET NAMES と mysql_set_charset で 現在の文字セット がどうなるか調べてみる。
と思ったが、5.3.2以上の環境がないので、SET NAMES だけみてみる。
スクリプト

<?php
$conn = mysql_connect('127.0.0.1', 'root', '');
echo mysql_client_encoding() . "\n";
mysql_query('SET NAMES cp932' ,$conn);
echo mysql_client_encoding() . "\n";
//mysql_set_charset('cp932');
//echo mysql_client_encoding() . "\n";
?>

実行結果

latin1
latin1

ほんとだ、変わらないね。

以下参考しました。

MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 23.2.3.53 mysql_real_escape_string():
http://dev.mysql.com/doc/refman/5.1/ja/mysql-real-escape-string.html

MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 23.2.3.4 mysql_character_set_name():
# PHPのmysql_set_charset()はこれをラップしてると思われる。
http://dev.mysql.com/doc/refman/5.1/ja/mysql-character-set-name.html

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

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

最終更新時間:2010年01月31日 23時17分43秒