2012-05-11 84 views
1

我一直在閱讀this blog post和這個stack overflow post但我沒有太多的哈希表單字段的經驗(蜜罐部分,網上似乎有很多例子)所以我有幾個的問題。PHP哈希輸入字段名稱

問題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屬性確實如此。

+0

哈希是一種方式,它們不能被解碼 – SupremeDud

+0

解碼是一個糟糕的詞的選擇。我的意思是,比較所創建的表單與應該根據「檢查」字段生成的名稱的哈希值。 – redconservatory

+0

另外,這個例子中我使用md5還是應該使用SHA2? – redconservatory

回答

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> 

這將隨機化字段的名稱。在當數據發佈服務器,你需要重新哈希值的字段名稱來找到正確的POST變量:

<? 
    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. 這是您的「過去太遠」檢查會觸發的地方。機器人會發布帶有舊日期的時間戳,並且會拒絕它。

我希望這可以幫助您瞭解博客作者正在獲取的內容。

+0

哇,這說明我非常感謝你! – redconservatory

+0

嗯所以......什麼可以稱爲「過去太遠」......超過1天? – redconservatory

+0

甚至沒有。我會用一個小時或2小時,這是慷慨的 – SupremeDud