我最近在注册页面中为我的密码添加了加密。
注册页面提取:
$hashed_password = crypt('pass1');
mysqli_query($mysqli, "INSERT INTO Persons (Username, Password, Email, Gender) VALUES ('$euser', '$hashed_password', '$eemail', '$gender')");
这很好,据我所知,所有数据都在数据库中正确输入。
登录页面不会验证表单。
登录页面提取
if( $page_mode == 'Login' )
{
$username = $_POST['username'];
$password = $_POST['password'];
if( trim($username) == '' || trim($password) == '' )
{
$error_string .= '<font color=red>You have left either the username or password field blank!</font>';
}
else
{
require "globe.php";
$result = mysqli_query("SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");
$has_pass = crypt($password, $row['Password']);
if( !($row = mysqli_fetch_assoc($result)) || ($row['Password'] != $has_pass) )
{
$error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
}
else
{
$error_string .= '<font color=red>login not ready </font> ';
mysqli_close($mysqli);
}
}
}
似乎没有检查它。我不明白为什么?任何人都知道
如果用户名和密码字段为空,则唯一可行的是错误消息。
编辑:
假设密码是“测试”,我输入测试页面验证它(也是登录页面)只返回背景。
如果我输入任何其他内容,也会出现同样的问题。
编辑:
添加了所有支持。但仍然没有运气
答案 0 :(得分:3)
$has_pass = crypt('$password');
您尝试在单引号内插入变量。只需使用
crypt($password);
答案 1 :(得分:1)
除了crypt()
之外的其他答案指出的错误,而不是
$mysqli_query(...
写
mysqli_query(...
更不用说你有条件地关闭mysqli连接,而你应该总是关闭它。
修改强>
试试这个
if( $page_mode == 'Login' )
{
$username = trim($_POST['username']);
$password = trim($_POST['password']);
if( ($username == '') || ($password == '') ) {
$error_string .= '<font color=red>You have left either the username or password field blank!</font>';
} else {
require "globe.php";
$query = sprintf("SELECT PlayerID, Username, Password FROM Persons WHERE Username='%s' LIMIT 1",
mysqli_real_escape_string($mysqli, $username) );
$result = mysqli_query( $query );
if( ($result !== false) && (mysqli_num_rows($result) == 1) ) {
$row = mysqli_fetch_assoc($result);
if( $row['Password'] != crypt($password, $row['Password']) ) {
$error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
} else {
// OK
}
} else {
$error_string .= '<font color=red>Please try again</font> ';
}
mysqli_close($mysqli);
}
}
您仍然需要检查$result
以确保查询成功,以及$row
以确保该用户可以输入密码的salf,但我故意将其作为您的作业:)
答案 2 :(得分:1)
您必须向crypt
提供原始盐。
$has_pass = crypt($password, $row['password']);
编辑:您需要将数据库句柄传递给mysqli_query
。类似的东西:
$result = mysqli_query($mysqli, "SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");
答案 3 :(得分:0)
尝试添加mysqli handle作为mysqli_real_escape_string的第一个参数,并检查你得到一行 - mysqli_real_esacpe_string($ handle,$ string)