【问题标题】:How can I check whether a session is valid per page?如何检查会话是否每页有效?
【发布时间】:2011-08-21 07:51:42
【问题描述】:

所以,如果创建了一个登录/注册系统,当用户登录时,用户会被重定向到另一个仅限会员的页面(member.php),我会将登录信息存储在用户的会话中。

当用户导航到成员页面时,在允许他查看内容之前,我想确保用户名/密码有效,并且用户已有效登录。我如何确保用户当他/她进入会员页面时有效登录,对我来说这似乎是在使用:

if (!isset($_SESSION['username']))
{
    die("You aren't allowed to access this page");
}

会起作用,但是我想确保它是安全的,而且对我来说,它似乎不够安全(因为如果有某种方式来欺骗会话,他们所要做的就是包括任何文本作为用户名)。

我真的不知道,那么我将如何检查用户是否应该有权访问该页面?

【问题讨论】:

    标签: php


    【解决方案1】:

    会话变量存储在您的服务器上,而不是像 cookie 一样存储在用户计算机上。所以用户永远不能修改$_SESSION['username']。对于会话,您唯一需要真正警惕的是会话劫持(用户获取另一个登录用户的会话 ID,并使用它来冒充该用户)

    【讨论】:

    • 有没有办法对抗会话劫持?如果是,怎么做?
    【解决方案2】:

    如果用户知道有效值,但不知道存储在服务器上的会话数据本身,他们可能会欺骗会话 ID cookie。

    因此,他们可能不只是使用某个用户名“向您发送”会话数据。

    如果他们可以访问 已登录的人的浏览器,他们可能会窃取他们的 SESSID( 存储在客户端上),但根据-IP 会话可以在一定程度上缓解这种情况。

    【讨论】:

    • 如何创建每 IP 会话?
    • @Jacob:我不知道。这是not this way automatically。您当然可以手动完成,通过在登录时将$_SERVER['REMOTE_ADDR'](或其他任何内容)存储在会话数据中,并检查每个请求的一致性。
    【解决方案3】:

    放一个带盐的加密密码cookie/会话变量,不时检查数据库。

    【讨论】:

    • 当身份验证详细信息首先被劫持时,“不时地”检查对您没有帮助。他们没有改变。
    • 那么,我会在每次新会话开始时生成该密码,并将其存储在数据库中,还是只使用用户的加密密码?然后我会检查每一页上的数据库吗?
    • 如果你想确保被劫持的 cookie 不可用,你可以为每个 IP 地址创建一个新的盐。缺点是一次使用不能在多个地方登录
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多