我有代码:
if ($usernamelogin == $dbusername && $passwordlogin == $dbpassword)
{
$hash = md5(time());
mysqli_query($connection, "UPDATE users SET sessionid='$hash' WHERE username='$usernamelogin' AND password='$passwordlogin'");
$_SESSION['id'] = $hash;
$_SESSION['un'] = $usernamelogin;
}
else
{
echo ('Wrong username or password.');
}
然后我使用$ sessionid,SQL sessionid和用户名来验证用户是否真实。这意味着,假设我有针对SQL注入的保护,那么安全风险相对较小,对吧?
我来这里问,因为这似乎是解决复杂问题的过于简单的解决方案。我去过的所有文档和网站都实现了更加复杂,令人困惑,有时甚至是不安全的验证用户是否登录的方法。
这安全吗?
答案 0 :(得分:2)
请不要采取错误的方式,但如果您不了解SSL,则不应该处理钱。
SSL用于加密浏览器和服务器之间的通信。没有它,浏览器和服务器之间的网络上的任何人都可以看到以明文形式发送的每个请求/响应 - 密码,帐户ID,信用卡号(?)等。
这是http://
地址与https://
地址之间的差异。它需要服务器和代码更改
服务器需要来自受信任机构的证书才能启用SSL(以及一些配置更改),但这还不够。您还需要确保您的代码只执行问题secure
cookies - that is, cookies that can't be sent over http
,如果在服务器配置错误等情况下检查传入请求是否启用SSL等等。这是一个很大的主题,我无法告诉您一个让你安全的答案。
作为绝对最低要求,您的代码应该对所有OWASP Top 10 vulnerabilities都是安全的。这是使任何网站安全的绝对面包和黄油。
您还需要阅读SSL/TLS and encryption in general。这将为您提供有关握手/消息来回传递的概述。
答案 1 :(得分:1)
您不应该使用md5(time())
来生成会话ID,这不安全。时间是班轮,可以猜测,例如一些网站显示用户何时进入,您可以使用此信息和蛮力来劫持他的会话ID。
第二件事,你也可以随机抽出时间,你很有可能获得一些随机的用户会话ID。此外,如果两个用户同时登录,则两个用户很可能拥有相同的会话ID。
看看这个精彩的演讲(DEFCON 18: How I Met Your Girlfriend 1/3),我看了很长时间,我无法记住细节,但我记得发言者对会话弱点提出了系列观点。另请参阅OWASP wiki,它在Web安全性和会话安全性方面拥有丰富的资源。