Session ID of md5(time())


Session ID of md5(time())

我有代码:

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

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

这安全吗?

请不要误解这一点,但如果你不了解SSL,你就不应该处理金钱。

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

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

服务器需要来自可信机构的证书才能启用SSL(以及一些配置更改),但这还不够。你还需要确保你的代码只发布secure cookie,也就是说,不能通过http发送的cookie,在服务器配置错误的情况下,应该检查传入请求是否启用SSL,等等。这是一个巨大的话题,我无法用一个答案告诉你足够多的信息来确保你的安全。

作为绝对最低要求,您的代码应该是安全的,不受所有OWASP Top 10漏洞的影响。这是绝对的面包和黄油的东西,使任何网站安全。

您还需要了解SSL/TLS和一般加密。这将让您了解握手/信息是如何来回传递的。

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

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

看看这场精彩的演讲(DEFCON 18:How I Met Your Girlfriend 1/3),我看了很长时间,我记不清细节了,但我记得演讲者就会话弱点提出了一系列观点。另外,请参阅OWASPwiki,它有关于网络安全和会话安全的大量资源。