12

私はちょうど新しいホスティング会社に引っ越しました、そして今、文字列がエスケープされるときはいつでも:

mysql_real_escape_string($str);

スラッシュはデータベースに残ります。これが起こるのを私が見たのはこれが初めてなので、私のスクリプトはどれも使用しません

stripslashes()

もう。

これは、lighttpd1.4サーバーでfastcgiとしてphp5.2.6を実行しているCentOS4.564ビット上にあります。すべてのmagic_quotesオプションがオフになっていて、mysqlクライアントAPIが5.0.51aであることを確認しました。

6つのWebサーバーすべてで同じ問題が発生します。

どんな助けでもいただければ幸いです。

ありがとう。

編集:

MagicQuotesはオンになっていません。オフにすることはお勧めしません。これは問題ではありません。

4

9 に答える 9

16

移動したホストのmagic_quotes_runtime電源が入っている可能性があります。でオフにできますset_magic_quotes_runtime(0)

をオフmagic_quotes_runtimeにしてから、文字列エスケープを使用するのではなく、バインド変数を使用するようにコードを変更してください。

于 2008-10-06T05:00:22.650 に答える
2

魔法の引用符がオンになっているように聞こえます。オフにするのはそれほど難しいことではありません。ルート ディレクトリにファイルを作成し、次の.htaccess行を入れます。

php_flag magic_quotes off

なんらかの理由でそれが不可能な場合、またはマジック クォートを処理できるようにアプリケーションを変更したい場合は、次の手法を使用します。

リクエスト変数に直接アクセスする代わりに、関数を使用してください。その関数は、魔法の引用符がオンかオフかを確認し、それに応じてスラッシュを取り除くことができます。すべてに対して単純に stripslashes() を実行しても機能しません。実際に必要なスラッシュを削除してしまうからです。

function getVar($key) {
    if (get_magic_quotes_gpc()) {
        return stripslashes($_POST[$key]);
    } else {
        return $_POST[$key];
    }
}

$x = getVar('x');

これで、すべての着信変数を再びエスケープする準備が整い、mysql_real_escape_string()それらを詰め込むことはありません。

于 2008-10-06T06:50:39.933 に答える
2

スラッシュはデータベースに残ります。

これは、データが二重にエスケープされることを意味します。

考えられる理由は 2 つあります。

  1. あなたの気持ちにもかかわらず、魔法の引用符がオンになっています。再確認してください

  2. アプリケーションには、すべての入力をエスケープして、魔法の引用符の動作を模倣するコードがいくつかあります。
    これは、すべての着信データを「保護」するための一般的なエスケープ機能があるという非常に一般的な誤解です。それはまったく役に立ちませんが、このような場合にも責任があります。
    そのため、その機能を見つけて消去してください。

于 2013-01-11T09:12:16.060 に答える
0

mysql_real_escape_string()同じ変数で複数回使用すると、何が問題になる可能性がありますか (それは私たちにありました) 。複数回使用すると、スラッシュが追加されます。

于 2013-01-11T09:28:55.907 に答える
0

おそらく、魔法の引用符がオンになっている必要があります。これをオフにする方法を正確に理解することは、PHP ではかなりの頭痛の種になる可能性があります。でマジック クォートをオフにすることはできますがset_magic_quotes_runtime(0)、それだけでは十分ではありません。マジック クォートはこの時点で入力データを変更しているため、変更を元に戻す必要があります。このスニペットを試してください: http://talks.php.net/show/php-best-practices/26

またはさらに良いことに - でマジッククォートを無効にしphp.ini、それが設定されている可能性のある .htaccess ファイルを無効にします。

于 2008-10-06T19:56:11.017 に答える
0

問題を正しく理解しているかどうかはわかりませんが、まったく同じ問題がありました。何をしても、文字列がエスケープされたときにスラッシュがありました。挿入された値が入力されたのとまったく同じ形式である必要があるため、使用しました

htmlentities($inserted_value)

これにより、挿入されたすべての引用符がエスケープされずに残りますが、害はありません。

于 2012-09-12T17:26:15.457 に答える
-1

以下の関数は、データベースに挿入する前にスラッシュを正しく削除します。魔法の引用符がオンになっていないと言っていましたが、何かがスラッシュを追加しているので、次のページを試して出力を確認してください。場所を特定するのに役立ちます。page.php?var=something-with'data_that;will`be|escaped で呼び出す

ほとんどの場合、3 番が必要以上のスラッシュを出力していることがわかります。

*データベースの詳細も変更します。

<?php

$db = mysql_connect('host', 'user', 'pass');

$var = $_REQUEST['var'];
echo "1: $var :1<br />";
echo "2: ".stripslashes($var)." :2<br />";
echo "3: ".mysql_real_escape_string($var)." :3<br />";
echo "4: ".quote_smart($var)." :4<br />";


function quote_smart($value)
{
    // Stripslashes is gpc on
    if (get_magic_quotes_gpc())
    {
        $value = stripslashes($value);
    }
    // Quote if not a number or a numeric string
    if ( !is_numeric($value) )
    {
        $value = mysql_real_escape_string($value);
    }
    return $value;
}

?>

于 2009-05-01T19:27:53.113 に答える
-4

mysql_real_escape_string($str);まさにそれを行うことになっています。特にクエリを mysql に渡したい場合は、バックスラッシュを特殊文字に追加することを意図しています。mysql の文字セットも考慮されていることに注意してください。

より安全なコーディング プラクティスとして、コードを編集し、 を使用stripslashes()してデータを読み取り、スラッシュを削除することをお勧めします。

于 2008-10-06T04:57:32.140 に答える