是否可以为数据库中的用户名选择确切的密码?

时间:2015-05-25 08:21:10

标签: php mysql sql

我创建了一个包含表(UserPass)的数据库,该表基本上存储了用户名和密码。

现在,在我的表单中,我想要求用户输入他的用户名和密码,在测试时,我意识到我可以输入数据库中的任何用户名和任何登录密码。

是否可以在SQL查询中选择与用户名在同一行的密码?

我尝试过类似的事情:

$username = $_POST['username'];
$sql = "SELECT Password FROM UserPass WHERE Username = $username";

但是以下mysqli_query失败了:

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

所以这是整个action.php脚本:

<?php
include "info.php";
include "god.php";
session_start();
if($_POST['god'] == $god)
{   

    header( "refresh:0;url=../web.html" );
}

else if(empty($_POST['god']))
{

}

else 
{
    echo "Can't you read: DON'T TRY!!!!!!!";
    exit();
}

$cxn = mysqli_connect($host, $user, $password, $dbname) or die("Go");
//check username
$userI = $_POST["username"];
$userSql = "SELECT Username FROM UserPass ";
$result = mysqli_query($cxn, $userSql) or die("Query failed!");
while($line = mysqli_fetch_assoc($result))
{
    extract($line);

    foreach ($line as $key => $val)
    {
        if($_POST['username'] == $val)
        {
            //check for password 
            $username = $_POST['username'];
            $pass = $_POST['password'];
            $sql = "SELECT Password FROM UserPass";
            $passres = mysqli_query($cxn, $sql) or die("Request cannot be handled now.");
            while ($passline = mysqli_fetch_assoc($passres))
            {
                extract($passline);
                foreach ($passline as $k => $v) 
                {
                    if($_POST['password'] == $v)
                    {
                        header( "refresh:0;url=../web.html");


                    }

                    else 
                    {
                        session_destroy();
                    }

                }
            }

        }
    }
}
/*
if($userI == $line['Username'])
{
    //check for password
    $pass = $_POST['password'];
    $sql = "SELECT * FROM UserPass";
    $res = mysqli_query($cxn, $sql) or die("Pass query failed");
    $passline = mysqli_fetch_assoc($res);
    if($pass == $passline['Password'])
    {
        header( "refresh:4;url=../web.html");
        session_start();
        echo "Login succesful, session started, session id: ";
    }
}
*/


    /*
    if($_POST['username'] == $val)
    {
        //check for password
        $b = $_POST['username'];
        $pass = $_POST['password'];
        $sql = "SELECT * FROM UserPass";
        $passres = mysqli_query($cxn, $sql);
        $passline = mysqli_fetch_row($passres);
        foreach ($passline as $k => $v ) 
        {
            if($_POST['password'] == $v)
            {
                header( "refresh:0;url=../web.html");
                session_start();
            }
        }


    }
    */
    /*
    else 
    {
        print("Destroying Laptop...US Government...Destroying Laptop...\n");
        exit();
    }
    */              
?>

2 个答案:

答案 0 :(得分:0)

您只需要检查是否有包含同一用户的用户名和密码的记录:

$password = mysqli_real_escape_string($password);
$username = mysqli_real_escape_string($username);
$sql = "SELECT Password FROM UserPass WHERE Username = '$username' AND Password = '$password'";

如果有1个这样的结果,那就没关系。

顺便说一下,你不应该用纯文本存储密码 - 而是使用单向散列函数,只比较密码的散列。

答案 1 :(得分:0)

您的SQL查询应包含“AND”,如下所示:     

$link = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link));

$username = mysqli_real_escape_string($link, $_POST['username']);
$password = mysqli_real_escape_string($link, $_POST['password']);

$sql = "SELECT * FROM UserPass WHERE username = '{username }' AND password = '{$password}' LIMIT 1";

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

if ($query && mysqli_num_rows($query)>0) {
     //user is authenticated
}
?>

通过使用逻辑运算符 AND ,您的查询必须符合两个条件才能给出答案。只有用户才能知道这些条件。

另外请不要将密码字段存储为数据库中的明文。这不安全。你应该使用sha1哈希。有关详细信息,请查看http://en.wikipedia.org/wiki/SHA-1