【问题标题】:best way to secure sessions (consulting)确保会话安全的最佳方式(咨询)
【发布时间】:2011-11-24 23:09:00
【问题描述】:

好的,是的,我已经阅读了有关此主题的其他 Q,但我还有几个问题,有些 Q 已经有好几年了。

无论如何,我正在为一家包含敏感客户信息的保险公司建立一个管理员 cp。例如密码、社会保险号和驱动程序#。

第一个问题: 什么更安全,php 会话或 cookie?根据我对 cookie 的理解,您可以将它们限制为仅 http 和 SSL。不知道您是否可以对 php 会话执行相同的操作。似乎php会话也只是快速cookie。 Cookie 似乎更灵活且同样可靠。仅供参考,我仅使用带有 http 和 SSL 的 Cookie。在我的案例中是否有充分的理由使用 php 会话?

第二个问题: 我的会话/登录工作如下: * 密码被加盐和散列 * 会话长度为 32 个随机字符 * 当用户输入正确的密码并绑定到用户的 IP 时,会话被验证 * 当用户登录时,会话 ID 和用户密码分别存储在 2 个单独的 cookie 中

如果会话通过用户 pw 验证并绑定到用户的 IP,我可以只拥有会话 Cookie 并删除 pw cookie吗?因为我认为这有点多余,因为只有输入正确的密码才能获得会话 ID。我宁愿将会话 ID 暴露在 cookie 中而不是 pw(尽管它仍然是加盐和散列的)。

如果我的两个问题能得到解答,不胜感激。欢迎提供额外的安全建议:D

注意:会话与 IP 相关联,因为它大大提高了安全性。当我们的数据库中有 SSN 和驾驶执照#s 时,我宁愿让我的用户在他们的 IP 发生变化时输入他们的密码有点不便。也只有 3-5 个用户可以访问系统。

【问题讨论】:

  • 为什么你需要将密码存储在 cookie.session_id 上 https 应该足够了..你可以有会话超时..

标签: php security session session-cookies


【解决方案1】:
  1. 会话存储在服务器上,cookie 存储在客户端(浏览器)上。属于用户的会话数据由 cookie(会话 ID)标识。

我会说会话更安全(您也可以应用一些加密以获得更好的安全性)。

  1. 不要将用户密码存储在 cookie 中。即使它被散列,也不是一个好习惯。 您可以存储一个加密的序列化数组,其中包含验证用户所需的信息:ip、用户代理、用户名、用户 ID,但不包括密码。

您还可以使站点(管理员 CP)仅在 SSL 上运行。这样数据在网络上就不会以纯文本形式显示。

【讨论】:

  • 会将会话 ID 存储在 cookie 中,并在用户刷新/重新访问时将其拉出。我的会话存储在数据库中,因此当用户的 cookie 中有会话 ID 时,我会抓取它并检查它是否存在于数据库中。如果用户通过 cookie 提供的 session id 存在,则验证 IP。到目前为止,这就是我的会议的工作方式。破解管理员 cp 的唯一方法是窃取会话 ID 并位于同一网络/IP 下。我还让会话在 24 小时内到期,并删除超过 7 天的恶意会话。
  • 我读到用户代理不是用作身份验证的好主意,因为它可能是欺骗性的。此外,一些浏览器会在页面之间更改其用户代理。
【解决方案2】:

cookie 中的密码是否经过加盐和哈希处理?当心 - 这个问题没有好的答案!

将会话绑定到 IP 确实没有多大帮助 - IP 很便宜,容易被欺骗等。我会使用 SSL、cookie/会话,甚至可能是一次性 cookie,在每次网页浏览时消耗和重置。

【讨论】:

  • 是的,pw cookie 是加盐和散列的。
【解决方案3】:

会话存储在服务器上,可以是数据库、文件系统、内存缓存等。用户通过会话 ID 与会话相关联,会话 ID 存储在客户端的 cookie 或 URL 中。两者都不是“非常非常”安全的,因为会话劫持可以通过窃取会话 ID 来实现。但是,由于您已将会话 ID 绑定到 IP,因此您已经做得足够了。

现在将密码存储在 cookie 中。不要这样做。 从不。即使它们是经过哈希处理的,攻击者最好不要看到它们。如果它们仅存储在数据库中,您将获得另一个级别的安全性,因为在这种情况下,攻击者还必须闯入数据库。

如果您在执行任何可能危及系统的重要操作之前使用 session_regenerate_id() 重新生成会话 ID,这会有所帮助。另外,请查看 XSS 和 CSRF 攻击以及防止它们的机制,例如表单令牌。

【讨论】:

    【解决方案4】:
    • 永远不要将用户的密码存储在 cookie 中,不以任何形式表示。
    • 经常重新生成会话 ID
    • 使用强散列(无 MD5),如 SHA512(同时考虑 stretching 散列)
    • 敏感数据应该在服务器端的会话存储中:
      • Cookie 随每个请求一起发送到 Cookie 域,因此大大增加了被拦截的机会。服务器端会话数据仅在需要时输出。
    • 将会话绑定标识符作为身份验证令牌传递给每个敏感请求,以避免CSRF
    • 不要直接将会话绑定到 IP。使用同一个 AP 或私有 ISP 的两个人拥有相同的 IP,会话可能会混淆。
    • SSL 是not magical。不要过多地转发它。

    【讨论】:

    • 所以即使脚本没有请求cookie数据也会发送?
    • 我看不出如果在同一个网络下会话会如何混淆。您需要具有相同的 ip 和会话 id(随机 32 个字符长)。阅读您的答案,我想我会切换到 php 会话。
    • 是的。如果脚本位于 cookie 域内。这也适用于图像和其他静态内容。
    • 不要直接将 [...] 绑定到 IP
    • 我会说你每 3 分钟或 5 个请求重新生成一次,无论哪个先出现。 ch.php.net/manual/en/function.session-regenerate-id.php
    猜你喜欢
    • 2016-07-20
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多