【问题标题】:How to restrict users to their subdomain如何限制用户访问他们的子域
【发布时间】:2015-11-03 13:32:48
【问题描述】:

我有一个 Web 应用程序,我打算在其中为每个客户端提供自己的子域,例如 client1.myapp.com、client2.myapp.com 等。当用户登录时,我将他们的用户 ID 存储在会话变量中,如$_SESSION['user'] = 4; 设置$_SESSION['user'] 时,用户已登录并可以访问应用程序。由于用户 ID 仅在每个单独的客户端中是唯一的,因此我需要一种方法来阻止用户访问其他客户端的子域。我考虑过为此使用会话 cookie,但后来我发现 cookie 可以被黑客入侵。现在我正在考虑为每个客户分配一个唯一的客户 ID,并使用$_SESSION[$clientID]['user'] 而不是$_SESSION['user']。这是解决问题的安全方法吗?我还有哪些其他选择?

【问题讨论】:

    标签: php session cookies


    【解决方案1】:

    您的$clientID 方法没有任何问题。

    如果你想变得花哨,你可以使用session_set_cookie_params 这样相同的PHPSESSID cookie 可以被所有域和子域访问。这有其好处,特别是如果您的集中登录页面需要检测用户是否登录特定域或子域。或者,如果您希望允许用户同时从所有子域中注销,或者如果您想创建一个可以访问所有子域的管理帐户。

    永远不要相信发送的会话 ID,即使 cookie 绑定到特定的子域,因为所有子域的会话在服务器上的同一目录中都是 stored
    对此的解决方案可能是:ini_set(session.save_path, "/path/to/your/folder/$clientid") 然后您将拥有一个专用于每个客户端的唯一目录,用于存储会话。这种方法的好处是您的$_SESSION 不会包含与另一个子域相关的信息。

    您还可以利用sesssion_name,而不是PHPSESSID,您可以使用client1 或client2 来明确会话属于哪个客户端。 例如client2=8d72edf35377a27388cb;client8=b47277bc8e3d4a5f
    然后 PHP 可以读取这个 cookie 并知道会话存在的客户端。

    您也可以结合使用以上所有方法,只要适合您。
    在此处查看与会话相关的功能:http://php.net/manual/en/book.session.php
    和会话相关的设置在这里:http://php.net/manual/en/session.configuration.php

    【讨论】:

      【解决方案2】:

      试试这样的。我希望这会有所帮助。

      当用户登录时,将他们的子域存储在会话变量中,例如:

      $_SESSION['user_subdomain'] = 'client1.myapp.com';
      

      当设置$_SESSION['user']$_SESSION['user_subdomain']时,用户登录并访问应用程序,然后检查当前访问应用程序的子域是否等于$_SESSION['user_subdomain']

      通过使用这种方式,如果客户端尝试访问其他客户端的子域,您可以将客户端重定向到其正确应用程序的子域。通过这种方式,您可以阻止用户访问其他客户的子域。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        • 2014-01-04
        • 2020-02-04
        相关资源
        最近更新 更多