ackintosh

勉強したことなどをメモしています。

WebアプリケーションからのSET NAMESは危険

yohgaki's blog「SET NAMESは禁止」
http://blog.ohgaki.net/set_namesa_mcb_asc

引用---
APIを利用したデータベース接続は現在の文字エンコーディング設定を各接続情報としてメモリ内に保存しています。APIのエスケープ関数はこの情報をエスケープの際に利用します。
SET NAMESによって文字エンコーディングを変更するとC言語などで書かれたエスケープAPI (libmysql, libpqなど)が想定しているエンコーディングと実際のエンコーディングが異なる状況が発生します。この違いにより、環境によっては文字エンコーディングを利用したSQLインジェクション攻撃が可能になります。
---

SET NAMESを使わない方法。
PHP

mysql_set_charset('utf8');


■Ruby

mysql = Mysql.init
mysql.options(Mysql::SET_CHARSET_NAME, 'utf8')
mysql.real_connect('host', 'user', 'password', 'database')
mysql.query('SET NAMES utf8')