0

我有代码:

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 注入的保护,那么安全风险相对较少,对吧?

我是来问的,因为这似乎是一个复杂问题的过于简单的解决方案。我访问过的所有文档和网站都实施了更为复杂、令人困惑、有时甚至不安全的验证用户是否登录的方法。

这安全吗?

4

2 回答 2

2

请不要采取错误的方式,但如果您不了解 SSL,则不应处理金钱。

SSL 用于加密浏览器和服务器之间的通信。没有它,浏览器和服务器之间网络上的任何人都可以看到以明文形式发送的每个请求/响应——密码、帐户 ID、信用卡号(?)等。

http://这就是地址和地址的区别https://。它需要服务器和代码更改

服务器需要来自受信任机构的证书才能启用 SSL(以及一些配置更改),但这还不够。您还需要确保您的代码执行诸如仅发出securecookie 之类的事情 - 即无法发送的 cookiehttp,应检查在服务器配置错误的情况下传入请求是否启用 SSL 等等。这是一个庞大的话题,并且我无法在一个答案中告诉您足够的信息以确保您的安全。

作为绝对最低要求,您的代码应该能够抵御所有OWASP 十大漏洞。这是确保任何网站安全的绝对基础。

您还需要阅读SSL/TLS 和一般加密。这将使您大致了解握手/消息是如何来回传递的。

于 2013-08-25T12:30:50.047 回答
1

您不应该md5(time())用来生成会话 id,这不安全。时间是线性的,可以猜测,例如某些网站显示用户何时登录,您可以使用此信息和蛮力劫持他的会话ID。

第二件事,你也可以在随机时间进行暴力破解,你很有可能会得到一些随机的用户会话 ID。此外,两个用户很有可能拥有相同的第二件事,即如果两个用户同时登录,他们将拥有相同的会话 ID。

看看这个精彩的演讲(DEFCON 18: How I Met Your Girlfriend 1/3),我看了很长时间,我不记得细节,但我记得演讲者对会话弱点提出了系列观点。此外,请参阅OWASP wiki,它在 Web 安全和会话安全方面有大量资源。

于 2013-08-25T12:50:18.770 回答