我有一个网站,某些区域/功能仅供经过身份验证的用户使用。有些用户在网站出现之前就存在了,目前有活跃的订阅。因此,他们的信息(必然)存在于数据库中,但这些帐户不应该被任何人访问 - 甚至是他们所属的用户 - 直到他们验证他们的信息,通过带有散列参数的电子邮件接收链接,并设置他们的密码。
所以:我想将这些用户存储在Users
表中,但我不希望他们能够立即登录该网站。
目前,我的数据库设置如下:
Table: Users
email | password | salt
------------+------------------+----------------
User1 | | // password and salt are
User2 | | // empty strings, not NULL
User3 | md5(pass + salt) | rand(10-digits)
User4 | md5(pass + salt) | rand(10-digits)
Table: Non-Registered Users
email | identify1 | identify2
------------+------------------+----------------
User1 | secret1a | secret1b
User2 | secret2a | secret2b
和我的accessControl.php一样,为了简洁起见,还有一些伪代码:
<?php
session_start();
if(isset($_POST['email']) && isset($_POST['password']) {
$sql1 = "SELECT salt FROM Users WHERE email = :email";
.... // prepare and execute
if (!empty($result1)) {
$hash = sha2($password.$result1['salt'],256);
$sql2 = "SELECT * FROM Users WHERE password = :hash AND email = :email";
.... // prepare and execute
if(!empty($result2)) {
$_SESSION['email'] = $_POST['email'];
$_SESSION['password'] = $_POST['password'];
}
}
} elseif(isset($_SESSION['email'] && isset($_SESSION['password'])) {
// do pretty much the same check as above
} else {
// force login
}
?>
所以,我的问题是:未注册的用户是否可以在不先设置密码的情况下登录?将空白字段与任何的SHA256匹配是不可能的,对吧?我担心我会忽略一些显而易见的事情。
请,谢谢! :3
答案 0 :(得分:1)
SHA256将始终具有256位,因此它永远不会匹配空字符串。话虽这么说,你的伪代码并没有完全描述你如何验证用户输入,所以你仍然可能容易受到SQL注入攻击。