一个好的且安全的会话名称是什么?

3

背景

我已经做PHP开发几年了,但大多数时候都是使用像WordPress或Drupal这样的开源CMS。这两个系统都以自己的方式管理会话,而我大部分时间从未关注过它们。现在我正在构建一个不使用这些CMS的定制网站,这意味着我需要自己管理会话。由于这具有很多安全方面的影响,我想要更多相关信息。我理解与表单构建和URL以及一般输入相关的安全威胁,但对会话威胁知之甚少。

我注意到在我的Chrome检查器中,我的会话cookie被命名为“PHPSESSIONID”。这当然有点恶心。所以我发现可以使用php.ini设置session.name =“mysitename”或者在代码中使用一些值来更改它,例如session_name('mysite_' . $some_value);

问题

我应该将此会话名称设置为什么?是否有Web标准?我搜索了一下,没有找到任何相关信息,也许是我用错了关键词。

设置此名称有什么安全隐患?是否应该在名称中包含某些特定变量或不包含变量以避免一些可能的冲突?我在安全方面真的是从零开始,所以任何信息都有所帮助。


5
会话名称并不重要,它们可以是“this_is_the_session_cookie”,“RDASDF@3234erasdfWe4r2343”或仅为“php_sessid”。任何有效的 cookie 名称都是有效的会话名称。选择一个名称,然后继续更重要的事情。 - Marc B
1
https://www.owasp.org/index.php/Session_Management_Cheat_Sheet - Jay Blanchard
据我所知,您担心有人会知道您的会话名称。您是在试图隐藏什么吗?您可以只删除php部分。我的意思是,如果您只有一个cookie,那么很明显它就是会话。 - Al.G.
@Al.G. 我不知道 s.o. 是什么意思。我并不是在试图隐瞒任何东西。我只是想确保我的网站是安全的。它包含一些敏感信息(主要是HIPAA)。我知道会话劫持和中间人攻击以某种方式针对会话cookie。我只是想确保我遵循安全系统的最佳实践。 - danielson317
这当然有点恶心。当然?别管它。没有必要无缘无故地把事情复杂化。会话cookie的名称与安全性无关,但它的HttpOnly状态可能有关。 - ceejayoz
显示剩余2条评论
1个回答

4
据我所知,更改此名称不会有太大的影响,因此您不需要过多关注。PHPSESSIONID是其非官方名称,因此对其了解不多。
预防会话滥用的更重要部分是在任何表单中使用令牌。如果您需要更多信息,请告诉我。
另一个非常重要的方面是可能的SQL注入攻击,这可能会产生关键影响,因为您处理敏感信息。为了防止这种情况,我建议使用准备语句,更多信息请参见此处
但回到您的会话,很重要的一点是,在任何脚本启动时都要调用session_start并进行一些测试。下面是我处理会话的方法(欢迎提出任何批评意见)。此会话应设置一些标志,例如安全标志和http only,有关php会话标志的详细信息请参见此处
此外,会话应有限时间,并在此过期后自动丢弃。另一个小点是每次启动新会话时重新生成会话ID(值,而不是名称; )),此函数正是这样做的。用户登录时只需调用它即可。
希望这可以帮助您,如果您有任何更多的问题,请随时提出。
以下是我在每个文件开头调用的函数,当然不包括登录页面:
function auth()
{   
    $curFile = basename($_SERVER["PHP_SELF"]);
    if($curFile == "login.php")
    {
        return;
    }

    $domain = $_SERVER["HTTP_HOST"];

    if(session_status() != PHP_SESSION_ACTIVE)
    {   
        session_set_cookie_params(0, "/", $domain, true, true);
        session_start();
    }

    $now = time();
    if (isset($_SESSION["discard_after"]) && $now > $_SESSION["discard_after"])
    {
        session_unset();
        session_destroy();
        session_set_cookie_params(0, "/", $domain, true, true);
        session_start();
    }

    session_regenerate_id(true);

    $_SESSION["discard_after"] = $now + 120;

    if ((!isset($_SESSION["angemeldet"]) || !$_SESSION["angemeldet"]) && basename($_SERVER["PHP_SELF"]) != "login.php")
    {
        header("Location: https://".$domain."/login.php");
        die();
    }
}

在我的登录文件中,我设置了如下会话:

session_set_cookie_params(1800, "/", $domain, true, true);
session_start();
session_regenerate_id(true);
//Do whatever you want to do to your $_SESSION
$_SESSION["angemeldet"] = true;
$_SESSION["name"] = "Fany name";
//...

2
从评论和这个答案来看,似乎cookie的实际名称并不重要。好知道。我可以专注于创建一个安全的会话。 我知道SQL注入以及如何防范它。重新生成session_id看起来很有用,所以我会更深入地研究一下。谢谢。 - danielson317

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接