0

サイトを構築するために大量のユーザー入力を使用する、しばらくの間実行されているサイトがあります。当然、サイトには数十のフォームがあります。サイトを構築するとき、どのレコードを更新すればよいかがわかるように、非表示のフォーム フィールドを使用してサーバーにデータを返すことがよくありました。

例は次のとおりです。 <input type="hidden" name="id" value="132" /> <input type="text" name="total_price" value="15.02" />

フォームが送信されると、これらの値がサーバーに渡され、渡されたデータに基づいてレコードを更新します (つまり、レコード 132 の価格は 15.02 に変更されます)。

私は最近、firebug のような単純な方法で属性と値を変更できることを知りました。だから...私はfirebugを開き、ID値を「155」に、価格値を「0.00」に変更してから、フォームを送信します。ビオラ!サイトで製品番号 155 を表示すると、現在 $0.00 と表示されています。これは私に関係があります。

クエリ文字列 (簡単に変更できます) または ID をサーバーに渡す非表示の入力要素を使用せずに、どのレコードを更新するかを知るにはどうすればよいですか?

そして、より良い方法がない場合 (この方法でデータを渡す文字通り何千もの Web サイトを見てきました)、ユーザーがこれらの値を変更した場合にサーバー側のデータが実行されないようにするにはどうすればよいでしょうか (または何か問題を解決するのに似ています)?

IDを暗号化してから反対側で復号化することを考えましたが、それでも誰かがIDを変更して、たまたまデータベース内の別のIDと一致するものを取得することから私を守ることはできません.

Cookie についても考えましたが、それらも操作できると聞きました。

何か案は?これは私にとって大きなセキュリティリスクのようです。

4

2 に答える 2

4

送信するデータを制御しようとしないでください(制御できないため)。

送信を行っているユーザーが、トリガーされる変更を行う権利を持っていることを確認してください。

たとえば、IDを155に、価格を0.00に変更する場合は、レコード155を更新し、価格を0.00に設定する権限があることを確認してください。

于 2012-04-05T23:19:09.317 に答える
4

$_SERVER['HTTP_REFERER']次のような方法で機密性の高いページを確認することをお勧めします。

if ($_SERVER['HTTP_REFERER'] !== "previous_page.php") {
 header("Location: error_page.php");
 session_destroy();
 exit;
}

しかし、これは完全な証拠ではありません。攻撃者が previous_page.php にいる場合、保護しようとしているページを参照するだけで済むため、さらなる保護が必要です。

トークン システムを実装できます (実装する必要があります)。フォーム ページに、次の PHP コードを追加します。

$_SESSION['token'] = md5(uniqid(rand(), TRUE));
$token = $_SESSION['token'];

そして、フォーム内のどこかに次を追加します。

<input type="hidden" name="token" value="<?php echo $token; ?>"/>

これにより、そのページを閲覧しているユーザーに固有の長い文字列が生成されます。これを行うポイントは、このセッション変数を $_POST 変数として次のページに渡し、受信ページで を と比較し$_POSTて、$_SESSIONそれらが互いに等しいことを確認することです。これは、受信ページで次のように行われます。

$token = $_SESSION['token']; //re declaring your session variable

if ($_POST['token'] !== $_SESSION['token']) {
 header("Location: error_page.php");
 session_destroy();
 exit;
}

「CSRF偽造」についてさらに調査することをお勧めします。これがあなたを正しい方向に導くことを願っています。

于 2012-04-05T23:52:20.730 に答える