安全登录和安全页面检查PHP的最佳实践


Secure login and security page check best practices with PHP

想了解一些人对以下内容的看法:

  • 查询网站上每个安全页面的数据库,以便在会话/cookie和数据库值之间进行盐水和加密代码检查,这是一种好的/最佳的做法吗

  • 依赖加盐和加密的会话和cookie(其中密钥和值都是加盐和加加密的)是好的/最佳做法吗

因此,用户id和访问级别要么从每个安全页面的数据库中提取,要么从加密的会话/cookie值对中提取。


结论

这就是我选择做的:

登录

  1. 验证用户名&md5(密码)在数据库中并且是正确的
  2. 启动会话
  3. 会话存储加密密钥&值对:user_id、admin、access_level
  4. 通过加入REMOTE IP&远程用户代理&配置加密密钥,对每个加密,将字符串连接在一起,然后再次加密
  5. 使用加密的密钥将此值存储在数据库和会话中
  6. 用户现在已登录

对于页面验证:

我将选择两个级别的页面用户访问验证:

  1. 低优先级安全任务,例如详细列出列表、上传图像、主要选择查询
  2. 高优先级安全任务,例如删除&更新

低优先级页面检查:

  1. 只需检查加密会话密钥和user_id、access_level&access_key的存在

高优先级页面检查:

  1. 查询数据库中的会话access_key匹配,并重新设置user_id、access_level的会话值

附加:

我将添加一个IP记录功能,它将跟踪数据库中的IP登录尝试,如果该IP登录失败超过10次,该IP将被禁止。

当然不是来自cookie。会话cookie应该是一个完全没有意义的官样文章的伪随机斑点。这个官样文章是存储在服务器端的会话的id。这个会话数据可以存储在数据库或文件系统中(PHP会话默认情况下是这样)。您使用用户存储的凭据对其进行一次身份验证,然后为他打开一个会话,并在该会话中存储他的用户id和您需要的任何其他内容。然后,用户通过其无意义的会话cookie和属于它的数据进行识别和身份验证。

不过,偶尔检查会话中的数据是否仍与数据库同步是有争议的。例如,用户具有特定的"访问级别",当用户进行身份验证时,您将其存储在会话中。现在您可以更改用户在数据库中的访问级别;会话仍将具有该数据的旧副本,并且用户仍将能够访问他可能不再被允许访问的级别。根据规范数据库存储验证这些数据的频率由您决定。

您可以将"敏感"数据放在cookie中,它被许多系统使用,例如CodeIngnitter。

为了最大限度地降低风险,请确保您的加密货币得到正确实施。

如果您的加密货币正常,那么会话cookie加上数据库查找和cookie中存储的值之间没有太大区别。

在这两种情况下:

如果可能,请使用HTTPS。

仅使用HTTP_only cookie,因此会话cookie不会显示在document.cookie 中

删除任何可能显示cookie信息的"反射"页面,phpinfo()页面就是一个很好的例子。

请确保将IP地址的某些部分添加到混合中,也许还会添加用户代理。

如果有人设法获取了cookie或会话cookie,它就不能模拟用户,除非它知道用户代理,并且可以从该IP或IP类发送HTTP请求。