【问题标题】:Symfony- Implement identity confirmation after each requestSymfony - 在每次请求后实施身份确认
【发布时间】:2015-11-07 05:56:32
【问题描述】:

我正在针对 Symfony 上的会话劫持实施反措施。基本上检查用户在会话期间是否没有更改 IP 和/或其用户代理。基本的东西。

问题是我不知道我应该把这段代码放在哪里才能在每次请求后运行它。基本上要改变的是在最后一次请求之后改变的东西。

我现在的代码是这样的

static protected function preventHijacking(Session $session)
{
    $ipAddress = $session->get('IPaddress');
    $userAgent = $session->get('userAgent');

    $remoteAddress = $_SERVER['REMOTE_ADDR'];
    $httpUserAgent = $_SERVER['HTTP_USER_AGENT'];

    if(!isset($ipAddress) || !isset($userAgent)) {
        return false;
    }

    if ($ipAddress != $remoteAddress) {
        return false;
    }

    if ($userAgent != $httpUserAgent) {
        return false;
    }
    return true;
}

我的第二个问题是:

  • 你们有更好的实现吗?

谢谢

【问题讨论】:

    标签: php security symfony session


    【解决方案1】:

    回答您的第一个问题:这取决于您何时创建会话。如果会话仅用于登录用户,或者如果这是您要保护的唯一用例,那么将此逻辑放入 AuthenticationSuccessHandler 效果最好。这涉及扩展DefaultAuthenticationSuccessHandler 并添加上述逻辑;然后在您的 security.yml 中为此添加 success_handler 参数 (see the reference documentation) 下的条目。

    如果您想保护所有会话,那么扩展您的会话处理程序并将此代码置于其初始化或保存方法中可能是最好的 - 我不熟悉 Redis 会话处理程序类,因此无法提供更多建议这个。一旦你扩展了会话处理程序,只需将 Symfony 配置为使用你的会话处理程序及其添加的逻辑。

    至于您的第二个问题:像这样检查 IP 地址对于请求之间不在同一 IP 地址上的连接有其自身的缺点,例如负载平衡其 Internet 连接并且不将它们用于 Web 请求的公司。实际上,如果您关闭了从 URL 获取会话 ID(这是会话劫持的主要载体),那么在我看来,这确实是矫枉过正。我想这取决于您要保护的内容以及这将对它产生的影响。更好的是始终使用 SSL,启用 HSTS 并启用安全 cookie,而忘记尝试在此级别进行缓解。

    【讨论】:

    • 我将首先回答第二部分。检查 IP 地址不是那么实用,现在我并没有完全依赖它来踢出用户,我只是在某个地方举个旗子,因为我将来会更多地考虑这个问题。关于第一个建议,我将在本周末与那些更深入的人一起玩,然后回复你。谢谢!
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多