mysql_real_escape データを複数回使用すると、違いが生じるかどうか疑問に思っていました。
したがって、Web サイトの一部でデータをエスケープし、コードの別の部分で再びエスケープしたとします。これは問題になるでしょうか?それとも違いを生む?
mysql_real_escape データを複数回使用すると、違いが生じるかどうか疑問に思っていました。
したがって、Web サイトの一部でデータをエスケープし、コードの別の部分で再びエスケープしたとします。これは問題になるでしょうか?それとも違いを生む?
mysql_real_escape の適切な場所は、クエリを送信してデータを保存する直前です。スクリプト内の他のすべてのインスタンスは、重大な設計上の欠陥です。
もちろん、それはできれば独自のdbクラスにあるはずです。
はい。余分な不要なバックスラッシュが発生します。
はい、問題になります。
例: a
が "Joe's House" の
場合、最初の呼び出しで "Joe\'s House" が生成され、2 回目の呼び出しで "Joe\\\'s House" が生成され、バックスラッシュがデータベースに保存されます。
これは、Web サーバーでマジック クォートが有効になっており、クライアントからの入力で mysql_real_escape_string を使用する場合に発生する問題に似ています。これは次の方法で解決されます。
if (! get_magic_quotes_gpc()) {
$value = mysql_real_escape_string($_GET["value"]);
} else {
$value = mysql_real_escape_string(stripslashes($_GET["value"]));
}
(後者の例については、http://www.php.net/get_magic_quotes_gpcを参照してください)
[以下のコメントの修正を反映するように回答を編集しました]
エスケープされた文字列のように見えるものは意図されたエスケープされていない文字列であるため、エスケープされた文字列とエスケープされていない文字列を区別することはできません。したがって、再度エスケープしようとすると、エスケープがエスケープされます。一度エスケープされたテキストは、MySQL が読み取るものになります。
したがって、何度も逃げてはいけません。
ただし、より良い解決策は、パラメーター化されたクエリを使用することです。これは、エスケープする必要がまったくないためです。
はい、オーバーエスケープメントの問題になります。これは、正確に何をするかに関係なく、どのエスケープでも同じです。たとえば、一般的なルールに従って文字列内の二重引用符をエスケープするとします。
bla "foo"
1回のエスケープ後
bla \"foo\"
2人になった後
bla \\\"foo\\\"
等々。「エスケープメント」の数は、「エスケープメント」の数と正確に一致する必要があります。一部のサイトでは、テキスト フィールド内の一部の文字を過度にエスケープするため、単純なアポストロフィが\'
出力されるようになるため、この問題の兆候が見られることがあります。
もちろん、データはダブルエスケープされます。
まったく使用しないでください。mysqlimysql_real_escape()
を介したパラメーター化されたクエリは、十分長く使用されてきました。
はい、違いがあります。
$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!