php mysql中的用户名和密码验证

时间:2011-09-01 08:20:14

标签: php mysql

我希望能够做的是:当用户在index.html页面上的表单中输入用户名和密码时,如果它们与数据库中的内容匹配,则会将其发送到下一页; userlogin.php。 如果他们的用户名或密码不正确,则会要求他们在index.html页面上重新输入他们的详细信息,并在表单文本框上方显示“您的用户名不正确”或“您的密码不正确”等错误。如果需要,我可以粘贴此代码。

我可以更改此文本字体颜色,例如红色吗?

这是我目前为userlogin.php页面提供的代码

<?php
mysql_connect("Server", "root", "Gen") or die("Couldn't select database.");
mysql_select_db("generator") or die("Couldn't select database.");

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

$sql = "SELECT * FROM users WHERE Username = '$username' AND Password = '$password' ";
$result = mysql_query($sql) or die(mysql_error());
$numrows = mysql_num_rows($result);
if($numrows > 0)
   {
    echo 'Your in';
   }
else
   {
    echo 'Your not in';
   }
   ?>

2 个答案:

答案 0 :(得分:13)

这段代码有很多问题:

1-你有一个SQL注入漏洞。

如果我输入' or 1=1 LIMIT 1 --作为用户名,无论如何我总是可以访问 将您的代码更改为。

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 

请参阅:How does the SQL injection from the "Bobby Tables" XKCD comic work?

2-您将密码存储在明文中 这是一个巨大的不。结合SQL注入漏洞,黑客需要5分钟才能获得您网站上所有用户名和密码的列表。

将密码存储为salted哈希。

我喜欢使用用户名作为salt。

使用以下方法存储密码哈希:

INSERT INTO users (username, passhash) 
VALUES ('$username', SHA2(CONCAT('$password','$username'),512))

您可以使用以下方式测试用户凭据:

SELECT * FROM users 
WHERE username = '$username' AND 
passhash = SHA2(CONCAT('$password','$username'),512)

请参阅:Secure hash and salt for PHP passwords
并且:What is "salt" when relating to MYSQL sha1?

BTW,使用长度为512的SHA2,SHA1不再安全,MD5更加破碎。

3-登录只能与1个用户匹配
这段代码:

if($numrows > 0) 

没有任何意义,如果你从数据库中获得2行,这是一个明显的迹象,有人攻击了你的系统。测试应该是:

if($numrows > 1) { //send email to sysadmin that my site has been hacked }
else if ($numrows = 0) { echo "wrong username or password" }
else { echo "welcome dr. Falken" }

如果出现错误,请立即死亡,调用例程重新启动连接

此代码:

$result = mysql_query($sql) or die(mysql_error());    

测试很好,但在制作中你应该做类似的事情

$result = mysql_query($sql);
if ($result) {
  //do the deed
} else {
  //call error recovery routine
}

错误恢复例程应重新连接到服务器,在日志中记录错误。如果错误无法修复,它应该向sysadmin发送一封电子邮件,然后才会死在服务器上。

答案 1 :(得分:2)

首先,您的代码容易受到SQL注入攻击。使用PDO和prepared statements来解决此问题。其次,你很容易存储未加密的用户名。这非常不安全。使用hashing function加密密码,并在运行查询之前加密提交的密码以获得匹配。着色输出很简单:

echo '<span style="color:red">Your not in</span>';

并使用sessions实际登录用户。成功查询用户表以获取用户名/密码组合后,将返回的user_id存储在$_SESSION变量中。在需要保护的每个页面上,只需检查是否存在$_SESSION['user_id'];如果不存在,您的用户需要登录,以便将其重定向到登录表单。

那应该为你做的伎俩;)