1

以下の例を検討してください: HTML Page :

<input type="text" name="update_12" />

名前が「update_12」、新しいテキストが「Some another data」の入力ボックスが、フォームを介してサーバーサイドの PHP スクリプト (たとえば、process.php) に送信されます。

データベース形式:

=====================
message_ID  Message
=====================
12         Some data
13         Another data

PHP スクリプトが入力名を次のように展開する場合:

foreach ($_POST as $key => $value) {
    if(strstr($key, "update_")){
        $required_id = explode('_',$key)[1];
        $query = "UPDATE <db_name> SET `Message`='".$_POST[$key]."' WHERE `message_id`='".$required_id."'";
    }
}

これにより、DB が message_ID : 12 の新しいメッセージで更新されます。

私は PHP を初めて使用し、MySQL での基本的なデータ ストレージ、更新、取得、および削除について調べています。

クライアントは入力フィールドの名前「name」を変更し、別の値を送信して更新できるためです。例: クライアントが firebug を開き、入力ボックスの「名前」フィールドを「update_13」に変更すると、その操作によって別のユーザーのメッセージが上書きされます。

Facebookでステータスの削除を試して、これを調査してみました。削除のための POST データの主な観察から、削除のためにいくつかの重要なパラメータが次のように送信されていることがわかりました。

impression_id=456ab622
profile_id=100005552221116
__user=100005552221116
story_fbid=540912345678911

投稿の削除の場合、関連する ID は次のようになります: story_fbid. これを次のように変更した場合: 540912345678912 (最後の桁が変更されました) そして [削除] をクリックすると、fb はしばらく時間がかかり、次のようなエラー メッセージで応答します: この操作は実行できません。このエラー メッセージは、削除するための POST リクエストが送信された後に表示されます (story_fbid を変更して)。POST 要求の応答には、モーダル ウィンドウに表示されるエラー メッセージが含まれています。

ID とそのハッシュ (MD5/SHA1/SHA2) を DB に格納し、ID を受け取ったらそのハッシュを取得し、一致する場合は DB のその行を更新する方法を考えることができます。ただし、(この場合) 13 のハッシュが他の行と一致し、更新操作が実行される可能性があります。

クライアントが値を変更していないことを検証できる安全な方法を他に提案できますか?

ここで尋ねられた質問に対する答えは、まさに私が探しているものです。ただし、その議論には適切な解決策/方法はありません。

4

1 に答える 1

1

独自の関数または組み込みの PHP 関数 uniqid() を使用して、一意の生成 ID (ID1) を作成できます。ユーザーセッションを開始し、ID1 とメッセージ ID(ID2) を以下のようにセッションに保存します。

session_start();
$ID1 = uniqid();
// store session data
$_SESSION['ID1']=$ID1;
$_SESSION['ID2']=$ID2;

生成された ID が「145f214」であるとします。フォームへの入力は次のようになります

<input type="text" name="update_145f214 />

フォームが送信されると、入力要素で ID1 を取得し、次を確認します。

  1. セッションの ID1 が同じ値の場合
  2. はいの場合は、SQL クエリのセッションに保存されている ID2 の値を使用します
  3. そうでない場合は、ユーザーにエラー メッセージを表示します。

これは非常に基本的な解決策ですが、そこから確実に改善されます。

多くのフィールドがあり、データのペアを使用する場合は、それらのペアと他のペアをセッションに保存する必要があります。

[12a:1][12b:2][12c:3] のようなデータを持つ 10 個のフィールドがあるとします。

フィールドの順序と対応するデータをセッション変数に保存できます。

$_SESSION['field1'] = [12a:1];

$_SESSION['field2'] = [12ba:2];

これもあるかもしれません

$_SESSION['fieldCount'] = 10;

生成したフィールドの数を確認するため

そこから、送信されたフィールドの数が生成したフィールドの数と同じかどうかを最初に確認できます。次に、セッション変数のデータと比較して、割り当てたペアがすべてのフィールドにあることを確認します (これは、順序が変更されたかどうかを確認するのにも役立ちます)。

同様のケースがあり、上記のソリューションを実装したため、これに戻りました。

ご希望があれば詳しくお伝えできます

于 2013-11-24T08:12:05.813 に答える