2

私はPHP/SQLの専門家ではありませんが、SQLINSERTを保護するためにmysql_real_escape_stringを適用する必要があることを発見しました。

私はネット上で見つけたいくつかのアドバイスを使って関数を作りました、ここにそれがあります:

function secure($string)
{
if(is_numeric($string)) 
    { $string = intval($string); }
    elseif (is_array($string)) 
    {
        foreach ($string as $key => $value) {
            $string[$key] = secure($value);
        }
    } 
    else if ($string === null) 
    {
        $string = 'NULL';
    }
    elseif (is_bool($string)) 
    {
        $string = $string ? 1 : 0;
    } 
    else 
    {
        if (get_magic_quotes_gpc()) { $value = stripslashes($string); } 
        $string = mysql_real_escape_string($string);
        $string = addcslashes($string, '%_');
    }
    return $string;
}

テーブルの内容を見ると、バックスラッシュが含まれています。そして論理的には、データを取得するときに、これらのバックスラッシュを削除するためにストリップスラッシュを適用する必要があります。

マジッククォートはオフです。

質問1) SQL挿入前にデータを保護するためにmysql_real_escape_stringを使用しても、コンテンツにバックスラッシュが表示されるべきではないと思いますか?これを確認できますか?

質問2) 正常でない場合、これらのバックスラッシュがphpMyAdminのコンテンツと取得に表示されるのはなぜですか?私は何を間違えましたか?

質問3) mysql_real_escape_stringは2回適用できると思いますが、そうではありませんか?もしそうなら、mysql_real_escape_stringが同じ文字列に何度も適用され、多くの\\が同じエスケープ可能な文字につながるのを防ぐための関数は何でしょうか?

ご入力いただきありがとうございます。

4

4 に答える 4

1

あなたのストリップスラッシュは、代わりに$string間違った変数に保存されます:$value$string

if (get_magic_quotes_gpc()) { $value = stripslashes($string); } 

する必要があります

if (get_magic_quotes_gpc()) { $string = stripslashes($string); }
于 2011-02-12T19:28:26.410 に答える
1

ああ、なんて無意味な機能でしょう。それはあなたのせいではなく、愚かな記事や回答で書いた人のせいだと思います.

それを取り除き、mysql_real_escape_string のみを使用して文字列をエスケープします。

あなたはすべてを混同しました。

  • まず、データベースのエスケープ関数に魔法の引用符が存在しないようにする必要があります。
    魔法の引用符を取り除きたい場合は、データベースを処理するかどうかに関係なく、すべてのスクリプトの最上部で一元化してください。

  • この関数のほとんどのチェックは役に立ちません。たとえば is_bool です。PHP は同じ方法で変換します。このためのコードを記述する必要はありません。

  • LIKE 関連のエスケープはまったく別の問題であり、安全性とは何の関係もありません。

  • 数値チェックは何の役にも立たないため、まったく役に立ちません。

また、文字列のエスケープはセキュリティとは何の関係もないことに注意してください。 I は単なる構文規則です。すべての文字列はエスケープする必要があります。その起源やその他のものは関係ありません。厳密なルール:文字列をクエリに配置するたびに、引用符で囲んでエスケープする必要があります。(そしてもちろん、引用せずにエスケープするだけなら、何の役にも立たない)

そして、クエリの他の部分について話すときだけ、SQL インジェクションの問題が発生します。この問題に関する完全なガイドについては、私の以前の回答を参照してください: In PHP when submit strings to the database to the database should I care of illegal characters using htmlspecialchars() or use a regular expression?

于 2011-02-12T19:39:01.373 に答える
0

すべてのコードからaddslashesを完全に削除します。これが、スラッシュがデータベースに挿入される主な原因です。

function escape($string) {
    if (get_magic_quotes_gpc()) {
        $string = stripslashes($string);    
    }
    return mysql_real_escape_string($string); 
}

ストリップスラッシュを実行してデータをエスケープする場合は、magic_quotes_gpcが有効になっているかどうかを常に確認してください。

Escaped="addslashesを使用しないでください"

データベースに入ると、「\」が削除されます。

于 2011-02-12T19:36:48.073 に答える
0

mysql_real_escape_string を複数回呼び出していませんか?エスケープ可能な文字で呼び出すたびに、スラッシュがどんどん追加されます。一度だけ呼び出したい。また、なぜ addcslashes も呼び出しているのですか? mysql_real_escape_string で十分です。一度だけ呼び出す場合は、データベースからデータを取得した後、データに対してストリップスラッシュを呼び出す必要はありません。

mysql_real_escape_string が複数回適用されているかどうかはわかりません。戻ってコードを注意深く読み直すことをお勧めします。値が db に挿入される直前に値をデバッグ出力してみて、斬った」。

ところで、(mysqli などを介して) 準備済みステートメントを使用している場合、文字列をエスケープする必要はありません。DB エンジンがこれを行いますが、これも問題になる可能性があります。

于 2011-02-12T19:29:33.007 に答える