我希望能够做的是:当用户在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';
}
?>
答案 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']
;如果不存在,您的用户需要登录,以便将其重定向到登录表单。
那应该为你做的伎俩;)