【问题标题】:What is a good and secure session name?什么是好的和安全的会话名称?
【发布时间】:2016-10-29 14:30:56
【问题描述】:

背景

我从事 php 开发已有数年,但主要使用开源 CMS,例如 wordpress 或 drupal。两者都以自己的方式管理会话,而且在大多数情况下,我从未关注过它们。现在我正在构建一个自定义网站而不使用这些 cms,这意味着我需要自己管理会话。由于这有很多安全隐患,我想要更多关于它的信息。我了解影响表单构建和 url 以及一般输入的安全威胁,但对会话威胁知之甚少。

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

问题。

我还应该如何设置此会话名称? 是否有针对此的网络标准?我确实搜索了一个,但什么也没找到,也许我的关键词有误。

设置此名称有哪些安全隐患?我应该在名称中包含一些特定变量还是由于某些可能的冲突而不包含变量。我在安全方面真的是从头开始,所以任何信息都会有所帮助。

【问题讨论】:

  • 会话名称无关紧要。它们可以是“this_is_the_session_cookie”、“RDASDF@3234erasdfWe4r2343”或只是“php_sessid”。任何作为 cookie 名称有效的字符串都是有效的会话名称。选择一个并继续做更重要的事情。
  • 据我了解,您担心有人会知道您的会话名称。你是想隐瞒什么吗?您可以只删除 php 部分。我的意思是,如果你只有一个 cookie,很明显它就是会话。
  • @Al.G.我不知道什么s.o.是。我并不想隐藏任何东西本身。我只是想确保我的网站是安全的。它确实有一些敏感信息(主要是 HIPAA)。我知道会话劫持和中间人攻击以某种方式以会话 cookie 为目标。我只是想确保我遵循安全系统的最佳做法。
  • “这当然有点恶心。”当然?不要管它。没有理由无缘无故地使事情复杂化。会话 cookie 的名称与安全无关。不过,它的 HttpOnly 状态可能会。

标签: php security session


【解决方案1】:

改这个名字不会有太大影响,据我所知你不需要太在意这个。 PHPSESSIONID 是它的非官方名称,因此没有提供太多关于它的信息。

防止会话滥用的一个更重要的部分是使用任何形式的令牌。如果您需要有关此的更多信息,请告诉我。

另一个非常重要的方面是可能的 SQL 注入攻击,由于您处理敏感信息,它可能会产生严重影响。为了防止这种情况,我建议使用准备好的语句,更多关于这个here

但是回到你的会话,在任何脚本的每次开始时调用 session_sart 并进行一些测试是非常重要的,我将在下面告诉你我处理会话的方式(非常欢迎任何批评者)。此会话应该设置一些标志,例如安全标志和仅 http,更多关于 php 会话标志here

Further Sessions 应该有一个有限的时间,并在此过期后自动丢弃。 另一个小问题是每次新会话开始时重新生成会话 id(值,而不是名称;)),function 正是这样做的。只需在用户登录时调用它。

希望对您有所帮助,如果您还有其他问题,请随时提出。

这是我的函数,它在每个文件的开头调用,当然登录页面除外:

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";
//...

【讨论】:

  • 好吧,从 cmets 和这个答案看来,cookie 的实际名称是无关紧要的。很高兴知道。我可以专注于创建一个安全会话。我知道 sql 注入以及如何防止这种情况。 regenerate session_id 看起来很有用,所以我会更多地研究它。谢谢。
猜你喜欢
  • 2017-10-08
  • 2021-02-05
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2013-12-15
  • 2013-12-31
相关资源
最近更新 更多