2

PHP と MySQL を使用して、コメント付きのシンプルなニュース システムを作成しました。これは、Fedora 10 マシンと Windows 7 マシンの両方で、ローカルの Apache サーバーでうまく機能しました。問題が発生しましたが、Web ホストにアップロードしましたが、すべての ' と " を \' と \" として返し続けます。

これは、セキュリティ上の理由でそれらを自動的に追加する Web ホストであるか、MySQL が間違った照合であると考えていますが、まだ解決できておらず、複数の MySQL 照合をテストしています。

クエリの例を次に示します。

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error());

$timeistime(); $newstitle$newstextare parsed fromであり、クエリを実行$_POSTする前に両方が実行さmysql_real_escape_string()れます (これが問題である可能性がありますが、セキュリティの一部であるため、削除したくありません。また、問題が発生しなかったためです)私のローカルサーバー上)

最後のメモとして: 私のローカル Apache サーバーlatin1_swedish_ciでは、Web ホスト サーバーでは機能しませんでした。

編集:

データベースでは次のようになります。

\'\'\'\"\"\"

私のローカルのものには余分なバックスラッシュがありませんでしたので、それを追加するのはPHPである必要があります。余分なバックスラッシュを削除する関数を追加する以外に、これを解決する方法はありますか?

4

7 に答える 7

7

これらの追加の円記号は、おそらくMagicQuotesです。データを処理する前に、それらを無効にするか削除してみてください。

于 2009-05-14T19:05:10.567 に答える
4

編集:以下で数回言及されているように、そしてコメントで、これを行う正しい方法は、魔法の引用符を無効にすることです。返信する前に質問を完全に読んで理解していたら、おそらくそれはもっと良かったでしょう;)


mysql_real_escape_string()それが言うことを実行し、文字列内の関連する文字をエスケープします。引用符のエスケープは、エスケープ文字(PHPや他の多くの言語ではバックスラッシュ)を前に付けることによって行われます。 データベースからデータをプルバックするときは、コンテンツに対してrun stripslashes()PHPドキュメントを参照)などを実行して、引用符などからスラッシュを削除します。

編集:Gumboが述べたように、サーバーでMagicQuotesが有効になっていることが原因である可能性もあります。彼の答えに従ってこれらを無効にする必要があります。

于 2009-05-14T19:03:13.847 に答える
4

いいえ、stripslashes()を実行する必要はありません。むしろ、サーバーを適切にセットアップしてください。

まず、magic_quotesをオフにします。これは、スクリプトに入るデータには何もエスケープされないことを意味します。

次に、データに対してmysql_real_escape_string()を実行します。これにより、クエリのスラッシュのみが追加され、スラッシュなしでデータベースにデータが保存されます。

データを再度ロードするときは、問題なく使用でき、引用符の前後に円記号はありません。

于 2009-05-14T19:06:46.147 に答える
2

ホストでMagicQuotesが有効になっている可能性があります。

于 2009-05-14T19:06:21.373 に答える
2

magic_quotes_gpcを見てください。.htaccessを介してこれをオフにし、mysql_real_escape_string()を使用できます。

于 2009-05-14T19:06:27.647 に答える
-1

本当の解決策は、挿入クエリで準備済みステートメントを使用することです。

これは、上部に挿入例があるサイトです。

PHP のプリペアド ステートメント

利点は、これがベスト プラクティスであることであり、副作用は、SQL インジェクション攻撃に対する入力のクレンジングについて心配する必要がなくなることです。

于 2009-05-14T20:46:22.150 に答える