【问题标题】:Security in php session cookiesphp 会话 cookie 中的安全性
【发布时间】:2012-04-12 23:43:12
【问题描述】:

当涉及到 php 中的会话 cookie 时,我试图了解安全性。我已经阅读了很多关于它的内容,但我仍然缺乏细节。我需要基础知识,有人来展示示例。

例如:我是否在每个会话 cookie 之前放置 session_regenerate_id()?我还要考虑什么。我在询问代码中的细节 - 如果可能的话,示例。

非常感谢。

我在登录后使用了 4 个会话 cookie。

SESSION "site_logged_in" = true
SESSION "site_user_nr" = the number of the user to access user_table_nr
SESSION "site_user_id" = the user's id to use when changing data in tables
SESSION "site_user_name" = the name of the user to display on page

当我检查用户是否有访问权限时,我会检查是否设置了所有 4 个 cookie,以及 site_logged_in 是否设置为 true。

有没有更好的方法?我对此有完全错误的想法吗?用户容易被黑吗?

【问题讨论】:

  • 无论您选择使用多少个会话变量,您实际上都在使用一个 cookie。我建议阅读一下PHP session handling,也可能阅读一下 HTTP cookie。
  • 首先,将所有变量合并为 1 并用冒号分隔。所以true:1:1:thomas。然后使用list($site_logged_in,$site_user_nr...) = explode(SESSION_COOKIE_HERE);
  • Ben Carey:你愿意为你刚才所说的编写整个代码吗?
  • 我不会建议 Ben 的建议,这是处理 $_SESSION 已经提供的非常低效的方法。

标签: php security authentication session-cookies


【解决方案1】:

事实上,您的网站只需要一个会话。当您调用 session_start() 会话正在服务器上创建并且用户自动获取会话 cookie。认为会话是放置在服务器上的某种容器,您可以在该容器中放置任何您想要的东西。然而,会话 cookie 只是访问服务器上该容器的关键。

这意味着您可以安全地将一些数据放入 $_SESSION 中,并且只有具有匹配会话 id 的 cookie 的用户才能读取它。

关于用户被黑。是的,只要您不使用 HTTPS 连接,它们就会被黑客入侵,因为 cookie 和所有其他数据都是以明文形式传输的,因此如果有人拦截用户 cookie,他就可以访问存储在会话中的数据。

【讨论】:

    【解决方案2】:

    始终使用安全令牌来记录用户。可以使用crypt() 生成此安全令牌。用户登录后,定期更改安全令牌,直到他们注销。还要保留所有会话变量的服务器备份,包括安全令牌(在数据库中)。这也将帮助您跟踪用户登录历史记录。

    还有一个个人建议:如果没有使用任何散列函数或 crypt() 等函数对其进行加密,切勿将数据库中的任何数据用作会话变量。

    【讨论】:

    • 谢谢!但这需要更多的数据库流量吗?就像每次用户做某事一样,我都会更改安全令牌。也许这不是问题?
    • 是的,这会产生流量。但是您不必更改导航等小操作的安全令牌。您可以在密码更新等重大操作之前更改它。
    【解决方案3】:

    会话信息存储在服务器端。您应该检查的是他们是否已登录,并且他们存在/可以登录(在删除/禁止的情况下)。

    当您检查它们是否存在/可以登录时,您可以从数据库中提取其他信息,例如姓名、nr 等。您真正需要的只是一个名为“logged_in_user”的密钥或存储登录用户 ID 的东西。正如 Alex Amiryan 所说,cookie 是可以复制的,因此您可能还想在 session 中存储最后访问视图的 IP 地址,以便您可以尝试确保安全。

    【讨论】:

    • 但是没有人知道cookie的名称,对吧?它被称为“logged_in”?
    • 而且我必须不断地从数据库中获取用户的数据,而不是把它放在会话 cookie 中。但也许这就是这样做的方法?
    • 会话密钥(例如 $_SEESION['site_logged_in'])在服务器外部不可见。 cookie 包含一个引用会话数据的唯一键。会话数据不会离开服务器,除非你让它离开。是的,您必须不断地从数据中获取用户,但除非您找到另一种检查用户是否存在的方法,否则就是这样做的。
    • 我可以将 HttpOnly 设置为 seesion cookie 吗?如何做到这一点?
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多