PHP登录系统密码不匹配
我已经建立了一个登录系统,允许用户使用之前定义的电子邮件和密码登录,但是在测试部分,我注意到密码说他们不匹配,尽管我知道他们是正确的,因为我写下了测试一,因为我做了。我似乎不明白为什么会发生这种情况,我想这可能与我对密码的哈希有关,但我不知道是什么原因。登录页面检查来自文档login.php:PHP登录系统密码不匹配,php,mysql,hash,login,Php,Mysql,Hash,Login,我已经建立了一个登录系统,允许用户使用之前定义的电子邮件和密码登录,但是在测试部分,我注意到密码说他们不匹配,尽管我知道他们是正确的,因为我写下了测试一,因为我做了。我似乎不明白为什么会发生这种情况,我想这可能与我对密码的哈希有关,但我不知道是什么原因。登录页面检查来自文档login.php: if(empty($errors)) { $sql = "SELECT accountID, password FROM users WHERE emails=?"; $stmt
if(empty($errors))
{
$sql = "SELECT accountID, password FROM users WHERE emails=?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$data['email']]);
if(!$row = $stmt->fetch())
{
// email didn't match
$errors['login'] = "Login failed. on email";
}
else
{
// email matched, test password
if(!password_verify($data['password'],$row['password']))
{
// password didn't match
$errors['login'] = "Login failed. on password";
}
else
{
// password matched
$_SESSION['user_id'] = $row['accountID'];
header('location: welcome.php');
die;
}
}
}
从insert.php开始,使用哈希法插入数据库:
if (isset($_POST['name'])){
$name = $_POST['name'];
}
if (isset($_POST['email'])){
$email = $_POST['email'];
}
if (isset($_POST['password'])){
$pword = $_POST['password'];
}
if (isset($_POST['busName'])){
$busName = $_POST['busName'];
}
if (empty($name)){
echo("Name is a required field");
exit();
}
if (empty($email)){
echo ("email is a required field");
exit();
}
if (empty($pword)){
echo("You must enter a password");
exit();
}
$pword = password_hash($pword, PASSWORD_DEFAULT)."/n";
//insert html form into database
$insertquery= "INSERT INTO `cscw`.`users` (
`accountID` ,
`businessName` ,
`name` ,
`emails` ,
`password`
)
VALUES (
NULL , '$busName', '$name', '$email', '$pword'
);";
在网页上,我从login.php看到登录失败。输入密码。如果您需要查看更多代码,请告诉我。它无法识别$row['password']。
始终对您的查询进行组织**
1准备
2执行
3取回
4Close
5然后利用获取的数据。
提取的数据需要按照returnArray函数所示进行排序
希望有独特的电子邮件和$data数组存在。试试这个
if(empty($errors))
{
$sql = "SELECT accountID, password FROM users WHERE emails=:emails";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':emails', $data['email']);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->CloseCursor();
$stmt=null;
/* Return the results is a more handy way */
function returnArray( $rows, $string )
{
foreach( $rows as $row )
{
return $row[ $string ];
}
}
if( empty($rows) )
{ // email didn't match
$errors['login'] = "Login failed. on email";
}
else
{ // email matched, test password
if( !password_verify( $data['password'], returnArray($rows,'password') ) )
{
// password didn't match
$errors['login'] = "Login failed. on password";
}
else
{
// password matched
$_SESSION['user_id'] = $row['accountID'];
header('location: welcome.php');
die;
}
}
}
登录页面未完成,查询未插入。请小心,您可能会受到SQL注入的攻击,因为您不会逃避用户操纵的变量。为了加强安全性,请添加表单验证,这将非常好
您使用了$pword=密码\u哈希$pword,密码\u默认值。/n;
我删除了/n部分。似乎您正在使用连接运算符“.”来添加/n添加密码\u散列的结尾
$insertquery未完成且不可读。您不需要在查询中插入反勾号。无需选择accountID,它将自动递增,以查看数据库中是否勾选了accountID的I。
在登录页面中执行类似操作
/* trim and escape*/
function escapeHtmlTrimed( $data )
{
$trimed = trim( $data );
$htmlentities = htmlentities( $trimed, ENT_QUOTES | ENT_HTML5, $encoding = 'UTF-8' );
return $htmlentities;
}
if ( isset( $_POST['name'] ) ){
$name = escapeHtmlTrimed( $_POST['name'] );
}
if ( isset($_POST['email']) ){
$email = escapeHtmlTrimed( $_POST['email'] );
}
if ( isset($_POST['password']) ){
$pword = escapeHtmlTrimed( $_POST['password'] );
}
if ( isset($_POST['busName']) ){
$busName = escapeHtmlTrimed( $_POST['busName'] );
}
if ( empty($name) ){
echo("Name is a required field");
exit();
}
if ( empty($email) ){
echo ("email is a required field");
exit();
}
if ( empty($pword) ){
echo("You must enter a password");
exit();
}
/*Remove this your adding "./n"*/
$pword = password_hash($pword, PASSWORD_DEFAULT);
//insert html form into database
$insertquery= "INSERT INTO users (businessName ,name ,emails,
password) VALUES (:busName , :name, :email , :pword)";
$stmt = $pdo->prepare($insertquery);
$stmt->bindParam(':busName', $busName);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':pword', $pword);
$stmt->execute();
$stmt->CloseCursor();
$stmt=null;
$数据从何而来?在密码\u散列中释放此位。/nline@FrankM$data=数组\映射'修剪',$\ POST@但是,您的$insertQuery并没有正确转义,所以这可能会使之前的所有努力付诸东流。这是一个巨人,通常只需要其中一个就可以让人攻击和颠覆你的系统。您的insert查询似乎没有实际执行,因此您可能需要检查它是否实际运行。