0

DB に入力する前に投稿が文字列である場合、投稿をエスケープするコードに取り組んでいますが、それは良い考えですか? コードは次のとおりです: (数値に更新)

static function securePosts(){
    $posts = array();
    foreach($_POST as $key => $val){
        if(!is_numeric($val)){
            if(is_string($val)){
                if(get_magic_quotes_gpc())
                    $val = stripslashes($val);
                $posts[$key] = mysql_real_escape_string($val);
            }
        }else
            $posts[$key] = $val;
    }   
    return $posts;
}

次に、他のファイルで:

if(isset($_POST)){
    $post = ChangeHandler::securePosts();
    if(isset($post['user'])){
        AddUserToDbOrWhatEver($post['user']);
    }

}

これは良いことですか、それとも関数に入力する前にエスケープすると悪い影響がありますか (addtodborwhater)

4

2 に答える 2

1

ユーザー入力を扱うときは、検証とエスケープを区別する必要があります。

検証

そこで、ユーザー入力の内容をテストします。数値が必要な場合は、これが実際に数値入力であるかどうかを確認します。検証はできるだけ早く行うことができます。検証が失敗した場合は、すぐに拒否してエラー メッセージを返すことができます。

逃げる

ここでは、特定のターゲット システムに損傷を与えることができないフォームにユーザー入力を取り込みます。エスケープはできるだけ遅く、特定のシステムに対してのみ行う必要があります。ユーザー入力をデータベースに保存する場合はmysqli_real_escape_string()、パラメーター化された PDO クエリなどの関数を使用します。後で HTML ページに出力したい場合は、htmlspecialchars().

ユーザー入力を予防的にエスケープしたり、複数のターゲット システムに対してエスケープしたりすることはお勧めできません。エスケープするたびに、他のターゲット システムの元の値が破損する可能性があり、この方法で情報が失われる可能性があります。

PS

YourCommonSense が正しく指摘したように、安全のためにエスケープ関数を使用するだけでは必ずしも十分ではありませんが、それはそれらを使用すべきではないという意味ではありません。多くの場合、文字エンコーディングはセキュリティ対策の落とし穴です。文字エンコーディングを明示的に宣言するのは良い習慣です。mysqli の場合、これは$db->set_charset('utf8');HTML ページで行うことができ、メタ タグで文字セットを宣言するのに役立ちます。

于 2013-01-24T14:25:34.743 に答える
0

データベースに何かを挿入するに、ユーザー入力をエスケープすることは常に良い考えです。ただし、数値であると予想される値を整数 (符号付きまたは符号なし) に変換することも試みてください。または、準備済みの SQL ステートメントを使用する必要があります。後者については、ここと PHP ドキュメントに多くの情報があります。

于 2013-01-24T12:54:35.053 に答える