【问题标题】:session security in phpphp中的会话安全
【发布时间】:2011-11-06 05:12:29
【问题描述】:

了解用户是否是正确的人而不是黑客的最佳方法是什么? 例如,在我的项目中,当用户登录时,我创建了一些带有一些数字的会话变量,然后在其他页面上我检查了这个会话变量,并根据它的值给用户一些选项。

那么黑客能否以某种方式更改此变量,以便服务器端授予他访问某些选项的权限?

如果是这样,持有某些用户权限并将其传递到不同页面的最佳方法是什么,以便服务器可以授予该用户一些选项?

【问题讨论】:

    标签: php session


    【解决方案1】:

    为了更清楚地理解会话劫持,有几种黑客劫持会话的方法让我对不同类型的会话劫持有所了解。

    根据Wikipedia

    用于实施会话劫持的主要方法有四种:

    1. 会话固定,攻击者将用户的会话 ID 设置为他已知的,例如通过向用户发送一封电子邮件,其中包含包含特定会话 ID 的链接。攻击者现在只需要等到用户登录。

    2. 会话劫持,攻击者使用数据包嗅探来读取两方之间的网络流量以窃取会话 cookie。许多网站对登录页面使用 SSL 加密以防止攻击者看到密码,但一旦通过身份验证,就不会对站点的其余部分使用加密。这允许可以读取网络流量的攻击者拦截提交给服务器的所有数据或客户端查看的网页。由于此数据包含会话 cookie,因此即使密码本身没有泄露,他也可以冒充受害者。1 不安全的 Wi-Fi 热点特别容易受到攻击,因为共享网络的任何人通常都能够读取大部分内容其他节点和接入点之间的网络流量。

    3. 或者,具有物理访问权限的攻击者可以简单地尝试窃取会话密钥,例如,获取用户计算机或服务器适当部分的文件或内存内容。

    4. 跨站脚本,攻击者欺骗用户计算机运行被视为可信的代码,因为它似乎属于服务器,允许攻击者获取 cookie 的副本或执行其他操作

    虽然有几种解决方案可以阻止这种劫持,例如第二种使用 SSL 或 https 的解决方案是避免这种劫持的合适方法。但是,如果您想为会话添加更多安全性,那么我遇到的一种解决方案是仅允许通过 Cookie 传递 seesionId,并生成通过 URL 传递的附加会话令牌。并且只有包含有效 Session toekn 的请求才能访问该会话。

    以下是 Orielly PHP CookBook 所采用的示例。

    ini_set('session.use_only_cookies', true); 
    session_start();
    //Create a random salt value
    $salt = 'Hjkhkjh9089&j98098';
    $tokenstr = (str) date('W') . $salt; 
    //Create a md5 hash to be used for token.
    $token = md5($tokenstr);
    if (!isset($_REQUEST['token']) || $_REQUEST['token'] != $token) { 
        // prompt for login
        exit; 
    }
    $_SESSION['token'] = $token; 
    output_add_rewrite_var('token', $token); 
    

    现在output_add_rewrite_var 做了什么,它通过 Get 方法向 url 重写机制添加了另一个名称/值对。在此处阅读有关该功能的更多信息。 output_add_rewrite_var

    要了解有关会话安全的更多信息,我建议您阅读这篇文章http://hungred.com/useful-information/solutions-session-attacks/

    希望这可以帮助您了解会话的漏洞以及如何修复它。

    【讨论】:

    • 您正在检查请求的令牌与新生成的令牌,除非客户端在同一秒内发出请求,否则它将失败。
    【解决方案2】:

    从 ip(最好不要)、会话 id 和用户 cookie 中的其他一些唯一数据创建哈希,并检查每个请求...通过这种方式,您可以控制会话劫持

    另一方面,您必须拥有每个会话的表以获得 acl 系统等特权...将所有设置保存在数据库中并使用会话 ID 查找所有设置

    【讨论】:

    • IP 可能因多种正当理由而改变,例如负载平衡代理或漫游移动用户。
    • 在连接中它不会改变......如果它的改变给另一个会话
    • 试试吧,你的用户会恨你的。
    【解决方案3】:

    老实说,如果您不精通身份验证方法,我建议您使用已建立的提供商(或类似的提供商,例如使用 oAuth 的 GoogleFacebookTwitter 等)主题。当有现场专家提供这种精确服务的大公司时,为什么要尝试重新发明轮子?使用这些提供程序还可以让您深入了解如何为您的系统提供安全身份验证。

    【讨论】:

    • 我们中的一些人不使用 Facebook 或 Twitter,遇到一个网站然后意识到您无法使用它是非常令人沮丧的。我知道这种方法现在很流行,但有些人仍然喜欢经典登录。
    • 然后作为最后一个选项提供 openID 以及 google、facebook、twitter 等。起初我很生气,因为我必须注册另一个网站才能使用我原来的网站之后,但很快就消失了,因为我为我的大多数网站(支持它)使用相同的 openID
    • @mfonda:是的(我仍然主张实施您自己的登录解决方案,以便在其他提供商之上为用户提供),如果您不熟悉安全细节和问题,最好使用给定的提供者并向他们学习并最终实现你自己的(如果认为有必要)。为什么要让您的客户容易受到攻击?
    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多