我的PHP脚本中是否存在会话安全漏洞?

时间:2009-05-01 18:37:09

标签: php security url session authorization

在我验证用户登录信息后,我为他们创建了这个会话:

 $_SESSION['username']= $userName;

然后,我像这样重定向他们:

header('Location:www.domain.com/profile/' . $_SESSION['username'];

我希望我的网站有一个美容网址,例如:www.domain.com/profile/userName

因此,在我的所有重定向链接(HTML <a>标记或PHP header()函数)中,我将使用:

"www.domain.com/album/" . $_SESSION['username'];

是否存在安全漏洞?

编辑:

我是否需要先使用session_id()创建会话ID?

所以,检查:

if(!isset($_SESSION['id']){
   //redirect to login page
}

3 个答案:

答案 0 :(得分:1)

通常在使用Sessions时我们还需要注意 - :

  

会话劫持,会话固定

我建议在用户登录存储后的代码中,会话变量中的用户名还会在会话变量中存储一个唯一的值,例如USER AGENT。因此,用户访问的每个页面都可以检查是否存在相同的USER AGENT和SESSION ID,这将使其更加安全。为了使其更安全,像用户代理上的MD%一样进行加密,以便黑客无法重现它。

  

引自PHP安全指南

<?php

session_start();

if (isset($_SESSION['HTTP_USER_AGENT']))
{
    if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
    {
        /* Prompt for password */
        exit;
    }
}
else
{
    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
}

?>

参考:
PHP Security Guide on Session
Another Thread on Session security

答案 1 :(得分:0)

你在保护什么?您正在做什么来验证他们是否有授权?您是否正在保护他们的个人资料并验证他们是否拥有授权,因为他们拥有会话密钥? 您没有提及检查他们是否有会话变量

您甚至不需要知道会话ID。这对于存储用户是否已经获得认证来说是无关紧要的,这只是指示他们应该使用哪些会话信息的机制。

当用户登录时,您希望存储类似

的内容
$_SESSION['authed_user'] = true;

然后,在后续尝试编辑信息时:

if ($_SESSION['authed_user']) {
  // do something authed users can do
}

当然,你可能真的想要某种程度的授权。我建议您考虑使用类似SimpleAuth ...

的内容

答案 2 :(得分:0)

您需要在允许用户编辑其个人资料的页面上进行授权。如果他们将在http://www.domain.com/profile/[username]页面上进行修改,那么您需要检查他们的$_SESSION['username']是否与他们所在的个人资料页面相同。

否则,任何人都可以输入URL(基本上猜测个人资料编号或名称)并进行编辑。

但是,你应该首先检查他们是否已登录所有人:

if (IsSet($_SESSION['username'])) {
// Logged in
} else {
// Not logged in
}