【问题标题】:My password accept uppercase and lowercase letter [duplicate]我的密码接受大写和小写字母[重复]
【发布时间】:2019-01-17 09:45:31
【问题描述】:

我做了一个注册和登录表单,但我遇到了一个问题,即我的密码同时接受小写字母和大写字母。谁能告诉我如何解决这个问题。 这是我下面的确认注册码。在密码起作用之前是否必须对密码进行哈希处理。我是php新手

<?php 
if(isset($_POST['register'])){
    $username = trim(mysqli_real_escape_string($connection, $_POST['username']));
    $lastname = trim(mysqli_real_escape_string($connection, $_POST['lastname']));
    $email = trim(mysqli_real_escape_string($connection, $_POST['email']));
    $password = trim(mysqli_real_escape_string($connection, $_POST['password']));
    $password1 = trim(mysqli_real_escape_string($connection, $_POST['password1']));
$sql = "SELECT email FROM users WHERE email='$email'" ;
$result = mysqli_query($connection, $sql) or die($mysqli->error());
if ( $result->num_rows > 0 ) {
 echo'
        <script type = "text/javascript">
             alert("Email Address alrady exists ")
            window.location.href = "register.php"
        </script> '; 
        exit();
}
else {                  
if ($password === $password1){
     // add the user  if password match 
    $query = "INSERT INTO users(firstname, lastname, email, pass)
                VALUES ('{$username}','{$lastname}', '{$email}', '{$password}') ";
     $runNewUser = mysqli_query($connection, $query);
     if($runNewUser){
         echo'
             <script type = "text/javascript">
            window.location.href = "getmessage.php"
             </script>';        
     }else{
         echo'
             <script type = "text/javascript">
             alert("Error creating user. Please try again");
             </script>';
     }
}else{
    // trigger error if password do not match
    echo'
     <script type = "text/javascript">
        alert("Password do not match. Please try again ");
     </script>
     ';
    }
}   
}
?>

下面是我的确认登录代码

<?php 
if(isset($_POST['ulogin'])){
    $email    = trim(mysqli_real_escape_string($connection, $_POST['email']));
    $pass     = trim(mysqli_real_escape_string($connection, $_POST['pass']));
    $checkUser = "
                SELECT * FROM users
                WHERE email = '{$email}' 
                AND pass = '{$pass}'
            ";
    $runCheck = mysqli_query($connection, $checkUser);
    if(mysqli_num_rows($runCheck) == 1){
        $foundUser = mysqli_fetch_array($runCheck);
        $_SESSION['uid'] = $foundUser['id'];
        $_SESSION['uname'] = $foundUser['firstname'];
        $_SESSION['email'] = $foundUser['email'];
        echo'
        <script type = "text/javascript">
            window.location.href = "dailymessage.php";
        </script>
        ';      
    }else{
        echo'
            <script type = "text/javascript">
                alert("Email address / Password incorect. Please try again");   
            </script>
            ';          
    }   
}
?>

任何帮助将不胜感激。

【问题讨论】:

  • 您必须始终对密码进行哈希处理。
  • 您是否以纯文本 O_O 形式存储密码?
  • MySQL 默认情况下将字符串视为不区分大小写,这只是您永远不应存储纯文本密码的原因之一。而是使用password_hash()password_verify()。如果您使用的是 5.5 之前的 PHP 版本,请不要使用 MD5 或 SHA1 来散列密码。相反,您可以使用this compatibility pack
  • 您的意思是无论大小写您的密码都匹配,还是您只想要求密码的小写/大写字符?您应该进行散列,散列将针对上/下进行不同的评估。
  • 另外,不要依赖real_escape_string()函数来防止SQL注入,they alone are not sufficient。您应该通过mysqliPDO 使用带有绑定参数的准备好的语句。 This post 有一些很好的例子。

标签: php mysql passwords


【解决方案1】:

默认情况下,mysql 不区分大小写。 在下一行if ($password === $password1){之后,如果条件返回真(这意味着如果2个密码匹配,你应该像$hash = password_hash($password, PASSWORD_DEFAULT);一样散列你$password,并在这一行VALUES ('{$username}','{$lastname}', '{$email}', '{$password}') ";使用$hash变量容器你的像这样的散列密码VALUES ('{$username}','{$lastname}', '{$email}', '{$hash}') ";。散列函数PASSWORD_DEFAULT的第二个参数是散列算法。默认算法目前是bcrypt,但未来某个时候可能会添加一个更强的算法作为默认算法,并可能生成一个更大的字符串。如果您在项目中使用 PASSWORD_DEFAULT,请确保将哈希存储在容量超过 60 个字符的列中。将列大小设置为 255 可能是一个不错的选择。您也可以使用 PASSWORD_BCRYPT 作为第二个参数. 在这种情况下,结果将始终为 60 个字符长。因此,对于您的登录,当您提供密码时,您应该将其与数据集中的散列版本进行比较。因此,您首先将 POST 变量放入变量@9876 54329@ 然后创建另一个变量$hash = password_hash($password, PASSWORD_DEFAULT); 来生成散列版本并用于检查。请记住,您将散列存储在数据库中,但这是用户登录时获得的纯密码。 password_verify() 函数将纯密码和散列字符串作为其两个参数。如果哈希值与指定的密码匹配,则返回 true。

if (password_verify($password,     $hash)) {
    // Success!
}
else {
    // Invalid credentials
}

有关更多信息,您可以阅读此topic

【讨论】:

  • jochri3 我已经通过散列密码更新了确认注册页面,但是当我尝试使用电子邮件地址和密码登录时,尽管我输入了正确的电子邮件和密码,但它给了我错误电子邮件/密码不正确跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2015-11-28
  • 2016-05-03
  • 1970-01-01
  • 2020-09-23
  • 2015-07-28
相关资源
最近更新 更多