1

$_POST 変数の束が長い形式で送信されていますが、それぞれをハードコーディングする代わりにmysql_escape_string()、次のことを行っても問題ありませんか? これが実際に安全で実行可能なコードであるかどうかはわかりません。

foreach ($_POST as &$post_item){
    $post_item = mysql_escape_string($post_item);
}

& を使用しているため、値ではなく参照によって渡されているため、実際に $_POST の値を変更していることは確かです。

また、mysql_real_escape_string()代わりに使用する必要がありますか?

編集:上記の方法とともに PDO と prepare() を使用しています。これで対応してくれますか?

4

3 に答える 3

10

なぜ使用しないのarray_map()ですか?

array_map(mysql_real_escape_string, $_POST);

しかし実際には、パラメータ化された/準備されたステートメントを使用する必要があります。

mysql_real_escape_string()現在のデータベース文字セットを考慮しますが、考慮mysql_escape_string()しません。したがって、比較すると前者の方が優れています。

編集(質問に対するOPの編集をフォローアップ):

すでに PDO 準備済みステートメントを実行しているため、値を変更する必要はありません。PDOはすべてを処理します。それがすべてのポイントです(実際にすべてのデータをパラメーターに入れると、つまり、文字列を連結してSQLステートメントを構築するだけで、PDOの有無にかかわらず災害が発生します)。事前に値をエスケープすると、データベースで値がエスケープされます。

于 2009-04-17T05:37:55.750 に答える
3

はい、mysql_real_escape_string()そのルートに行く場合は、を使用する必要があります。しかし、変数が安全にデータベースに送信されることを確認する正しい方法は、PHP でmysqli関数またはPDOを介して提供されるパラメーター化されたクエリを使用することです。

于 2009-04-17T05:41:22.527 に答える
1

前のコメントに加えて、パラメーター化されたクエリを使用するもう 1 つの利点は、データベースがより適切に最適化を行い、おそらくキャッシュされたクエリ プランを使用できるため、パフォーマンスが向上することです。

于 2009-04-17T05:47:18.083 に答える