所以我期待设计一个高安全性的php用户系统。我决定从登录/会话结束开始。我希望有人看看我的计划并通知我漏洞和安全漏洞。
这是我第一次尝试在这样的级别上创建系统,如果您发现问题,可以向我发送资源以帮助我解决问题。
连接数据库 *我将使用MYSQL,因此它是您的标准数据库连接存储在站点根目录之外的文件中。
注册 *注册将是一个简单的表单,我使用存储在外部文件中的函数来清理输入并防止SQL注入
// A function to sanitize input for data being input into a database
function sanitizeinput($rawinput) {
$sanitizedinput = mysql_real_escape_string($rawinput);
return $sanitizedinput;
}
我有什么需要这个功能来保护它吗?
要使用SHA-512或BCrypyt对密码进行哈希处理,我做了一些研究,并且看到很多人说MD5不再足够安全,我想确保最好的安全性,所以应该做什么我用哈希密码。
我还使用以下代码片段添加了一个随机生成的salt,该片段附加在散列密码的前面,然后重新散列。然后,盐是以纯文本格式存储在数据库中,如果我考虑加密这个以获得额外的安全性吗?
当用户登录时,将对其输入的密码进行哈希处理,添加并重新添加数据库中的salt,然后将其与存储在数据库中的密码进行比较。
如果密码匹配,则会创建会话,然后锁定到单个IP地址和用户代理。会话将在短时间后过期。该会话仅用于存储登录令牌,用户名和密码当然不会存储在会话中。
当用户登录时,令牌将被存储到数据库中,并为其分配用户名,这样我们就可以使用令牌安全地从数据库中提取用户详细信息,而不会将风险存储在会话中。
如果密码不正确,用户将无法登录...呃,我也会对此强制执行暴力保护,经过三次尝试后,用户IP和用户代理将被锁定15分钟和十分之后失败的尝试在防火墙中被阻止。
我觉得我忘了什么,但我不能直接把手指放在上面。
非常感谢任何帮助或建议。
答案 0 :(得分:2)
我绝不是这方面的专家,但首先要切换到PDO以连接到mySQL。这似乎有点困难,但如果正确使用,可以100%保护您免受任何试图进行sql注射的人的影响。对于加密,我使用它来为每个用户生成一个随机盐:
function generateSalt($length, $chars)
{
$randString = '';
$charLength = strlen($chars);
for($count = 0; $count < $length; $count++)
{
$randString .= substr($chars, mt_Rand(0, ($charLength-1)), 1);
}
return $randString;
}
如果你给它一个字符串,它会从该字符串中的字符中吐出给定长度的盐。然后我相信我使用河豚是因为它不容易破裂。
您是否考虑过XSS漏洞?我还没有,需要继续这样做。确保用户不会将html或javascript代码注入到您的数据库中,以后可能会在页面的某个位置显示。
祝你好运。编辑: 这是我用于“哈希”的内容
$cryptOptions = '$2y$10$' . $salt . '$';
$hashedPassword = crypt($password1, $cryptOptions);
答案 1 :(得分:0)
为什么要将盐存储在数据库中?假设某人有权访问您的数据库 - 他将拥有密码和盐。如果您的盐是硬编码的或其他地方,他只会使用哈希密码。如果攻击者可以完全访问您的系统,那么这无关紧要。
此外,您是否会使用https进行登录操作?
假设您有多个数据库连接并且它们具有不同的编码 - 您应该将正确的链接传递给您的清理程序功能。顺便说一下,将mysql_real_escape_string包装到另一个不添加东西的功能(但实际上限制了实际功能)的好处是什么? 我鼓励你使用PDO。
答案 2 :(得分:0)
几个月前在Java中实现了类似的原型。
从我看来,它看起来与我的相似。我做过的一些事情(或者至少是计划好的事情),我从你的解释中看不出来
希望能给你一些额外的想法。
答案 3 :(得分:0)
道歉我无法评论m02ph3u5的帖子所以我必须发布另一个答案。在数据库中存储盐是完全标准的。盐的存在的原因是为了防止彩虹桌上的暴力强迫。彩虹表是预先计算的哈希值,可以快速破解数据库中的所有密码。使用盐,即使是攻击者已知的盐,也不能预先计算彩虹表。这意味着人们必须暴力破解每个密码。这很好,因为如果你使用类似河豚的算法,那么破解数百个密码变得不切实际。
这不是让密码无法破解的方法。这是一种破解所有密码不切实际的方法。
编辑:如果他们获得了对您的数据库的访问权限,他们将只有您的哈希密码和盐。他们仍然需要明文密码。
EDIT2:所以我们的想法是他们可以访问该网站,因此我们当时唯一想做的就是保护密码。通常人们会重新使用密码。哈希真的只是为了保护那些人。