1

私はこのブログ投稿とこのスタック オーバーフローの投稿を読んでいますが、フォーム フィールドのハッシュの経験があまりありません (ハニーポットの部分、Web には多くの例があるようです)。そこでいくつか質問があります。

質問1

それはこのようなものですか、それとも私はベースから外れていますか?(注: これは、簡潔にするためにタイムスタンプのみを使用した単純化された例です)

フォーム上の PHP:

$time = mktime(); 
$first_name = md5($time + 'first_name'); 

フォーム上の HTML:

<form action="register.php" method="post">
<input type="text" name="<?php echo $first_name ?>" >
<input type="hidden" name="check" value="<?php echo $time ?>" >
<input type="submit" name="register">
</form>

Register.php

// check to see if there is a timestamp
if (isset($_POST['check'])) {
    $time = strtotime($_POST['check']);

    if (time() < $time) {
    // original timestamp is in the future, this is wrong
    }

    if (time() - $time < 60) {
    // form was filled out too fast, less than 1 minute?
    }

    // otherwise
    $key = $_POST['check'];

    if (md5($key + 'first_name') == $_POST['whatever-the-hash-on-the-first_name-field-was']) {
        // process first_name field?
    }
}

質問2:

フィールド名のハッシュはどのように物事をより安全にしますか? タイムスタンプのチェックを取得します (ただし、ブログ投稿の「過去が遠すぎる」という部分は理解できません... ボットがあまりにも速く入力するのではないでしょうか??) しかし、どのようなハッシュが行われているのかわかりませんname 属性は正確に行います。

4

1 に答える 1

6

フィールド名をクライアントに送信する前に、サーバー側でフィールド名をハッシュする必要があります。

<form action="register.php" method="post">
<? $timestamp = time() ?>
<!-- This is where the user would put the email. Don't put this comment in for real -->
<input type="text" name="<?php echo md5("email" . $timestamp . $secretKey) ?>" >
<input type="hidden" name="check" value="<?php echo $timestamp ?>" >
<input type="submit" name="register">
</form>

これにより、フィールドの名前がランダム化されます。サーバーでは、データが投稿されたときに、フィールド名を再ハッシュして正しい投稿変数を見つける必要があります。

<?
    if (isset($_POST['check'])) {
        $email = $_POST[md5("email" . $_POST['check'] . $secretKey)];
    }
?>

ブログの著者は、これがリプレイ攻撃を防ぐ方法だと述べています。このアイデアにはいくつかのメリットがあると思います。これがどのように機能するかを示します。

  1. 攻撃者はサイトにアクセスし、手動でフォームに入力し、すべてのフィールド名を記録します。
  2. 次に、記録されたフィールド名をボットに入力し、後でフォームに再入力するようにボットをプログラムします。
  3. 攻撃者は、これを「メール フィールド」<input type="text" name="0c83f57c786a0b4a39efab23731c7ebc" />および非表示のチェック フィールドに記録する可能性があります。<input type="hidden" name="2012/05/11 12:00:00" />
  4. 次に、ボットはまったく同じフィールドを異なるデータで投稿します。
  5. これは、「過去が遠すぎる」チェックがトリガーされる場所です。ボットは古い日付のタイムスタンプ付きフォームを投稿し、あなたはそれを拒否します。

これが、ブログの著者が何を目指していたのかを理解するのに役立つことを願っています.

于 2012-05-11T13:14:19.173 に答える