1

まず、マジック クォートとランタイムが で正しく無効になりphp.ini、 で確認されphpinfo()ます。

PHP version: 5.3.4
MySQL version: 5.1.52

私はmysql_real_escape_stringデータに対してのみ使用しています。 afterhtmlspecialcharsと atrimは、変数のすべてのデータクリーニングです。

それでも、一重引用符を送信すると、スラッシュがデータベースに残ります。

実行mysql_query中は を使用し"' . $var . '"ていますが、これまでは何も変更されていません (二重引用符が原因でしょうか?)。

何か案は?PDO/準備済みステートメントについては教えないでください。私はそれらを認識しており、このようにする理由があります。

ありがとう!

コード例 (データに対して行われるのはこれだけです):

mysql_real_escape_string( htmlspecialchars( trim( $data ) ) );
4

4 に答える 4

3

私はデータに mysql_real_escape_string のみを使用しています。htmlspecialchars とトリムの後、変数のすべてのデータがクリーニングされます。

いいえ。データベースにデータを保存するためにのみ使用します。mysql_real_escape_string保存するときにデータを壊さないでください。

この関数htmlspecialcharsは、文字列を HTML にエンコードするために使用されます ( become など)。これ<&lt;、この目的にのみ使用する必要があります。

于 2011-01-03T21:53:38.297 に答える
1

あなたの保存手順は正しいです。(ただし、htmlspecialchars および/またはトリムはおそらく必要ありませんが、アプリケーションについてはわかりません)

あなたが提供している情報から、あなたの問題が見られる理由はありません。

次のデバッグ アプローチは、システムで変更された可能性があるものや変更されたものを記憶することです (サード パーティのインストール イメージを使用している可能性があります)。

それが失敗した場合、つまり、考えられる原因を推測することに任されている場合、最初の原因を提供します。

mysql は NO_BACKSLASH_ESCAPES モードで実行されている可能性があり、これによりバックラッシュが通常の文字として扱われます。

さらに、文字列を二重引用符で囲んでいるように見えます。これにより、単一引用符 (通常はエスケープされます) がデータベースに直接挿入され、前にバックスラッシュが付きます。

SQLステートメント内で文字列を二重引用符で囲んでいるため、これはどのようにすべきかであり、構文違反エラーが発生しないことに困惑しているため、次のようなクエリになる可能性も非常に高いです。"john\'s house"これは、mysql_real_escape からの単一引用符のエスケープが原因であり、クエリが単一引用符で正しくラップされていれば問題ありません。

それは私を質問に導きます。二重引用符を挿入しようとすると、構文エラー (または挿入されたクエリ) が発生しますか?

あなたのコメントについて。pdo を使用してステートメントを準備し、それからクエリ文字列を取得して、mysql 関数を使用して実行することができます。ただし、これは問題の解決策ではないことを認識しています。

また、クエリ全体を 1 つの変数だけに入れて、実行する前に直接出力してみてください。次に、それを見て、文字列を生成するために行われた操作ごとに、間違った操作を元に戻します。

于 2011-01-03T22:20:19.863 に答える
1

おそらく、非常に見当違いで、役に立たず、有害なオプションです

magic_quotes_gpc

有効になっていますか?

これは phpinfo() の出力で確認できますが、サーバー管理者がオーバーライドせずにグローバルに有効にしている場合、できることはあまりありません。

(もちろんアプリのすべてのページで)それがオンになっているかどうかを確認することをお勧めします。オンになっている場合は、データの破損を確実に回避するために、アプリケーションを迅速かつ痛烈に終了させます(主に、説明したバックスラッシュの急増として現れます)。

次に、選択した鈍器を持ってサーバー管理者の家に行きます。

うまくいけば、データベースが邪悪な自己増殖バックスラッシュの群れであふれてしまう前に、これらすべてを実行できることを願っています。

于 2011-01-03T21:57:53.747 に答える
0

データをエスケープした後に SQL コマンド内で二重引用符を使用する場合:

 SELECT "1\'2"

1\'2次に、バックスラッシュがそのままの状態で値を保存して返します。

SQL 文字列の正しい構文は、一重引用符を使用することです。mysql_real_escape_string逃げるのはそのためです。それ以外の場合は、二重引用符をエスケープする必要がありますが、その使用法は完全に認識されていません。

PHP では二重引用符を使用します。SQL には一重引用符を使用します。次のようにコードを書き直します。

 $x = escapy($x);
 $y = escapy($y);
 sql_query("INSERT INTO tbl (x,y) VALUES ('$x', '$y')");
于 2011-01-03T22:24:27.183 に答える