Php 验证和存储密码的问题
我最近在我的注册页面中添加了密码加密 注册页摘录:Php 验证和存储密码的问题,php,mysqli,Php,Mysqli,我最近在我的注册页面中添加了密码加密 注册页摘录: $hashed_password = crypt('pass1'); mysqli_query($mysqli, "INSERT INTO Persons (Username, Password, Email, Gender) VALUES ('$euser', '$hashed_password', '$eemail', '$gender')"); 这很好,据我所知,所有数据都正确地输入到数据库中 但登录页面不验证表单 登录页面提取 if
$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);
}
}
}
这似乎不起作用。我也不明白为什么?有人知道吗
如果用户名和密码字段为空,唯一能起作用的就是错误消息
编辑:
假设密码是测试的,我输入了测试页面来验证它,所以登录页面只返回背景
如果我输入其他内容,也会出现同样的问题
编辑:
添加了中的所有支持。但是仍然没有运气$has_pass=crypt'$password'
您试图在单引号内插入变量。只用
crypt$密码 除了其他答案所指出的关于地穴的bug之外
$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,但我故意将其作为您的家庭作业:您必须向crypt提供原始salt 编辑:您需要将数据库句柄传递给mysqli\u查询。比如:
$result = mysqli_query($mysqli, "SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");
尝试将mysqli handle添加为mysqli_real_escape_字符串的第一个参数,并检查您是否得到一行-mysqli_real_esacpe_string$handle,$string这看起来像是一个调试案例,而不是堆栈溢出问题。您有哪些输入值,以及在比较它们时会发生什么?如果您能给出一个示例,那就太好了。您是否有任何MySQL错误?使用mysql\u error并检查您的mysqli\u查询是否错误。看我的编辑。不确定“插值”这个词是否正确,尽管我觉得它很酷。。。字符串插值是一种准引号形式,在许多编程语言中很常见,这些语言大量使用数据的字符串表示形式,如Ruby、PHP、Perl等。它意味着插入字符串或用其值替换变量。它使字符串格式设置和指定内容更加直观。添加了,但仍然没有成功:
$has_pass = crypt($password, $row['password']);
$result = mysqli_query($mysqli, "SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");