【发布时间】: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”等等来填写该字段......所以如果名字是他们不认识的东西,他们不会填写?
-
将密码保存在哈希中的好处是,即使您的数据库被盗,用户的密码仍然会受到保护,直到它们被暴力破解,但这可能需要很长时间。顺便说一句,你可以使用更高级的哈希,例如,两次哈希,使用不同的算法等等。