Php md5密码确认失败

Php md5密码确认失败,php,mysql,md5,Php,Mysql,Md5,是的,我知道md5不是一个好的选择,我宁愿使用password_hash(),但我的托管解决方案是在php版本5.3.3上。无论如何,这绝对不是一个生产环境,只是为了培训目的,我很快就会更换供应商 所以我设置了一些代码,我可以看到我注册的凭证,md5格式的密码都记录在数据库中。但是,当登录相同的凭据时,我会收到我设置的错误消息“无效电子邮件或密码” 这是我的代码: echo 'Current PHP version: ' . phpversion(); include_once("config.

是的,我知道md5不是一个好的选择,我宁愿使用password_hash(),但我的托管解决方案是在php版本5.3.3上。无论如何,这绝对不是一个生产环境,只是为了培训目的,我很快就会更换供应商

所以我设置了一些代码,我可以看到我注册的凭证,md5格式的密码都记录在数据库中。但是,当登录相同的凭据时,我会收到我设置的错误消息“无效电子邮件或密码”

这是我的代码:

echo 'Current PHP version: ' . phpversion();
include_once("config.php");
session_start();

if(isset($_POST['signup'])){
 $name = $_POST['name'];
 $email = $_POST['email'];
 $pass = md5($_POST['pass']);

$insert = $pdo->prepare("INSERT INTO users (name,email,pass)
values(:name,:email,:pass) ");
$insert->bindParam(':name',$name);
$insert->bindParam(':email',$email);
$insert->bindParam(':pass',$pass);
$insert->execute();
}
 elseif(isset($_POST['signin'])){
 $email = $_POST['email'];
 $pass = $_POST['pass'];

 $select = $pdo->prepare("SELECT * FROM users WHERE email='$email' and pass='$pass'");
 $select->setFetchMode();
 $select->execute();
 $data=$select->fetch();
 if($data['email']!=$email and $data['pass']!=$pass)
 {
  echo "invalid email or pass";
 }
 elseif($data['email']==$email and $data['pass']==$pass)
 {
 $_SESSION['email']=$data['email'];
    $_SESSION['name']=$data['name'];
header("location:aeroplane.php"); 
 }
 }
因此,注册工作正常,然后else if for签名失败。我错过了什么


-谢谢

密码在数据库中保存为md5,因此您也应该在符号上对其进行散列,以便正确比较

解决方案:

只需更改此
$pass=$\u POST['pass'];
$pass=md5($\u POST['pass'])


您的代码基本上是将非散列密码与散列密码进行比较,这毫无意义。

该密码在数据库中保存为md5,因此您应该在符号上对其进行散列,以便正确比较

echo 'Current PHP version: ' . phpversion();
include_once("config.php");
session_start();

if(isset($_POST['signup'])){
 $name = $_POST['name'];
 $email = $_POST['email'];
 $pass = md5($_POST['pass']);

$insert = $pdo->prepare("INSERT INTO users (name,email,pass)
values(:name,:email,:pass) ");
$insert->bindParam(':name',$name);
$insert->bindParam(':email',$email);
$insert->bindParam(':pass',$pass);
$insert->execute();
}
 elseif(isset($_POST['signin'])){
 $email = $_POST['email'];
 $pass = md5($_POST['pass']);

 $select = $pdo->prepare("SELECT * FROM users WHERE email='$email' and pass='$pass'");
 $select->setFetchMode();
 $select->execute();
 $data=$select->fetch();
 if($data['email']!=$email and $data['pass']!=$pass)
 {
  echo "invalid email or pass";
 }
 elseif($data['email']==$email and $data['pass']==$pass)
 {
 $_SESSION['email']=$data['email'];
    $_SESSION['name']=$data['name'];
header("location:aeroplane.php"); 
 }
 }
解决方案:

只需更改此
$pass=$\u POST['pass'];
$pass=md5($\u POST['pass'])

您的代码基本上是将非哈希密码与哈希密码进行比较,这毫无意义

echo 'Current PHP version: ' . phpversion();
include_once("config.php");
session_start();

if(isset($_POST['signup'])){
 $name = $_POST['name'];
 $email = $_POST['email'];
 $pass = md5($_POST['pass']);

$insert = $pdo->prepare("INSERT INTO users (name,email,pass)
values(:name,:email,:pass) ");
$insert->bindParam(':name',$name);
$insert->bindParam(':email',$email);
$insert->bindParam(':pass',$pass);
$insert->execute();
}
 elseif(isset($_POST['signin'])){
 $email = $_POST['email'];
 $pass = md5($_POST['pass']);

 $select = $pdo->prepare("SELECT * FROM users WHERE email='$email' and pass='$pass'");
 $select->setFetchMode();
 $select->execute();
 $data=$select->fetch();
 if($data['email']!=$email and $data['pass']!=$pass)
 {
  echo "invalid email or pass";
 }
 elseif($data['email']==$email and $data['pass']==$pass)
 {
 $_SESSION['email']=$data['email'];
    $_SESSION['name']=$data['name'];
header("location:aeroplane.php"); 
 }
 }
更新的
$pass=md5($_POST['pass'])在签名代码中

您还需要在登录时使用md5

更新的
$pass=md5($_POST['pass'])在签名代码中


您还需要在登录时使用md5

我已看到您的代码,并在登录代码后发现错误。
更新代码
$pass=$\u POST['pass']

$pass = md5($_POST['pass']);

我看到了您的代码,在登录代码后发现错误。
更新代码
$pass=$\u POST['pass']

$pass = md5($_POST['pass']);

我的托管解决方案是在php版本5.3.3上的
您确实意识到,由于php 5.3您不应该使用
md5()
来存储密码,您应该使用
密码
API。有一个兼容包可以用于php,因为它似乎值得重复,因为您关心安全性,所以登录代码包含使用user和pass直接在sql中传递的sql注入,而signin代码使用PDO绑定参数API。你应该解决这个问题。
我的托管解决方案是在php版本5.3.3上的
你确实意识到,你会遇到大量的安全漏洞,这些漏洞自PHP5.3以来没有修补过。你不应该使用
md5()
来存储密码,你应该使用
密码
API。有一个兼容包可以用于php,因为它似乎值得重复,因为您关心安全性,所以登录代码包含使用user和pass直接在sql中传递的sql注入,而signin代码使用PDO绑定参数API。您应该解决这个问题。
SELECT*FROM user WHERE email='$email'和pass='$pass'
-我不知道为什么您对其中一个使用准备好的语句,而对另一个不使用。@Fred ii-只是想解决他的问题。所有内容都是从问题中复制的。
SELECT*from users,其中email='$email'和pass='$pass'
-我不知道为什么您对其中一个使用准备好的语句,而对另一个则不使用。@Fred ii-只是想解决他的问题。所有内容都是从问题中抄袭过来的。