PHP哈希输入字段名称

red*_*ory 1 php security md5

我一直在阅读这篇博文和这个堆栈溢出帖子,但我对散列表单字段没有太多经验(蜜罐部分,网上似乎有很多例子)所以我有几个问题.

问题1

它是这样的还是我离开基地?(注意,这是一个简化的例子,只是简洁的时间戳)

表格上的PHP:

$time = mktime(); 
$first_name = md5($time + 'first_name'); 
Run Code Online (Sandbox Code Playgroud)

表单上的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>
Run Code Online (Sandbox Code Playgroud)

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

问题2:

字段名称的散列如何使事情更安全?我得到了时间戳检查(虽然我不明白博客文章中的部分"过去太远了......"如果有什么事情,机器人不会填写它太快了吗?)但我不确定是什么哈希name属性完全正确.

Sup*_*Dud 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>
Run Code Online (Sandbox Code Playgroud)

这将随机化字段的名称.在发布数据时在服务器上,您需要重新散列字段名称以查找正确的后置变量:

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

该博客的作者说这是一种防止重放攻击的方法.我认为这个想法有一些优点,以下是它的工作原理:

  1. 攻击者可以访问您的站点,并手动填写表单,记录您的所有字段名称.
  2. 然后,他会将记录的字段名称输入到他的机器人中,然后对机器人进行编程,以便稍后重新填写表单.
  3. 攻击者可能会为"电子邮件字段" <input type="text" name="0c83f57c786a0b4a39efab23731c7ebc" />和隐藏的检查字段记录此信息<input type="hidden" name="2012/05/11 12:00:00" />
  4. 然后机器人将使用不同的数据发布那些相同的字段.
  5. 这是您的"过去太远"检查将被触发的地方.机器人将发布带有旧日期的带时间戳的表单,您将拒绝它.

我希望这可以帮助您了解博客作者的目标.