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

Moh*_*mar 1 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';
   }
   ?>
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发送一封电子邮件,然后才会死在服务器上.