悪い答え:
確実ではありません。 mysql_escape_string()
を参照しています 、接続エンコーディングを考慮しません(mysql_real_escape_string()
したがって、慎重に作成された不完全なUTF8コードポイントが前面にある、慎重に作成された文字列である可能性があります。 たとえば、mysql_escape_string()
によって引用符がエスケープされます。 しかし、エスケープ自体はMySQLによって無視されます UTF8文字として「認識」されるためです。
例:
0xC2' OR 1=1 ;--
mysql_escape_string()
によってエスケープされます として
0xC2\' OR 1=1 ;--
組み立てられます
WHERE password='0xC2\' OR 1=1 ;--';
そして、MySQLによって(適切な接続エンコーディングが有効であった場合)、たとえば
として表示されます。WHERE password='€' OR 1=1 ;[--';] <-- the bracketed part is considered a comment and ignored
これは古典的なSQLインジェクションです。
しかし、これは、おそらく気を散らすことによって、二重に廃止された機能を指定したという事実に基づいています。 。本当にmysql_real_escape_string()
を参照している場合 、それでは機能しません。
また、これは、サーバーもアプリケーション層(PHPなど)も、入力を入力するときに任意の種類の文字セット検証を使用しないことを前提としています。そうした場合、無効なUTF8は到着時に削除され、mysql_escape_string
にも表示されません。 、もちろんそれで十分です。
本当の答え:
mysql_escape_string
は使用しないでください (またはmysql_whatever
)まったく。これらは非推奨になり、コードが機能しなくなる可能性があります。代わりにPDO関数を使用してください。