mysql_real_escape_string() manualの以下の行を考慮してください。
MySQL では、バックスラッシュと、クエリ内の文字列を引用するために使用される引用文字のみをエスケープする必要があります。mysql_real_escape_string()は、他の文字を引用符で囲み、ログ ファイルで読みやすくします。
MySQL での SQL インジェクションは、これらの特殊文字だけでは可能ではありません: \b
\0
\n
\r
\t
\Z
.
ただし、 String Literals マニュアルには次のように記載されていますが、指定された (または指定されていない) 理由は SQL インジェクションとは関係ありません。
バイナリ データを文字列列 ( BLOB列など) に挿入する場合は、特定の文字をエスケープ シーケンスで表す必要があります。バックスラッシュ (「\」) と、文字列を引用するために使用される引用文字はエスケープする必要があります。特定のクライアント環境では、NUL または Control+Z をエスケープする必要がある場合もあります。mysqlクライアントは、エスケープされていない場合、NUL 文字を含む引用符で囲まれた文字列を切り捨てます。エスケープされていない場合、Windows では END-OF-FILE として Control+Z が使用される場合があります。
さらに、単純なテストでは、天候に関係なく、上記の特殊文字がエスケープされるかどうかに関係なく、MySQL は同じ結果をもたらしました。つまり、MySQL は気にしませんでした:
$query_sql = "SELECT * FROM `user` WHERE user = '$user'";
上記のクエリは、以下に示すように、上記の文字のエスケープされていないバージョンとエスケープされたバージョンに対して同様に機能しました。
$user = chr(8); // Back Space
$user = chr(0); // Null char
$user = chr(13); // Carriage Return
$user = chr(9); // Horizontal Tab
$user = chr(26); // Substitute
$user = chr(92) .chr(8); // Escaped Back Space
$user = chr(92) .chr(0); // Escaped Null char
$user = chr(92) .chr(13); // Escaped Carriage Return
$user = chr(92) .chr(9); // Escaped Horizontal Tab
$user = chr(92) .chr(26); // Escaped Substitute
単純なテストで使用されるテスト テーブルとデータ:
-- Table Structure
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(10) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Table Data
INSERT INTO `user` ( `user` ) VALUES
( char( '8' ) ),
( char( '0' ) ),
( char( '10' ) ),
( char( '13' ) ),
( char( '9' ) ),
( char( '26' ) );