我已经成为一名php开发人员已有好几年了,但主要是使用开源CMS,如wordpress或drupal。这两个都以他们自己的方式管理会话,并且在大多数情况下我从未关注它们。现在我正在构建一个自定义网站而不使用这些cms,这意味着我需要自己管理会话。由于这有很多安全隐患,我想了解更多有关它的信息。我理解安全威胁会影响表单构建,网址和一般输入,但很少涉及会话威胁。
我在Chrome检查员中发现我的会话cookie名为“PHPSESSIONID”。这当然有点粗糙。所以我发现我可以使用php.ini
设置session.name = "mysitename"
来更改它,或者使用某些值(如session_name('mysite_' . $some_value);
我应该如何设置此会话名称?是否有针对此的网络标准?我确实搜索了一个,但没有找到任何可能我的错误关键词。
设置此名称有什么安全隐患?我应该在名称中包含一些特定变量,还是由于某些可能的冲突而不包含变量。我真的从头开始在安全方面,所以任何信息都有帮助。
答案 0 :(得分:2)
更改此名称不会产生很大影响,据我所知您不需要太在意这一点。 PHPSESSIONID是它的非正式名称,因此没有提供太多关于它的信息。
防止滥用会话的一个更重要的部分是使用任何形式的令牌。如果您需要更多相关信息,请告诉我。
另一个非常重要的方面是可能的SQL注入攻击,因为您处理敏感信息可能会产生严重影响。为了防止这种情况,我建议使用预准备语句,更多关于此here
的信息但是回到你的会话,你必须在任何脚本的每个开始时调用session_sart并进行一些测试,我将在下面给你处理会话的方式(非常欢迎任何评论家)。此会话应设置一些标志,如安全标志和仅限http,更多关于php会话标志here
进一步的会话应该有一个有限的时间,并在此过期后自动丢弃。 另一个小问题是每次新会话开始时重新生成会话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";
//...