我想要做的是:当用户在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';
}
?>
Run Code Online (Sandbox Code Playgroud)
Joh*_*ica 13
这段代码有很多问题:
1-你有一个SQL注入漏洞.
如果我输入' or 1=1 LIMIT 1 --用户名,无论如何我总是可以访问.
将您的代码更改为.
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
Run Code Online (Sandbox Code Playgroud)
请参阅:"Bobby Tables"XKCD漫画中的SQL注入如何工作?
2-你正在密码存储
这是一个巨大的不.结合SQL注入漏洞,黑客需要5分钟才能获得您网站上所有用户名和密码的列表.
将密码存储为salted哈希.
我喜欢使用用户名作为salt.
您使用以下方法存储密码哈希:
INSERT INTO users (username, passhash)
VALUES ('$username', SHA2(CONCAT('$password','$username'),512))
Run Code Online (Sandbox Code Playgroud)
并使用以下方法测试用户凭据:
SELECT * FROM users
WHERE username = '$username' AND
passhash = SHA2(CONCAT('$password','$username'),512)
Run Code Online (Sandbox Code Playgroud)
请参阅:PHP密码的安全散列和盐
和:与MYSQL sha1相关时什么是"salt"?
顺便说一下,使用带有512密钥长度的SHA2,SHA1不再安全,而MD5更加破碎.
3- A登录只能匹配1个用户
此代码:
if($numrows > 0)
Run Code Online (Sandbox Code Playgroud)
没有任何意义,如果你从数据库中获得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" }
Run Code Online (Sandbox Code Playgroud)
4-如果出现错误,请不要死,请调用例程重新启动连接
这段代码:
$result = mysql_query($sql) or die(mysql_error());
Run Code Online (Sandbox Code Playgroud)
测试很好,但在生产中你应该做类似的事情
$result = mysql_query($sql);
if ($result) {
//do the deed
} else {
//call error recovery routine
}
Run Code Online (Sandbox Code Playgroud)
错误恢复例程应重新连接到服务器,在日志中记录错误.如果错误无法修复,它应该向sysadmin发送一封电子邮件,然后才会死在服务器上.