登录返回密码在php中不匹配

时间:2016-03-28 16:13:09

标签: php html

我希望你做得很好。我的项目中有登录功能。当我尝试登录时它给了我这个奇怪的错误,我没有在login.php脚本中写。我把它写在其他地方并没有对它进行导入。我希望你们能帮助我找出问题所在。

先谢谢。干杯,
我的一些有用的代码:
Login.php脚本:

Timeout

我的loginFunctions.php类:

    <?php
include_once 'Header.php';
?>
<style>
    #container {
        height: 92vh;
    }
</style>
<div id="container">
    <br>


    <?php
    $_SESSION['logged'] = null;

//in this page we do things slightly differently - the code for validation and displaying messages is done
//before we display the form 
    echo '<div id = "div_1"><h1>Login</h1>';

//display the form
    echo '<div id="div_2"><div id="div_2">
       <form action="Login.php" method="post">
           <label>Email<br>
           <span class="small">enter your Email</span>
           </label>
           <input type="text" name="Email" value=""/>
           <label><br>Password<br>
           <span class="small">enter your password</span>
           </label>
           <input type="password" name="Password" />

           <button type="submit" name="submit" value="Login" />Log in</button>
           <input type ="hidden" name="submitted" value="1">
         </form>
         </div>
    </div>';

    if (isset($_POST['submitted'])) {
        //require_once is similar to 'include' but ensures the code is not copied multiple times
        require_once('LoginFunctions.php');
        $name3 = $_POST['Email'];
        $pwd3 = $_POST['Password'];
        echo $name3;
        echo $pwd3;
        //list() is a way of assigning multiple values at the same time
        //checkLogin() function returns an array so list here assigns the values in the array to $check and $data
        list($check, $data) = checkLogin($_POST['Email'], $_POST['Password']);


        if ($check) {
            setcookie('FName', $data['FName'], time() + 900);  //cookie expires after 15 mins
            setcookie('LName', $data['LName'], time() + 900);
            //
            //use session variables instead of cookies
            //these variables should now be available to all pages in the application as long as the users session exists
            $_SESSION['FName'] = $data['FName'];
            $_SESSION['LName'] = $data['LName'];
            $_SESSION['Email'] = $data['Email'];
            //to enable $_SESSION array to be populated we always need to call start_session() - this is done in header.php
            //print_r is will print out the contents of an array
            print_r($_SESSION);
            //
            //Redirect to another page
            $url = absolute_url('Index.php');  //function defined in Loginfunctions.php to give absolute path for required page
            $_SESSION['logged'] = TRUE;
            echo $_SESSION['logged'];
            //this version of the header function is used to redirect to another page
            echo "<script>setTimeout(\"location.href = '" . $url . "';\",10000);</script>"; //since we have entered correct login details we are now being directed to the home page

            exit();
        } else {
            $errors = $data;
        }
    }

    //create a sopace between the button and the error messages
    //echo'<div class="spacer"></div>';

    if (!empty($errors)) {
        echo '<br/> <p class="error">The following errors occurred: <br />';

        //foreach is a simplified version of the 'for' loop
        foreach ($errors as $err) {
            echo "$err <br />";
        }

        echo '</p>';
    }

    //this is the end of the <div> that contains the form
    echo '</div>';

    /* */
    ?>
</div>

<?php
include 'Footer.php';
?>

2 个答案:

答案 0 :(得分:1)

mysqli_affected_rows用于返回受插入,更新和删除操作影响的行。对于select语句,您必须使用mysqli_num_rows

if($r) {
       if(mysqli_num_rows($r) != 0){
                $row = mysqli_fetch_array($r, MYSQLI_ASSOC);
                return array(true, $row);
        }else {
                $errors[] = 'Passwords do not match';
        }
     }

为了更好的安全性:您可以使用password_hash()函数来增强密码,然后匹配您在字段中保存的哈希值(Password-数据类型将是varchar,长度为255)。您使用password_verify()函数匹配此哈希,该函数有两个参数:用户键入的字符串和保存在数据库中的哈希值。

例如:

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";

将打印:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

当用户使用rasmuslerdorf作为密码登录时,您使用password_verify查询数据库并将存储的哈希密码$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1arasmuslerdorf匹配:

$q= mysqli_query($dbc, "SELECT Password FROM `Users_1` 
                      WHERE `Email` = '$Email' and `Password` = '$password'"); 
$res = mysqli_fetch_assoc($q);
$hash = $res['Password'];
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

答案 1 :(得分:0)

这是一个相当非技术性的答案,但它包含了我根据自己的经验提出的建议。

当我刚学习HTML并且对php或javascript没有真正的想法时,我会花费数小时试图弄清楚登录是如何工作的。

过了一会儿,我发现了php和javascript,我有一个朋友的php登录脚本继续。

我设法让数据库正常工作,但注册并不是我发布this问题的原因。

最终我的登录工作正常,但是我的有限知识意味着我可以将人们(和朋友)的私人信息(例如他们在其他地方使用的密码)存储在可能存在重大缺陷的网站上。

现在不要误会我的意思,我不是说不要这样做我只是说你做研究。花时间观看这样的视频:

  

https://www.youtube.com/watch?v=8ZtInClXe1Q

     

如何不存储密码! - Computerphile

然后花更多时间做一些不涉及密码的数据库查询。

一旦你对如何使用查询有了很好的理解,并且对自己的查询有信心,就开始在php中研究hashing方法。

请查看:

  • Salting your passwords 您实际上是随意添加的 正在进行哈希处理的密码的字符,以便您无法使用 用于反转散列密码的散列表。

  • SQL Injection ,人们使用表单上的输入(名称字段或任何其他字段)来更改问题的语法,并基本上将代码添加到您的网站。这很危险,因为它们可以(取决于用户拥有的权限)删除表,删除数据库,选择*以及许多其他有害的东西。在前面提到的关于&#34;如何不存储密码的视频中也提到了这个主题!&#34;。

  • Do more research (不要仅使用不包含所有内容的链接)...当您存储人员信息时,您永远不会太安全。不要将这些提示视为过度使用,将其视为对用户的责任,他们可以相信密码不会发生任何变化!

祝你好运!