SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
てるてる動画

【php】addslashesとmysql_real_escape_stringって何が違うの

問題

phpの関数のaddslashesとmysql_real_escape_stringって何が違うの?

php

答え

SQLに渡すデータのエスケープに気を付けている方はaddslashes関数とmysql_real_escape_string関数の違いが気になったことがあると思います。

単純にエスケープしてくれる文字がMySQL用にちょっと違う(改行を\nにしてくれるなど)のと、接続しているクライアント側の文字コードを考慮して適切にエスケープしてくれる機能があります。

addslashes関数では何が問題なのかというと、日本語のShift_JISや中国語のGBKなど文字の最後のバイトに16進アスキーコード 5c =\(バックスラッシュ) が含まれる可能性のある文字コードを使用すると、エスケープした時のバックスラッシュと前の1バイトがくっついて、別の文字になることがあるのが問題。

\x95' (アスキーコード0x95とシングルクォート) を
文字コードを考えずに単純にaddslashesでエスケープすると、
\x95\x5c' になって
\x95\x5c はShift_JISの「表」という文字を表しているので、
表' となって、シングルクォーテーションを混入させられる → 事件発生

日本語なら、全部UTF-8のシステムや、EUCでは、addslashesでエスケープしても事件はおきなさそうではあります(5C問題はない文字コード)。

以上のように違いはあるにしても、
で、いまどきはどうするんだい?っていうと、プリペアドステートメント使うのが一般的。

$db = new PDO('接続情報');
$s = $db->prepare('select * from xxx where id = ?');
$s->execute(array('文字列文字列'));
$row = $s->fetch();

わざわざ自分でエスケープしない。

関連するメモ

コメント