我正在为Symfony上的会话劫持实施一项对策。基本检查用户在会话期间是否未更改IP和/或其用户代理。基本的东西。
问题是我不知道我应该在何处放置此代码以便在每次请求后运行它。基本上改变是在最后一次请求之后发生了变化。
我的代码现在看起来像那样
<section>
<p>Please type in your information so I can send you the newsletter.
<br>Required values are marked by an asterisk (*)</p>
<form id="newsletter" onsubmit="return validateForm()" method="post">
<fieldset id="personal">
<legend>Personal Information</legend>
<label for="name">Name: *</label>
<input type="text" name="name" id="name" size="40">
<br>
<label for="eMail">E-mail Address: *</label>
<input type="text" name="eMail" id="eMail">
<br>
<label for="favBeer">Favorite Beer Style:</label>
<select name="favBeer" id="favBeer">
<option value="IPA">IPA</option>
<option value="Saison">Saison</option>
<option value="Porter">Porter</option>
<option value="Pilsner">Pilsner</option>
<option value="Hefeweizen">Hefeweizen</option>
<option value="Stout">Stout</option>
<option value="Other">Other</option>
</select>
<br>
<label for="comments">Additional Information:
<label>
<textarea name="comments" id="comments" cols="55" rows="5"></textarea>
<div class="button">
<input type="submit" value="Sign Me Up" />
</div>
</fieldset>
</section>
我的第二个问题是:
谢谢
答案 0 :(得分:2)
回答您的第一个问题:这取决于您何时创建会话。如果会话仅用于登录用户,或者如果这是您要保护的唯一用例,那么将此逻辑放入AuthenticationSuccessHandler
将最有效。这涉及扩展DefaultAuthenticationSuccessHandler
并添加上述逻辑;然后在security.yml
添加success_handler
参数(see the reference documentation)下的条目。
如果你想保护所有会话,那么扩展你的会话处理程序并将这些代码放在初始化或保存方法中可能是最好的 - 我不熟悉Redis会话处理程序类,所以不能这样做。建议超过这个。一旦扩展了会话处理程序,只需将Symfony配置为使用会话处理程序及其添加的逻辑。
关于你的第二个问题:检查这样的IP地址对于在请求之间不会保持在同一IP地址的连接有其自身的缺点,例如:负责平衡互联网连接并且不为网络请求提供线程的公司。实际上,如果您已经关闭从会话劫持的主要向量URL获取会话ID,那么在我看来,这实际上是过度的。我想这取决于你的安全性以及它对它的影响。更好的方法是整个SSL,启用HSTS和安全cookie,并忘记尝试在此级别进行缓解。