【问题标题】:safest way to create sessions in php在 php 中创建会话的最安全方法
【发布时间】:2010-10-19 15:15:01
【问题描述】:

我正在开发一个网站并希望创建用户登录和会话。检查会话是否存在的最安全方法是什么(如 cookie 或会话变量检查),或者在 php 中使用会话有什么更好的方法?

【问题讨论】:

    标签: php session session-variables


    【解决方案1】:

    session_id() 返回当前会话的会话 ID,如果没有当前会话(不存在当前会话 ID),则返回空字符串 ("")。

    http://de.php.net/manual/en/function.session-id.php

    但这只是告诉您会话是否处于活动状态。

    大多数时候,我只是在每个脚本的开头调用session_start();(即使用户没有登录)。登录时,我使用用户 ID 或用户对象设置 $_SESSION['user']。注销时,我只是unset($_SESSION['user']);。通过检查empty($_SESSION['user']),我可以检查是否有人仍在登录。如果您在会话中的其他位置存储与用户相关的信息,请不要这样做,否则下一个登录的人可能会得到他不应该看到的信息(在这种情况下使用 session_destroy();)。

    但是安全吗?只需通过 GET/POST url 重写(仅限 cookie)停用会话 ID 传播,因此它们不会以可以缓存或分发给其他人的 URL 结束(在这种情况下,会话劫持是可能的)。您可以通过在 php.ini 中设置 session.use_only_cookies 来做到这一点。

    如果您在不受信任和/或配置错误的共享服务器上托管,可能会出现其他安全问题 - 这可能会导致同一台机器上的其他人读取您的会话数据。在这种情况下,您可以通过重写会话处理程序将会话数据存储在数据库中。只需在 intertubes 上搜索session handler mysql,我确信有足够的现成解决方案。并且不要在会话中存储密码等敏感信息,每次需要比较时最好进行查询。

    除此之外...使用 ssl/https 进行登录和用户管理,因此不会传输明文密码。仅在数据库中存储带盐的 pw 哈希。不要让任何人看到密码(意思是:永远不要将它们打印到 html 或电子邮件中)。不要对用户可以看到的 id 使用 auto_increment 值(因此,猜测)。好的,这已经超出了问题的范围。

    【讨论】:

    • '并且不要在会话中存储密码等敏感信息,每次需要比较时最好进行查询。' - 好吧,我认为存储密码的单向加密版本(md5+hash)更快,然后检查它以一次又一次地重新对数据库进行查询
    • true,但通常您不需要在每次浏览量上检查密码,仅在 #1:登录和 #2:更改密码(如果您要求用户提供当前密码设置一个新的)。对于#1,您必须查询数据库,而#2不会经常发生,因此额外的开销可以忽略不计。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 2014-03-17
      • 2019-11-10
      • 2011-07-23
      • 2011-11-06
      • 1970-01-01
      • 2015-08-31
      • 2012-07-22
      相关资源
      最近更新 更多