【问题标题】:PHP hashing input field namesPHP散列输入字段名称
【发布时间】:2012-05-11 12:50:43
【问题描述】:

我一直在阅读this blog post 和这个stack overflow post 但我对散列表单字段没有太多经验(蜜罐部分,网上似乎有很多例子)所以我有几个问题.

问题 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>

注册.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 属性确实如此。

【问题讨论】:

  • 哈希是一种方式,它们无法被解码
  • 解码是一个不好的词选择。我的意思是,将表单创建的哈希值与基于“检查”字段应该产生的名称进行比较。
  • 另外,在这个例子中我使用 md5 还是应该使用 SHA2 是否重要?
  • 想一想,也许对 #2 的(部分)答案是机器人根据他们认为是“first_name”“email”等等来填写该字段......所以如果名字是他们不认识的东西,他们不会填写?
  • 将密码保存在哈希中的好处是,即使您的数据库被盗,用户的密码仍然会受到保护,直到它们被暴力破解,但这可能需要很长时间。顺便说一句,你可以使用更高级的哈希,例如,两次哈希,使用不同的算法等等。

标签: php security md5


【解决方案1】:

在将字段名称发送到客户端之前,您需要在服务器端对其进行哈希处理:

<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. 攻击者可能会为“电子邮件字段”&lt;input type="text" name="0c83f57c786a0b4a39efab23731c7ebc" /&gt; 和隐藏的检查字段&lt;input type="hidden" name="2012/05/11 12:00:00" /&gt; 记录此信息
  4. 机器人随后会发布那些具有不同数据的相同字段。
  5. 这是触发“过去太远”检查的地方。该机器人会发布一个带有旧日期的时间戳表单,而您会拒绝它。

我希望这可以帮助您了解博客作者的意思。

【讨论】:

  • 嗯...那么...什么可以算作“过去太远了”...超过 1 天?
  • 甚至没有。我会用一两个小时之类的时间,这很慷慨
猜你喜欢
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2020-05-06
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 2017-08-22
相关资源
最近更新 更多