0

我正在做一个测试项目,试图了解更多关于 PHP 和 Mysql 的信息。所以我决定为我的测试网站构建一个身份验证引擎,但我遇到了查询问题。

基本上,如果我跑...

SELECT * FROM users WHERE name="tester" and passwd=md5('pass');

从mysql控制台,我得到......

+--------+---------------+----------------------------------+
| name   | email         | passwd                           |
+--------+---------------+----------------------------------+
| tester | test@test.com | 1a1dc91c907325c69271ddf0c944bc72 |
+--------+---------------+----------------------------------+
1 row in set (0.00 sec)

但是,当我从我的 PHP 代码(见下文)发出相同的查询(至少我认为它是相同的)时,我似乎得到了一个 NULL 结果,因此身份验证失败。

<?php
    include 'db_connect.php';

    $username = $_POST['username'];
    $passwd = $_POST['passwd'];

    // To protect MySQL injection (more detail about MySQL injection)
    //$username = stripslashes($username);
    //$passwd = stripslashes($passwd);
    //$username = mysql_real_escape_string($username);
    //$passwd = mysql_real_escape_string($passwd);

    //Encrypted password
    $secpasswd = md5($passwd);

    $sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd";

    $result=mysql_query($dbconnect,$sql);
    var_dump($result);

    // Mysql_num_row is counting table row
    $count=mysql_num_rows($result);
    //var_dump($count);

    // If result matched $myusername and $mypassword, table row must be 1 row
    if($count==1){

        // Register $myusername, $mypassword and redirect to file "login_success.php"
        session_register("username");
        session_register("passwd"); 
        header("location:login_success.php");
        }
    else {
        echo "Wrong Username or Password";
        }
    ob_end_flush();
?>
4

4 回答 4

3

你的代码有很多问题。

  • 你的SQL查询格式不对
  • 您实际上并没有从查询结果中获取任何值
  • 你的散列很弱
  • 你没有使用准备好的语句
  • 您正在使用过时的会话功能

这是必须的

<?php
include 'db_connect.php';

//Encrypted password
$secpasswd = sha512($_POST['passwd'].$_POST['username']);

$sql = "SELECT * FROM users WHERE name = ? and passwd = ?";
$stm = $pdo->prepare($sql);
$stm->execute(array($_POST['username'], $secpasswd));
$row = $stm->fetch();

if($row){
    $_SESSION["username"] = $row[username];
    header("location:login_success.php");
    exit;
} else {
    echo "Wrong Username or Password";
}

请注意,此代码使用PDO进行数据库交互

于 2013-07-31T16:08:14.887 回答
1

您的查询不等效:

SELECT ... passwd=md5('pass')

不一样_

SELECT ... passwd=password_hash_here

在第一种情况下,mysql知道你从 md5 调用中得到一个字符串。在第二种情况下,您只是将一个裸字符串填充到查询中,MySQL 被迫将其视为字段名称(如果它以字母字符开头)或无效数字(如果它以数字开头)。

尝试

SELECT ...passwd='$password_hash'

反而。

于 2013-07-31T16:07:21.387 回答
0

马上,我注意到您的密码字符串没有用引号引起来。尝试改变这个:

    $sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd";

对此

    $sql="SELECT * FROM users WHERE name='$username' and passwd = '$secpasswd'";
于 2013-07-31T16:08:16.010 回答
0

正如肖恩在上面的评论中指出的那样,您需要将 $secpasswd 用单引号括起来。所以

$sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd";

变成

$sql="SELECT * FROM users WHERE name='$username' and passwd = '$secpasswd';";

但我回答的主要原因是让您知道您使用的 mysql 方法已被弃用。您应该考虑改用 mysqli 或 PDO。

于 2013-07-31T16:07:27.253 回答