Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用户身份验证(使用sha1)_Php_Sql_Encryption - Fatal编程技术网

Php 用户身份验证(使用sha1)

Php 用户身份验证(使用sha1),php,sql,encryption,Php,Sql,Encryption,我正在创建一个登录表单。我正在学习如何使用SHA-1加密密码。我使用SHA-1加密用户在注册期间创建的密码。在数据库中,我输入了假装的用户名和密码数据,以便进行处理。我在使用我的登录表单时遇到问题 // Database Connection $con = getConnection(); $sqlQuery = mysql_query("SELECT count(*) from Customers WHERE Email = '$email

我正在创建一个登录表单。我正在学习如何使用SHA-1加密密码。我使用SHA-1加密用户在注册期间创建的密码。在数据库中,我输入了假装的用户名和密码数据,以便进行处理。我在使用我的登录表单时遇到问题

// Database Connection

$con = getConnection();

$sqlQuery = mysql_query("SELECT count(*) from Customers
                         WHERE Email = '$email' and Password = sha1('$passLogin')") 

// Executing query
$result = $con->mysql_result($sqlQuery, "0");

if ($result == 0) {
    echo "Can not login, try again.";
} else {
    echo "Login Good!";
}

另请注意,如果您尚未对表单输入进行消毒,您将完全开放

如果用户为电子邮件字段输入以下内容:

' or '1'='1
他们将登录:)

您应该使用转义
$email
$passLogin
或者更好地使用准备好的语句

我正在学习如何使用sha1 加密密码

。。。使用sha1散列密码。哈希与加密不同。加密是可逆的,散列不是。(或者不应该)。现在

  • 您必须确保数据库中的密码是散列的

  • 通常在PHP端进行哈希运算

  • 你应该使用盐渍使彩虹桌攻击不可行。阅读

  • 也就是说,我会这样做身份验证部分:

    $hashedAndSalted = sha1($passLogin . $yourSalt);
    
    $sqlQuery = mysql_query("SELECT Email FROM Customers WHERE Email = '$email' AND Password = '$hashedAndSalted'");
    
    if (mysql_num_rows($sqlQuery) == 1) {
        echo 'Login successful';
    } else  {
        echo 'Could not login';
    }
    

    将您的查询替换为以下内容:

    $sqlQuery = mysql_query("SELECT count(*) from Customers
                    WHERE Email = '".$email."' and Password = '".sha1($passLogin)."'");
    

    请记住,始终手动连接字符串和变量,不要依赖PHP来完成这项工作。另外,您忘记了分号
    在那一行之后。在PHP中,每一行都必须附加一个分号。

    您确定数据库中的密码已经过哈希处理了吗?在PHP而不是MySQL中进行散列也是很常见的。别忘了使用随机salt,以确保相同的密码被散列到不同的人的不同值。@philfreo,我对使用SHA1非常陌生。我在数据库中看到的内容看起来已经散列了。当我填写自己的登记表时,我做了一些假账。在数据库中存储的密码不是我编写的密码,而是随机字符和数字的40个字符长。请考虑Sa1是否真的是正确的使用。“Rainbow表已经足够了:您需要了解的关于安全密码方案的内容”这篇文章值得思考:不,不是这样,字符串中的sha1()不会执行该方法。是的。您将始终生成相同的散列,因为您正在散列常量。还有,“记住总是手动连接字符串和变量,不要依赖PHP来为您实现这一点。”?这是一个糟糕的建议。这不是一个糟糕的建议,因为它可以防止错误。它没有散列常量,虽然我编辑它之前的代码散列了错误的密码,但它不是常量:例如:$foo='bar';回音“$foo”;输出‘bar’(带引号)@Andrew当然是常数。单引号中的变量不进行插值。Touche。这就是我使用“.”运算符连接的原因。您如何知道
    $email
    $passLogin
    尚未正确清理?