php登录表单总是带我到editor.php页面

时间:2016-05-16 10:29:41

标签: php mysql login

我当前的登录表单无法正常运行。无论登录表单中输入什么内容,它始终会记录我。从第一个问题开始,我决定改变我的代码。

以下是最新代码:

<?php
    session_start();
    include_once("db_connect.php");

    if(isset($_POST['loginSub'])) {
        //Connect to DB
        include_once("db_connect.php");

        //Gets whatever is inside input box and prevents sql injection
        $username=($_POST['user']);
        $password=($_POST['password']);

        $query = "SELECT * FROM user WHERE user= 'kent' AND password = 'password'";
        $rows = mysqli_query($conn, $query);

        if ($rows->num_rows == 1) {
            $_SESSION['user']=$username; // Initializing Session
            header("location: loginAuth.php"); // Redirecting To Other Page
        } else {
            $error = "Username or Password is invalid!!!!";
        }
            mysql_close($conn); // Closing Connection

    }       

&GT;

以下是HTML表单:

<form id="login" method="POST" action="loginAuth.php">

                    <label for="user"><strong>Login:</strong></label>
                    <input type="text"size=20 autocorrect=off autocapitalize=words name="user">
                    <!--<label for="loginPassword" name="password"> <strong>Password:</strong></label>
                    <input type="password" name="Password"> -->

                    <label for="password" > <strong>Password:</strong></label> 
                    <input type="password" name="password">

                    <input name="loginSub" type="submit" value="login"> 
                </form>  

表单操作loginAuth.php基本上会将您带到编辑器页面并且还没有php。

每段代码都来自同一个php页面。我的问题是,如何在凭据不正确的情况下将其登录?

5 个答案:

答案 0 :(得分:2)

mysqli_real_escape_string需要连接参数,否则它将为空白:

$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);

由于这两个变量都是空白的,因此您的查询将自动计算为true

此外,您不需要mysqli_query的引号:

$query = mysqli_query($db,$sql);

您还需要指定POST方式的表单方法:

<form id="login" method="POST" action="loginAuth.php">

这是因为您使用$_POST获取PHP中的数据:

  

当使用application / x-www-form-urlencoded或multipart / form-data作为请求中的HTTP Content-Type时,通过HTTP POST方法传递给当前脚本的关联变量数组。

$username=strip_tags($_POST['user']);
$password=strip_tags($_POST['password']);

只是提示:您不应该存储用户&#39;密码为纯文本,你应该哈希/加密它。

在PHP 5.5中,有一个密码哈希函数:http://php.net/manual/en/ref.password.php

更新逻辑:

$sql = "SELECT * FROM users WHERE username='$username' AND password='$password' LIMIT 1";
$query = mysqli_query($db, $sql);
$result = mysqli_result($query);

if(mysqli_num_rows($result) > 0) {
    $_SESSION['username']= $username;
    $_SESSION['id']= $id;
    //useless code doesnt work header('Location: editor.php');

// { other code }

答案 1 :(得分:1)

你的第一个错误是你没有指定表单方法,如果你没有从方法中指定它应该总是$_GET,但你正在检查$_POST所以首先请指定表单方法,这是你的登录页面所以我的建议为了安全起见,在表单标记中设置post方法。

<form id="login" action="loginAuth.php" method="post">

然后尝试它可以帮助你。

答案 2 :(得分:1)

总结其他答案并改进代码:

在表单中,您需要设置方法。因此<form id="login" action="loginAuth.php">变为<form id="login" action="loginAuth.php" method="post">

改进表单HTML:

<div id="loginform">
   <form id="login" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
        <label for="username"><strong>Username:</strong></label>
        <input type="text" size=20 autocorrect="off" autocapitalize="words" name="username" id="username">

         <label for="password" name="password"><strong>Password:</strong></label>
         <input type="password" name="password" id="password">

         <input name="loginSub" type="submit" value="login"> 
   </form> 
</div>
  

注意为了使标签可以点击,for属性需要与输入的id属性相匹配。 Al name属性需要与$_POST的名称相匹配。这两种形式都不正确。

要缩短代码并使其更易于维护,请使用以下命令:

首先代替if(isset($_POST['loginSub'])) {,您也可以说if( $_POST )这样可以确保其余代码仅在页面发布时执行。

要进一步缩短代码,而不是在单独的行上执行所有sql注入预防,您可以将它们合并为一个。这使维护更容易。

$username = mysqli_real_escape_string($db, stripslashes( strip_tags( $_POST['username'] ) ) );
$password = mysqli_real_escape_string($db, stripslashes( strip_tags( $_POST['password'] ) ) );

另外,不要忘记将数据库连接添加到mysqli_real_escape_string()

查看用户名和密码组合是否匹配

$sql = "SELECT * FROM `users` WHERE `username`= '$username' AND `password` = '$password' LIMIT 1";
  

注意每个列名称周围的反引号。反引号是为了防止一个名为mysql保留字的错误。尽管列名称不是保留字,但一般来说最好使用它们。

要执行查询,您不需要引号。因此$query = mysqli_query("$db,$sql");变为$query = mysqli_query($db, $sql);

之后你就可以做到:

$query = mysqli_query($db, $sql);

if( $query ) {
  if( mysqli_num_rows( $query ) >= 1 ) {
        $_SESSION['username'] = base64_encode( $username ); 
        header('Location: home.php');
        exit(); // To prevent further exection of code
  } else {
        echo "Incorrect details.Try again!";
  }
} else {
  echo "Error in query";      
}

base64_encode使得阅读会话变得更加困难。使用base64_decode()阅读

  

注意您不应该使用password_hash()password_verify()这样的函数以纯文本格式存储密码。

您也不应该只使用md5(),因为它很容易破解。你可以做的是组合使用。像下面的东西。这些只是你能做的两个例子,我不是说一个比另一个好。只是不要单独使用md5()

$password = password_hash( md5( $password) );
$password = password_hash( hash('sha512', sha1( md5( $password ) ) );

答案 3 :(得分:0)

首先,查询应检查用户名和密码。它应该是这样的:

$sql = "SELECT * FROM users WHERE username = '$username' and password = '$password'";

然后检查结果以查看您是否没有获得任何记录,然后显示“无效凭据”之类的消息。如果不是,您应该重定向或显示您想要的部分。

答案 4 :(得分:0)

一些快速解决方法可能是:

1)指定形成method="POST"

的方法

2)mysqli_real_escape_string需要两个参数。有关详细信息,请查看this link。更改以下代码 来自

$username = mysqli_real_escape_string($username);
$password = mysqli_real_escape_string($password);

$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);

3)将$query = mysqli_query("$db, $sql");更改为$query = mysqli_query($db, $sql);

4)同时检查更新的查询以检查用户名和密码。

<?php
    session_start();
    include_once("db_connect.php");

    if(isset($_POST['loginSub'])) 
    {
        //Connect to DB
        include_once("db_connect.php");

        //Gets whatever is inside input box and prevents sql injection
        $username = strip_tags($_POST['user']);
        $password = strip_tags($_POST['password']);

        //Gets whatever is inside input box and prevents sql injection
        $username = stripslashes($username);
        $password = stripslashes($password);

        //Gets whatever is inside input box and prevents sql injection
        $username = mysqli_real_escape_string($db, $username);
        $password = mysqli_real_escape_string($db, $password);

        // Look in users table and filter those who have same username is the one inputed.
        $sql = "SELECT id, username  FROM users WHERE username = '$username' and password = '$password' ";
        $query = mysqli_query($db, $sql);

        if($query)
        {
            if(mysqli_num_rows($query) == 1)
            {
                $_SESSION['username']= $username;
                $_SESSION['id']= $id;
                header('Location: home.php');
            }
            else
            {
                echo "Incorrect details.Try again!";
            }
        }
        else
        {
            echo "Error in query";
        }
    }   
?>


<div id="loginform">
    <form id="login" action="loginAuth.php" method="POST">
        <label for="login"><strong>Login:</strong></label>
        <input type="text"size=20 autocorrect=off autocapitalize=words name="user">
        <label for="loginPassword" name="password"> <strong>Password:</strong></label>
        <input type="password" name="Password">
        <input name="loginSub" type="submit" value="login"> 
    </form> 
</div>