【发布时间】:2011-12-19 20:57:03
【问题描述】:
我正在努力解决会话劫持和使用令牌进行 CSRF 保护的问题。 我在每个脚本中都使用此对象方法来检查是否设置了会话变量或令牌是否与会话令牌匹配。
public function admin_index(){
session_start();
if(!isset($_SESSION["user"]) || $_GET['token']!=$_SESSION['token']) {
header("location: login/login_form.php");
session_destroy();
exit();
}
我是新手,我的问题是: 如果我的会话 ID 以某种方式被劫持,他是否能够在 session_start 之后的短时间内读取我的变量 $_SESSION['token'] 并且会话数据被获取并填充到 $_SESSION 中,或者它仍然安全吗?服务器?
即使已获得有效会话,会话变量通常是否安全?
不要介意 $_GET['token'] 而不是 POST。我还在努力。
谢谢
编辑:
我要问的是。如果令牌还可以帮助我以我使用它的方式保护我的会话。如果我的脚本中的每个查询、链接或视图都需要一个有效的令牌,并且攻击者只获得了我的 session_id,那么令牌将是另一层保护,因为他/她需要 id 和令牌才能在脚本中执行任何操作对吧?
即使攻击者获取了我的 session_id,令牌在服务器上也是安全的?
【问题讨论】:
-
重申一下,如果您的会话被劫持,则 csrf 没有价值。希望这很清楚。它无助于会话劫持或防止会话劫持。通常有帮助的是检查用户代理和/或 IP 地址的更改,当然最终的安全性是 https: 和安全 cookie。
-
这无助于保护您的会话,因为每次访问表单时都会生成 CSRF 令牌。因此,如果我劫持了您的会话并使用您的帐户访问该表单,则会生成一个新令牌,并且无论之前的 CSRF 令牌是什么,我都可以做我喜欢的事情。
-
在您的示例中是匹配对令牌的更改或用户是否已通过身份验证。您应该只使用令牌来检查数据是否来自受信任的来源。您似乎将其用作不太正确的辅助会话 ID。如果您从用户的唯一标识符(例如 session_id 和浏览器的 User-Agent)创建哈希,则可以这样做,因为每次都可以检查。