-2

mysql_real_escape データを複数回使用すると、違いが生じるかどうか疑問に思っていました。

したがって、Web サイトの一部でデータをエスケープし、コードの別の部分で再びエスケープしたとします。これは問題になるでしょうか?それとも違いを生む?

4

7 に答える 7

8

mysql_real_escape の適切な場所は、クエリを送信してデータを保存する直前です。スクリプト内の他のすべてのインスタンスは、重大な設計上の欠陥です。

もちろん、それはできれば独自のdbクラスにあるはずです。

于 2010-05-16T13:16:58.333 に答える
3

はい。余分な不要なバックスラッシュが発生します。

于 2010-05-16T13:11:44.340 に答える
2

はい、問題になります。

例: 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を参照してください)

[以下のコメントの修正を反映するように回答を編集しました]

于 2010-05-16T13:13:40.743 に答える
1

エスケープされた文字列のように見えるものは意図されたエスケープされていない文字列であるため、エスケープされた文字列とエスケープされていない文字列を区別することはできません。したがって、再度エスケープしようとすると、エスケープがエスケープされます。一度エスケープされたテキストは、MySQL が読み取るものになります。

したがって、何度も逃げてはいけません。

ただし、より良い解決策は、パラメーター化されたクエリを使用することです。これは、エスケープする必要がまったくないためです。

于 2010-05-16T13:12:55.010 に答える
1

はい、オーバーエスケープメントの問題になります。これは、正確に何をするかに関係なく、どのエスケープでも同じです。たとえば、一般的なルールに従って文字列内の二重引用符をエスケープするとします。

bla "foo"

1回のエスケープ後

bla \"foo\"

2人になった後

bla \\\"foo\\\"

等々。「エスケープメント」の数は、「エスケープメント」の数と正確に一致する必要があります。一部のサイトでは、テキスト フィールド内の一部の文字を過度にエスケープするため、単純なアポストロフィが\'出力されるようになるため、この問題の兆候が見られることがあります。

于 2010-05-16T13:14:01.653 に答える
0

もちろん、データはダブルエスケープされます。

まったく使用しないでください。mysqlimysql_real_escape()を介したパラメーター化されたクエリは、十分長く使用されてきました。

于 2010-05-16T13:12:52.727 に答える
0

はい、違いがあります。

$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!
于 2010-05-16T13:15:48.820 に答える