php - 比较php中的密码并将其发送到数据库

标签 php

我正在登录页面,我是一名初学者程序员到数据库

谢谢

这是我目前所拥有的:

<?php

$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

if ($&&$password&&$Email&&$Firstname&&$Lastname)
{

if int strcmp ( string $password , string $password2 )
{

$connect = mysql_connect("localhost","root","power1") or die("couldn't connect!");
mysql_select_db("members") or die ("couldnt find db!");

INSERT INTO users (Firstname, Lastname, Email, password,...)
VALUES ($Firstname, $Lastname, $Email, $password, $password2,...)

}
else
    die("Your Passswords do not match") 

}
else
    die("Please enter your credentials");

?>

最佳答案

我认为你来这里寻求帮助真是太好了,我很高兴你已经深入研究了你想做的事情。

<?php

$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

到目前为止,这很棒。您创建了一些变量,例如 $Firstname,它们比 $_POST['Firstname'] 更易于阅读和键入。许多 PHP 程序员都会这样做。

但是,您必须注意的是,$_POST 数组中不能保证存在任何内容。因此,像 $_POST['Firstname'] 这样的东西可以是未定义的。因此,您必须先测试您想要的值是否存在。

if ($&&$password&&$Email&&$Firstname&&$Lastname)
{

我相信这里是您想要测试 POST 值是否存在的地方。不幸的是,这为时已晚,因为上面已经发生了错误。您应该考虑以这种方式启动您的程序。

<?php

if (isset($_POST['Firstname']) && isset($_POST['Lastname'])
 && isset($_POST['Email'])     && isset($_POST['password'])
 && isset($_POST['password2']))
{
    $Firstname = $_POST['Firstname'];
    $Lastname = $_POST['Lastname'];
    $Email = $_POST['Email'];
    $password = $_POST['password'];
    $password2 = $_POST['password2'];

    // rest of script...
}

在这个例子中,我们在开始使用之前确保我们想要使用的所有 POST 值都确实存在。如果缺少 POST 值,此示例将不会遇到任何错误。

if int strcmp ( string $password , string $password2 )
{

你的想法是对的,但你实际上并不需要在 PHP 中使用 strcmp 来比较两个字符串是否相等。相反,您可以简单地使用 == 运算符。

if ($password == $password2)
{

如果你真的想使用strcmp,我们可以引用文档页面http://php.net/strcmp如果字符串相等,函数返回零。因此,我们可以使用它。

if (strcmp($password, $password2) == 0)
{

确定密码匹配后,您就可以对密码进行哈希处理了。请注意,散列与加密不同:散列是单向的,这意味着一旦对密码进行散列,您就无法获取散列码并取回密码;另一方面,加密可以反转。因为我们从不希望坏人知道某人的密码到底是什么,所以我们应该对密码进行散列而不是加密。

当然,哈希的强度仅与哈希算法一样好,并且有很多可用的。 sha1 非常强大,可以在您对编程更加熟悉之前一直使用它。

$password_hash = sha1($password);

您已完美连接到数据库。这里没有错。

$connect = mysql_connect("localhost","root","power1") or die("couldn't connect!");
mysql_select_db("members") or die ("couldnt find db!");

但是,您需要使用一种特殊的方式来查询数据库。

INSERT INTO users (Firstname, Lastname, Email, password,...)
VALUES ($Firstname, $Lastname, $Email, $password, $password2,...)

这个查询需要通过将它作为字符串传递给 mysql_query 函数来提供给数据库。

$sql_Firstname = mysql_real_escape_string($Firstname);
$sql_Lastname = mysql_real_escape_string($Lastname);
$sql_Email = mysql_real_escape_string($Email);
$sql_password_hash = mysql_real_escape_string($password_hash);

$sql = "INSERT INTO users (Firstname, Lastname, Email, password)"
      ."`VALUES ('$sql_Firstname', '$sql_Lastname', '$sql_Email', '$sql_password_hash')";

mysql_query($sql);

注意几件事。首先,我将 $password_hash 存储在数据库中,而不是 $password。这就是我们想要的,因为我们永远不希望坏人破解数据库并找出人们的密码。其次,请注意我没有直接使用 $Firstname 来构造 SQL 字符串;相反,我只使用 $sql_Firstname,它等同于 $Firstname,但有特殊字符被正确转义——这就是 mysql_real_escape_string 函数做。这对于保护自己免受 SQL 注入(inject)攻击至关重要,我建议您阅读以下内容:http://php.net/manual/en/security.database.sql-injection.php .

}
else
    die("Your Passswords do not match") 

}
else
    die("Please enter your credentials");

你的程序的其余部分做得很好;故意处理这些可能的错误情况对您有好处。确保您继续考虑所有可能性并妥善处理每一种可能性;这样做将有助于防止代码中出现未知错误和安全漏洞。

关于php - 比较php中的密码并将其发送到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6559081/

相关文章:

php - 如果用户输入数据失败,如何确保MySQL中的列不显示默认的 "0"?

php - ACL授权失败后ZF3重定向

PHP PDO异常 : "SQLSTATE[HY093]: Invalid parameter number"

php - 在 pdo 中绑定(bind)多个数组

php - 准备好的语句错误

php - PHP 中内存清理的最佳方法是什么? (5.2)

php - PDO bindParam 变成一条语句?

php - 什么更有效率?大量 SQL 查询或循环遍历它们?

php - Symfony 控制台 - 显示不带参数的命令的帮助

php - 在自己的插件中为 Wordpress Media Uploader 自定义上传目录