2015-01-07 34 views
0

所以我一直在阅读会议,我不得不说,我很困惑。 看来,会议是'破碎',可能是安全明智的,为什么他们没有执行更多的安全检查会议代码本身...PHP会话安全检查

无论如何,我的问题。我发现这个网站有很多会话安全检查:https://wblinks.com/notes/secure-session-management-tips/通读它,其中大部分对我而言是有意义的。然而,最令我困惑的是WHEN也称这些检查。

我会在页面上调用这些检查吗?一方面这是有道理的,因为有人可以在每一页上劫持一个会话或其他的东西,对吗?另一方面,在每个页面上完成这些检查需要花费一些额外的时间,否则可能会增加加载时间?


在这一刻我有以下代码。

<?php 

if ($_SESSION['_USER_LOOSE_IP'] != long2ip(ip2long($_SERVER['REMOTE_ADDR']) & ip2long("255.255.0.0")) 
    || $_SESSION['_USER_AGENT'] != $_SERVER['HTTP_USER_AGENT'] 
    || $_SESSION['_USER_ACCEPT'] != $_SERVER['HTTP_ACCEPT'] 
    || $_SESSION['_USER_ACCEPT_ENCODING'] != $_SERVER['HTTP_ACCEPT_ENCODING'] 
    || $_SESSION['_USER_ACCEPT_LANG'] != $_SERVER['HTTP_ACCEPT_LANGUAGE'] 
    || $_SESSION['_USER_ACCEPT_CHARSET'] != $_SERVER['HTTP_ACCEPT_CHARSET'] 
    || !isset($_SESSION['MY_SERVER_GENERATED_THIS_SESSION'])) { 


    // Destroy and start a new session 
    sec_session_destroy(); // Destroy session on disk 
    sec_session_start(); 

    // Log for attention of admin and re-authenticate user... 
} 

if ($_SESSION['SESSION_START_TIME'] < (strtotime("-1 hour")) || $_SESSION['_USER_LAST_ACTIVITY'] < (strtotime("-20 mins"))) { 
    sec_session_destroy(); 
    //Expire session and re-authenticate user... 
} 

function sec_session_start() { 
    setcookie("sid",   // Name 
      session_id(),   // Value 
      strtotime("+1 hour"), // Expiry 
      "/",     // Path 
      ".serellyn.net",  // Domain 
      true,     // HTTPS Only 
      true);    // HTTP Only 

    // Store these values into the session so I can check on subsequent requests. 
    $_SESSION['_USER_AGENT']   = $_SERVER['HTTP_USER_AGENT']; 
    $_SESSION['_USER_ACCEPT']   = $_SERVER['HTTP_ACCEPT']; 
    $_SESSION['_USER_ACCEPT_ENCODING'] = $_SERVER['HTTP_ACCEPT_ENCODING']; 
    $_SESSION['_USER_ACCEPT_LANG']  = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
    $_SESSION['_USER_ACCEPT_CHARSET'] = $_SERVER['HTTP_ACCEPT_CHARSET']; 
    $_SESSION['MY_SERVER_GENERATED_THIS_SESSION'] = true; 

    // Only use the first two blocks of the IP (loose IP check). Use a 
    // netmask of 255.255.0.0 to get the first two blocks only. 
    $_SESSION['_USER_LOOSE_IP'] = long2ip(ip2long($_SERVER['REMOTE_ADDR']) 
              & ip2long("255.255.0.0")); 

    $_SESSION['SESSION_START_TIME'] = time(); 
    $_SESSION['_USER_LAST_ACTIVITY'] = time(); 

    sec_session_start();   // Start the PHP session 
} 

function sec_session_destroy() { 
    session_unset(); 
    session_destroy(); 
    session_start(); 
    session_regenerate_id(true); 
} 

我最后的问题是,上面的代码是否有意义,或者你有任何建议,使其更好或更少混淆。我应该在每个页面上还是仅包含几页?

在此先感谢

+0

“看起来会话像'破坏'一样可能是安全明智的”嗯?这就好像在说“看起来汽车像'危险'一样可能是安全明智的” – PeeHaa

+0

还要注意,以上大部分已经在正确设置会话并仅使用加密连接时处理完毕。 – PeeHaa

+0

另请注意,ip检查将在ipv6地址上失败。 – PeeHaa

回答

1

为什么他们不落实在会议代码本身更多的安全检查...

通常的“会话”模式是会话ID是强秘密,任何泄露该ID的内容都将被视为漏洞。

此处列出的其他标头不是秘密,并且在很多可能导致会话ID泄漏的相同场景中可能是可以伪造的。所以检查他们是没有明确的好处;这样做只是部分缓解会话劫持漏洞。在另一边也有显著兼容性缺点:

$ _SESSION [ '_ USER_AGENT'] = $ _ SERVER [ 'HTTP_USER_AGENT']如果浏览器升级发生在一个会话中

用户代理可以改变,或者在某些情况下用户无需重新启动即可安装或升级浏览器插件/扩展程序。

$ _SESSION [ '_ USER_ACCEPT']!= $ _ SERVER [ 'HTTP_ACCEPT']

Accept头将取决于它期待什么样的资源的改变,所以如果你做类似服务来自PHP的图像将会中断。

($ _SESSION [ '_ USER_LOOSE_IP']!= long2ip(ip2long($ _ SERVER [ 'REMOTE_ADDR'])& ip2long( “255.255.0.0”))

这是一个比一个确切的更好IP匹配,但仍然会让一个移动用户从一个电信公司或WiFi网络切换到另一个电信公司。

您当然可以将这些头文件中的更改用作启发式方法,例如,以决定是否要求对特定敏感操作进行重新认证,或者通常需要进行风险评级事务。但是当它们中的任何一个发生改变时立即中断会使一些用户对你的网站的使用体验变得更糟。

这是一个权衡,每个应用程序可能需要一种不同的方法,可能需要将其与应用程序使用的特定知识联系起来。因此,会话的大多数实现不会'默认情况下不能真正做到这一点。

+0

感谢您的意见。 – Serellyn