1

次のようなさまざまなフォームで機能する送信コードが欲しいのですが。

<?php 
 $type = $_GET['type'];
 if(isset($_SESSION['id']))
  handle_form();
 else 
  include 'form_'.$type.'.php'; // different fields based upon type
?>

したがって、すべてのキーと値をデータベースに書き込むスーパーグローバル$_POSTをループするのが賢明かどうか疑問に思いました。何かのようなもの:

<?php 
 function handle_form() {
 $query = "";
 foreach($_POST as $key => $value) {
  $query .= mysql_real_escape_string($key)."='".mysql_real_escape_string($value)."' AND ";
 }
 mysql_query("UPDATE ".$_POST['type']." SET ".substr($query,0,-4)."WHERE `id` = $_SESSION['id']");
 }
?>

または、これはフォームを処理するための非常に安全でないアプローチであり、対応する「form_type.php」のすべてのフィールドをハードコーディングする方がよいでしょうか。

4

3 に答える 3

4

列に対応しない余分な POST フィールドがあると、クエリが壊れてしまうため、これは非常に悪い考えです。独自のコードは$_POST['type']、更新するテーブルを決定するために使用しますが、事前に設定を解除しない限り、これも壊れます。

また、実際に DB に送信されるデータに対して検証を行っていません。自分の名前/権限を管理者に変更しますか? もちろん。別のユーザーの電子メールを自分のものに変更しますか? どうぞ。アカウントの残高を +100,000$ にしますか? 問題ない。商品を「価格 $1」とマークしますか? うん。

ある種のActive Recordを持つ方がはるかに賢明です。大規模なアプリケーションを作成している場合は、Yii や Cake PHP などのフレームワークを調べてください。フレームワークにはそのような機能が組み込まれています。


それはさておき: 古い mysql_* 関数を使って新しいコードを書くのはやめてください。それらはもはや保守されておらず、コミュニティは非推奨プロセスを開始しています。代わりに、準備済みステートメントについて学び、PDOまたはMySQLiのいずれかを使用する必要があります。学習したい場合は、ここに PDO 関連の非常に優れたチュートリアルがあります。

于 2012-05-20T12:45:14.893 に答える
2

コード インジェクションの危険性があるため、信頼できない外部ソースから取得したものはすべて、データベースやその他の場所に安全に挿入できません。データベースの場合、SQL インジェクションのリスクがあります。入力をサニタイズする必要があります。これは、スーパーグローバルだけでなく、Web サービスなど、ユーザーが制御しないその他のデータにも適用されます。

を使用してデータをエスケープすることmysql_real_escape_stringは最低限必要なことですが、すべてのインジェクション攻撃から保護できるわけではありません。これは純粋に構文的なものであり、構文的に正しいデータ値の改ざんを検出することはできません。

それとは別に、ext/mysql を使用するべきではありません。これは時代遅れであり、廃止される予定ですext/mysqliまたはPDOを使用し、準備済みステートメントを使用します。

于 2012-05-20T12:42:45.410 に答える
0

これは潜在的な悪夢です。ユーザーを決して信用しないでください。

各 $_POST パラメータは、次のように調べる必要があります。

  • 受け入れられるパラメーターのホワイトリストの一部ですか?
  • 正しいデータ型または値の範囲ですか?

次に、単純な mysql_query() 呼び出しではなく、Prepared Statementsを使用してください。

于 2012-05-20T12:44:17.373 に答える