• ベストアンサー

SET NAMESは文字化け? 使わない方が良い?

・リンク先で下記のように書かれているのですが、SET NAMESは使わない方が良いでしょうか? ・SET CHARACTER SETなら良いでしょうか? ・.cnfを使用しない場合は、直接指定も可? >SET NAMES だとMySQLサーバには charset が伝わるけれどクライアント側は latin1 のままなのでエスケープ処理で問題が出る可能性があります http://qiita.com/ngyuki/items/d88a4df860abb51eb714

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

以前にも貼ったと思いますがもう一度w http://qiita.com/mpyw/items/b00b72c5c95aac573b71#3-1 5.3.5より古いバージョンを使っていること自体にもう問題があるといっても過言ではないですね。最新リビジョンの5.3.29に更新すべきです。というよりも根本的にマイナーバージョンで見て、5.3系のサポートは切れているので使うべきではありません。5.4以降を使いましょう。5.6または5.5がおすすめです。 ここからは記事の内容と重複しますが一応… ・「SET NAMES」「SET CHARACTER SET」を使ってもデフォルトの「latin1→UTF-8」のケースではエスケープ漏れが発生することはありません。ngyukiさんが心配されていますが問題ありません。但し、ソースからビルドしている場合で、コンパイルオプションにてデフォルトの文字セットを「cp932(Shift_JIS)」に変更している場合は脆弱性となります。 ・「SET NAMES」はMySQLに送る文字列にのみ作用しますが、「SET CHARACTER SET」は送る文字列に加え送られてくる文字列にも作用します。処理が重めになるので使わない方がいいです。

re97
質問者

お礼

回答ありがとうございました。 >5.3.5より古いバージョンを使っていること自体にもう問題があるといっても過言ではないですね ・あまり意識していなかったのですが、5.3ってそういう扱いなんですね ・古いバージョンを使用し続ける理由もないので、(先ずは)PHP5.4へ上げました ・いつかはバージョンアップしなければいけないと思っていたので、いい機会になりましたー

その他の回答 (3)

noname#244856
noname#244856
回答No.4

一つ重要なことを書き忘れました。 PDO::ATTR_EMULATE_PREPARES このオプションをFalseに設定している場合は先ほど危険と説明したケースにおいても安全です。デフォルトはTrueなのでご注意を。

re97
質問者

お礼

補足ありがとうございましたー

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

なお「文字化けする」なら(対処しないといけないことがわかるので)まだマシです。 怖いのは『適切な(文字セットまで加味した)エスケープが行われない』ことによって、セキュリティホールとなってしまうこと。文字化けせずに表示出来れば何も問題がないというものではありません。

re97
質問者

お礼

回答ありがとうございましたー

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

phpスクリプト側の話ですよね(MySQLサーバ側の設定は不問とします)。わざわざset namesやset character set を使う意味はありません。 php5.3.6以降でPDO接続を使うなら、DSNで指定するべきです。 http://www.php.net/manual/ja/ref.pdo-mysql.connection.php MySQLiならmysqli_set_charsetですね。 http://www.php.net/manual/ja/mysqli.set-charset.php #ネイティブなMySQL関数はすでに非推奨なので割愛ww

re97
質問者

お礼

回答ありがとうございましたー

関連するQ&A

専門家に質問してみよう