MySQLの「set names」問題について教えて下さい。 以前phpとmysqlを使う際、文字化けを防ぐ目的で、「set names utf8」というクエリを一番最初に実行していました。 しかしこの「set names」というクエリはSQLインジェクションを引き起こすということで、現在非推奨になっていると思います。 そこで質問です。下記のように文字コードを全て統一している場合でも、SQLインジェクションのリスクが有るのでしょうか。 phpの文字コード:utf8(mb_internal_encoding等で設定) SQLに与える文字列:utf8 例えばウェブフォームから文字列を入力して、入力される文字列をデータベースに格納する場合を考えます。 htmlをutf8で作っていて、mb_http_inputがpassであれば、phpにはutf8で文字列が渡ってくると思いますが、攻撃者が意図してSJISで文字列を送ってくる場合もあるかと思います。 上記のような場合でも、送られてきた文字列をmb_convert_encoding( $str, 'utf-8', 'utf-8' )しておけば、攻撃者の文字列は意味不明な文字列とはなりますが、文字コード自体はutf8で統一されると思います。結果としてutf8しか使わない状況を確約出来ると思います(データベースに投入する際は正しくクオートすることが前提です)。 「set names」がダメという記述はよく見かけます。「こういう場合にダメ」という記述もみかけます。一部でもダメな可能性がある場合は「総じてダメ」と記述しておくことで、素人が安易に利用しないというメリットがあると思います。でも、実際は「こういう場合はセーフ」というのもあると思うのです。しかしそれに関する記述がないのが現状です(検索しきれていないのかもしれないですが)。 現状の比較的新しいphpのバージョンでは解決されている事柄ですが、いくつかウェブアプリのセキュリティ面について考察していてこの問題にぶつかりました。 識者の方、ご意見いただければと思います。
「set names」のページはひと通り読みました。 「set names」がサーバの文字コードを設定するだけということも理解しています(現在の主流な書き方、も理解しています)。 知りたいのは、プログラム側で全部自前でutf8になっていることを確約できれば、「set names」でも問題ないんじゃない?、という点です。「そんな面倒なことはやめなよ」となるのはわかっているのですが、理解を深めたくて補足させていただきました。
MySQL・2,456閲覧・50