下午好。基本上我有一个页面与登录表单,用户被要求输入他们的用户名和密码。然后我将这些用户名和密码的散列版本与MySQL中的密码数据库进行匹配。
现在,鉴于我不知道黑客/曝光者有什么能力,我只是想永远不要从数据库中检索正确密码的散列版本,并在服务器上进行比较。我已经搜索了谷歌和MySQL教程网站,但我似乎不能得到一个明确的答案(我可能在这里淹死在浅水)。基本上这就是我想要做的:
- 用户输入用户名+密码。 我把这个信息通过一个存储过程转发给MySQL。
- 如果找到匹配,存储过程返回TRUE/FALSE(1或0无关)。
感谢您的宝贵时间。
我不太确定你在找什么,但如果我理解正确的话,你想做这样的事情:
SELECT password FROM users WHERE username = '$username';
,然后将密码与PHP进行比较,您可能会担心这可能成为一个安全问题。
我不认为从安全的角度来看有什么不同。检查密码是否正确的常用方法是:
SELECT COUNT(*) FROM users WHERE username = '$username' AND password = '$hashedPassword';
如果count == 1,用户给出了正确的密码。您可以看到,如果密码不匹配,MySQL在任何时候都不会给出实际的密码。即使有,黑客也几乎不可能获得这些信息。如果他们可以,他们已经劫持了你的服务器,这是你最小的问题。
在向数据库发送凭据时仅使用mysql_real_escape_string
。这将防止SQL注入。
<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
http://www.php.net/manual/en/function.mysql-real-escape-string.php