mysql_real_escape_string
SQL 文中で用いる文字列の特殊文字をエスケープする
&mysql.alternative.note;
mysqli_real_escape_string
PDO::quote
&reftitle.description;
stringmysql_real_escape_string
stringunescaped_string
resourcelink_identifierNULL
現在の接続の文字セットで unescaped_string
の特殊文字をエスケープし、 mysql_query
で安全に利用できる形式に変換します。バイナリデータを挿入しようとしている場合、
必ずこの関数を利用しなければなりません。
mysql_real_escape_string は、MySQL のライブラリ関数
mysql_real_escape_string をコールしています。
これは以下の文字について先頭にバックスラッシュを付加します。
\x00, \n,
\r, \, ',
" そして \x1a.
データの安全性を確保するため、MySQL へクエリを送信する場合には
(わずかな例外を除いて)常にこの関数を用いなければなりません。
セキュリティ: デフォルトの文字セット
サーバーレベルで設定するなり API 関数
mysql_set_charset を使うなりして、
文字セットを明示しておく必要があります。この文字セットが
mysql_real_escape_string
に影響を及ぼします。詳細は
文字セットの概念
を参照ください。
&reftitle.parameters;
unescaped_string
エスケープされる文字列。
&mysql.linkid.description;
&reftitle.returnvalues;
成功した場合にエスケープ後の文字列、失敗した場合に &false; を返します。
&reftitle.errors;
MySQL 接続が存在しない状態でこの関数を実行すると、
E_WARNING レベルのエラーが発生します。
この関数は、MySQL 接続が確立した状態でのみ実行するようにしましょう。
&reftitle.examples;
単純な mysql_real_escape_string の例
]]>
mysql_real_escape_string には接続が必須であることを示す例
この例では、MySQL 接続が存在しない状態でこの関数を実行したときにどうなるかを示します。
]]>
&example.outputs.similar;
SQL インジェクション攻撃の例
]]>
MySQL に送信されたクエリは次のとおり:
これでは、パスワードを知らなくても誰でもログインできてしまいます。
&reftitle.notes;
mysql_real_escape_string を利用する前に、MySQL
接続が確立されている必要があります。もし存在しなければ、
E_WARNING レベルのエラーが生成され、&false;
が返されます。link_identifier が指定されなかった場合は、
直近の MySQL 接続が用いられます。
この関数を用いてデータをエスケープしなければ、クエリは
SQL インジェクション攻撃
に対しての脆弱性を持ったものになります。
mysql_real_escape_string は
% や _ をエスケープしません。
MySQL では、これらの文字を LIKE, GRANT,
または REVOKE とともに用いることで、
ワイルドカードを表現します。
&reftitle.seealso;
mysql_set_charset
mysql_client_encoding