我正在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;
}
我的第二个问题是:
- 你们有更好的实现吗
感谢
回答您的第一个问题:这取决于您何时创建会话。如果会话仅用于已登录的用户,或者这是您想要保护的唯一用例,那么将此逻辑放入AuthenticationSuccessHandler
中效果最佳。这涉及到扩展CCD_ 2并添加上述逻辑;然后在security.yml
中,在success_handler
参数下添加条目(请参阅参考文档)。
如果你想保护所有会话,那么扩展你的会话处理程序并将此代码放入其初始化或保存方法可能是最好的——我不熟悉Redis会话处理程序类,所以建议不要太多。一旦扩展了会话处理程序,只需将Symfony配置为使用添加了逻辑的会话处理程序。
至于你的第二个问题:像这样检查IP地址有其自身的弱点,即在请求之间不在同一IP地址上的连接,例如,负载平衡互联网连接并且不通过线程处理网络请求的公司。实际上,如果你已经关闭了从URL获取会话ID的功能,而URL是会话劫持的主要载体,那么在我看来,这真的太过分了。我想这取决于你要保护什么以及这会对它产生什么影响。最好是全程使用SSL,启用HSTS并打开安全cookie,忘记在这个级别上尝试缓解。