PHP web应用程序中安全登录的最佳实践是什么


What are the best practices for secure login in PHP web application?

我想澄清一下安全web登录的一些最佳实践,以及针对Active Directory进行身份验证的PHP应用程序的持久登录。

  1. 在登录时,实现后重定向-获取模型有意义吗?将密码存储在$_SESSION中可能不是一个好主意。

  2. 身份验证后,检查是否设置了特定的$_SESSION字段是否是检查用户是否登录的有效且安全的方法?

在任何时间点以纯文本形式存储密码都不是一个好主意。

1) 我不建议登录页面使用PRG模式。可能发生的最糟糕的事情是此人登录了两次。还不错。

存储在$_SESSION中的数据通常不能由客户端读取。它们存储在服务器上,恶意员工或黑客可能会访问它们。

2) 身份验证后,可以检查会话以查看是否有人登录。有人可能会伪造他人的会话id,但只要您运行SSL,这种可能性就很小。我建议将IP、用户代理和其他可以轻松获得的信息存储在$_SERVER变量中,并偶尔或每次进行比较。减少有人入侵他人会话id的可能性。

登录时重新生成会话id对我来说没有多大意义,尽管我不知道你的具体情况。我的建议是在注销时简单地重新生成它。此外,如果您愿意,还可以在会话中添加超时功能。

您应该只存储一些东西来区分匿名用户和登录用户,比如会话中的is_valid关键字。

这意味着任何捕获会话id(这是在每次请求时发送的cookie值)的人都将获得会话。这被称为会话劫持,现在是您唯一应该担心的事情。

保护你免受这种攻击的方法是在HTTPS中处理所有连接的用户页面,同时他们登录…或者攻击没有人会进行XSS攻击或会攻击你的用户wifi热点以获取会话id。

事实上,它们还有其他几种方式,比如存储客户端浏览器的某种签名(用户代理,也许IP在移动代理、已安装插件列表等方面会有问题),并对此进行很好的散列。把它储存在饼干里,有时检查一下编辑:您也可以查看我对此问题的回答,了解一些跟踪&识别一个用户浏览器可以用于确保会话仍然由同一用户使用。

永远不要将密码存储在会话文件中,永远不要将密码存储到任何位置。