4

我在这里做错了什么:

<?php
    if (isset($_POST['submitted'])) {

    $errors = array();
        require_once ('mysql_connect.php');

    session_start();
    $username = $_POST["username"]; // This is the inputted username from the form in Login.html
    $password = $_POST["password"]; // This is the inputted password from the form in Login.html


    if (empty($errors)) {
        $query="SELECT username FROM users WHERE username='$username' AND password='SHA($password)'"; 

        $result = mysql_query($query);  

        // Mysql_num_row is counting table row

        if (mysql_num_rows($result) == 1) {
                $_SESSION["username"] = $username; // Creates a cookie saving the username
                $_SESSION["loggedIn"] = true; // Creates a cookie saying the user is logged in
            // Show thank you message
            echo '<h3 style="color:green;">Thank You!</h3>
            <span style="color:green;">You have been logged in.</span>';
        } else {
            echo '<font color="red">You could not be logged in, please make sure your username and password is correct.</font>';
            foreach ($errors as $msg) {
            echo " - <font color=\"red\">$msg</font><br />\n";
            }
        }

} else {
        echo '<font color="red"><h3>Error!</h3>
        The following error(s) occured:<br /></font>';

        foreach ($errors as $msg) {
            echo " - <font color=\"red\">$msg</font><br />\n";
        }
    }
}
?>

我得到一个:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /login.php on line 19

我 SHA 密码的方式也是正确的吗?

4

3 回答 3

3

问题是您的 MySQL 查询导致错误,这意味着您$result实际上不包含结果资源。

您需要在查询中''从周围删除SHA($password),而是将它们放在密码值周围,如下所示:

$query="SELECT username FROM users WHERE username='$username' AND password=SHA('$password')";

我 SHA 密码的方式也是正确的吗?

这取决于将密码插入数据库时​​如何散列密码。MySQL的SHA()与其相同SHA-1()

计算字符串的 SHA-1 160 位校验和,如 RFC 3174 中所述

这也与 PHP 相同sha1();因此,例如,如果数据库中的密码是使用 PHP 创建的 SHA-1 哈希sha1(),那应该没问题。


旁注

于 2012-04-28T12:17:43.157 回答
1

不要通过 SHA 函数使用 ''

$query="SELECT username FROM users WHERE username='$username' AND password='SHA($password)'"; 

而且当然不记得转义您的数据。

于 2012-04-28T12:13:56.907 回答
1

为什么你在@mysql_query($query) 中放了一个@;? 如果你有一个 MYSQL 错误,你应该正确处理它而不是忽略它(我假设你有一个错误)。它将帮助您了解错误的来源。

此外,您可以在 PHP 中执行 SHA(这取决于您的架构对您的项目可能是好是坏)。

http://php.net/manual/en/function.sha1.php

于 2012-04-28T12:14:31.023 回答