以下の例を検討してください: 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 のハッシュが他の行と一致し、更新操作が実行される可能性があります。
クライアントが値を変更していないことを検証できる安全な方法を他に提案できますか?
ここで尋ねられた質問に対する答えは、まさに私が探しているものです。ただし、その議論には適切な解決策/方法はありません。