use*_*680 4 php sql cookies hash session
显然,哈希用户名和密码并将它们保存为cookie并使用已清理的cookie数据登录对于您的人(或我的网站的安全性)来说不够好.
这种方法足够好吗?
注册程序:
$salt= date('U');
$username= hash('sha256', $salt. $_POST['username']);
$password= hash('sha256', $salt. $_POST['password']);
$token = hash('sha256', $salt. (rand(1,10000000000000000000000000000000000000000000)));
Run Code Online (Sandbox Code Playgroud)
要手动登录,用户键入他们的用户名和密码,它将通过哈希传递并匹配.
成功登录后,将为该用户创建两个厨师.一个持有未使用的用户名,另一个持有哈希令牌.
当用户访问时,如果设置了cookie,则站点会对用户名进行哈希处理,然后使用这两个值进行登录.
这种方法的优点是避免将用户密码存储在计算机的任何位置.有人可以破解令牌并访问他们的帐户,但至少我不会危及用户的密码......
回答MySQL real_escape字符串和cookie的人说,将用户数据存储在cookie中是错误的.这会转移问题吗?
为什么你需要存储密码,甚至是加密版本?您的网站是否在后端使用HTTP Basic auth或其他东西访问第三方API?
不幸的是,你的问题没有明确的答案."适当"对不同的人意味着不同的东西.有了安全问题,我不确定它是否足够"适当"或"足够安全".也就是说,这是我处理登录和密码安全的方式.在我的数据库users表中,我有3个与登录相关的列:
该username列是纯文本.该salt列是一个64个字符的随机选择的字母数字字符串.该passwordHash列是用户的密码与其salt值连接,然后不可逆转地进行散列.我使用sha256作为我的哈希.盐是64个字符,因为这是sha256产生的.为了在散列字符串中产生足够的可变性,最好具有至少与散列一样长的salt值.
当用户提交登录表单时,我会对用户名进行数据库查询.如果找不到用户名,我会向用户显示"无效的用户名和/或密码"错误.如果找到用户名,我将salt与密码连接起来,哈希,然后查看它是否等于该passwordHash值.如果不是,则向用户显示完全相同的错误.
无论用户名是错误的,还是密码错误,或两者兼而有之,最好显示完全相同的错误消息.你给黑客的线索越少越好.此外,每当用户更改密码时,我salt也会给他们一个新密码.在那个时间点做这件事真的很容易,并且它使盐值保持更新鲜.
这种每个用户具有不同盐的系统称为动态盐腌.如果黑客试图使用彩虹表来反向设计用户的密码,这会使黑客的工作变得非常复杂.更不用说以不可逆转的形式存储密码对于阻止任何人确定用户密码非常漫长,即使他们可以访问数据库和PHP代码.
这也意味着如果您的用户忘记了密码,则无法对其进行检索.相反,您编写系统只是将其重置为一个随机确定的新值,并将其发送给他们,同时强烈鼓励他们在再次登录时更改密码.您甚至可以编写系统,以便在下次成功登录时强制执行此操作.
我要求密码至少为8个字符.理想情况下,它还应该包括数字和特殊字符,但我还没有决定我应该要求它.也许我应该!
为了防止暴力攻击,我会跟踪前10分钟内所有登录失败的情况.我基于每个IP地址跟踪它们.在3次登录尝试失败后,系统使用该sleep()功能延迟响应进一步的登录尝试.我使用这样的代码块:
$delay = ($failedAttempts - 3);
if ($delay > 0) {
sleep($delay);
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,这比在发生严重失败后将用户锁定在账户之外要好得多.它减少了您将获得的客户支持查询的数量,并且对于根本无法记住自己的密码的合法用户来说更加优雅.蛮力攻击需要每秒进行多次尝试以获得任何效率,因此在一定n = x基础上延迟使他们无法进行任何远程攻击.
使用PHP会话跟踪登录会话.session_start()加载站点上的每个页面时调用.(如果您有一个公共header.php文件,这非常简单.)这使得$ _SESSION变量可用.当用户成功登录时,您可以使用它来存储您的站点需要的任何信息,以便知道用户已登录.我通常使用他们的用户ID,用户名,以及可能的特定于该站点的一些其他详细信息.但我不在这里包含密码或哈希值.如果某个黑客进入用户的会话数据(存储在您的服务器上),他们仍然没有机会以这种方式找到用户的密码.
当发生以下两种情况之一时,会发生注销:1)用户的会话cookie被删除,例如通过清除浏览器缓存或有时仅通过关闭浏览器窗口,或2)您的服务器删除其会话数据.session_destroy()当用户按下您网站上的"注销"按钮时,您可以通过呼叫强制执行后者.否则,您可以在一段时间后自动使会话过期.这可能涉及调整你的session.gc_*参数php.ini.
如果您在初始登录阶段后必须知道用户的密码,则可以将其存储在$_SESSION.这样做只要你的网站需要SSL连接而你已经做到这一点,所以如果没有网站,网站将无法工作.这样,密码就被加密了,因此可以防止数据包嗅探.但是要知道,如果黑客能够访问您服务器的会话数据,那么这就存在安全风险.