当前位置: 首页 > 知识库问答 >
问题:

我不明白密码验证(PDO)是如何工作的?请解释[副本]

杨波娃
2023-03-14

我得到了这个任务,到目前为止,我一直在使用sha1进行安全保护。老师上周五给我们回电话,告诉我们用password_hash。知道这是明天的事,我试图弄清楚这是如何工作的,但不要把我的头包在里面。我发现很多人谈论它但没有这些工作为我如何使用password_hash注册和登录

目前,正如分配给我的那样,我只使用PDO并返回到我以前的工作代码(使用sha1)

    <?php
    ob_start();// TEST
    include("inc/timer.inc.php");//session
    require("inc/database.inc.php");//connection website
    $title='website';

    if (isset($_POST['formConnection'])) {
    $loginConnection = filter_input(INPUT_POST, 'loginConnection', FILTER_SANITIZE_FULL_SPECIAL_CHARS   );

    // Connection sha1- OLD
    $passwordConnection = sha1($_POST['passwordConnection']);

    // Connection password_hash
    //$hash = $profile['password'];
    //$passwordConnection = password_verify($_POST['passwordConnection'], $hash);

        if (!empty(($loginConnection) AND !empty($passwordConnection))) {
            $connection = $website->prepare("SELECT * FROM members WHERE login = ? AND password= ?");
            $connection->execute(array($loginConnection, $passwordConnection));
            $userExists = $connection->rowCount(); //Test existence et affectation à la session des valeurs

            if ($userExists == 1) {
            $profile = $connection->fetch();
            $_SESSION['idMember'] = $profile['idMember'];
            $_SESSION['login'] = $profile['login'];
            $_SESSION['status'] = $profile['status'];
            header("Location: member-detail.php?idMember=".$_SESSION['idMember']);
            } else {
            echo "<script>alert(\"Wrong login or password\")</script>"; 
            }

        } else {
        echo "<script>alert(\"Please check your login or your password\")</script>"; 
        }

    }
    ?>
    <body>

        <form method="post" action="">

            <div class="form-group">
                <label for="loginConnection">login</label><br>
                <input type="text" class="form-control" name="loginConnection" id="loginConnection"
                    placeholder="login" required><br><br>
            </div>

            <div class="form-group">
                <label for="passwordConnection">password</label><br>
                <input type="password" class="form-control" name="passwordConnection" id="passwordConnection"
                    placeholder="Mot de Passe" required><br><br>
            </div>
            <input type="submit" name="formConnection" value="Se connecter">

            <div class="form-group">
                <a href="subscribe.php">Not subscribed yet?</a>
            </div>

        </form>
        <br><br>

    </body>

我知道它应该是一个布尔值,但我不知道如何使用它。

有关于这个的分步教程吗?我可能错过了。谢谢

共有2个答案

刁钧
2023-03-14
匿名用户

您必须从数据库获取用户,然后使用password\u verify检查密码。因此,只需从login=?的成员中选择*,然后在if($userExists==1){中,如果密码验证($\u POST['passwordConnection'],$profile['password')为false,则登录失败。

寿元白
2023-03-14

password\u verify()函数将与password\u hash()函数一起使用。

将从密码\u hash()生成的哈希存储在数据库中。当有人试图登录时,您将根据哈希测试他们提供的密码。如果password\u verify()返回true,则密码匹配。

您不应该使用password_hash()重新设置密码,因为每次都会得到不同的答案(如果使用随机盐,您应该这样做)。当您使用password_hash()散列密码时,默认情况下,它使用随机盐来散列密码。这个随机盐被编码到生成的哈希字符串中,以便password_verify()可以使用与最初哈希时相同的盐来验证它。

基本上,您应该从数据库中为试图登录的用户检索哈希,并将其提供给password_verify()函数。除了盐,散列还包含关于使用哪个散列算法的信息。

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

 类似资料:
  • 问题内容: 在担任前端开发人员的头几个月后,我才开始涉足后端开发。我正在使用postgreSQL,似乎无法将我的头放在nextval()函数周围。我读了这篇,但对我来说还不清楚。 http://www.postgresql.org/docs/current/interactive/functions- sequence.html nexval()有什么好处/用例? 问题答案: 是从序列中获取下一个

  • 我正在使用JMX远程监控我的服务器。但是,jmx-access和jmx密码存储我不想要的清除密码。 接下来是如何为JConsole的密码文件加密密码,如何使JMX自定义身份验证工作?以及如何创建登录模块?,我编写了一个自定义登录模块。 我的登录模块: 这是我的登录模块配置文件(d:/mysecurity.cfg): 启动服务器时,我使用以下参数: 然而,当我试图用JCsonle连接服务器时,我无法

  • 下面是一个链表的简单实现。我刚刚添加了相关代码。首先,我向列表中添加一些值,10,990和10000。当我搜索相同的值时,对于key=10,我得到true,但是对于key=990和key=10000得到false,尽管它应该是true。另外,如果我将第二个值从990更改为99,并搜索key=99,这一次我得到的是true。 我不确定是否使用泛型类型。我想我在那里做错了什么。因为如果我用int替换泛

  • 我正在创建一个非常简单的验证码验证过程。

  • 我正在通过一些在线示例学习区块链。我有一个高级代码,我用前面的散列创建一个新的块,然后向其中添加一个事务,然后生成一个困难的块散列(有8个前导零) 这很有效。但我有一个问题,在向区块链添加区块之前,如何验证该工作证明。 即。假设生成了一个包含8个前导零的散列

  • 我试图完全理解密码散列,以便能够向审计员解释它。 基于我对答案的搜索,我知道函数是的包装器。在阅读预定义常量的PHP手册时,我看到它使用作为默认整数值(基本上它使用算法来散列密码)。 让我困惑的是,变量如果省略,会生成一个随机salt,并且成本将设置为。如果我提供了更高的成本(例如:),由于我没有提供salt值,它还会生成随机salt吗?我在这里感到困惑的原因是,我没有忽略,而是提供了不同的成本。