CSRF Token保护的意义是什么?
What is the sense of the CSRF Token protection?
这方面我看了很多,还是不明白。假设我有一个域,其表单仅供经过身份验证的用户使用 post 对某种内容发表评论:
my_form.php
<form action="post_comment.php" method="post">
<textarea name="comment"></textarea>
<input type="hidden" name="csrf_token" value="<?php print $csrf_token; ?>" />
<input type="submit" value="Post" />
</form>
post_comment.php
<?php
if(!isset($_POST['csrf_token']) || !CSRFToken::validate($_POST['csrf_token'])){
print "Invalid CSRF-Token!";
exit;
}
[...]
?>
如果 "csrf_token" 令牌值未发送或无效,post_comment.php 将拒绝任何请求。所以我们正在阻止攻击者使用我们的 post_comment.php。
但是如何防止攻击者获取 /my_form.php,从表单中读取 csrf_token 值并使用它 POST 到 post_comment.php?我错过了什么?
CSRF 令牌是随机的,并且每个会话都是唯一的。因此,攻击者可以获得链接到 his/her 自己凭据的此令牌的值,而不是潜在受害者的凭据。
CSRF 是一种攻击,受害者登录到您的网站(有一个会话 cookie),当您没有会话时,就不需要 CSRF。
受害者使用相同的浏览器访问一个邪恶的其他网站。
该站点现在可以向您的站点发出 post 请求(使用 cookie 并因此登录受害者),您可以使用 CSRF 令牌阻止该请求,因为虽然恶意站点可以使用 cookie 发送请求,但它无法读取请求的响应(同源策略)。
您可以在您的(个人)浏览器中关闭此行为,但默认情况下它是启用的,因为某些应用程序依赖于它。
这方面我看了很多,还是不明白。假设我有一个域,其表单仅供经过身份验证的用户使用 post 对某种内容发表评论:
my_form.php
<form action="post_comment.php" method="post">
<textarea name="comment"></textarea>
<input type="hidden" name="csrf_token" value="<?php print $csrf_token; ?>" />
<input type="submit" value="Post" />
</form>
post_comment.php
<?php
if(!isset($_POST['csrf_token']) || !CSRFToken::validate($_POST['csrf_token'])){
print "Invalid CSRF-Token!";
exit;
}
[...]
?>
如果 "csrf_token" 令牌值未发送或无效,post_comment.php 将拒绝任何请求。所以我们正在阻止攻击者使用我们的 post_comment.php。
但是如何防止攻击者获取 /my_form.php,从表单中读取 csrf_token 值并使用它 POST 到 post_comment.php?我错过了什么?
CSRF 令牌是随机的,并且每个会话都是唯一的。因此,攻击者可以获得链接到 his/her 自己凭据的此令牌的值,而不是潜在受害者的凭据。
CSRF 是一种攻击,受害者登录到您的网站(有一个会话 cookie),当您没有会话时,就不需要 CSRF。 受害者使用相同的浏览器访问一个邪恶的其他网站。 该站点现在可以向您的站点发出 post 请求(使用 cookie 并因此登录受害者),您可以使用 CSRF 令牌阻止该请求,因为虽然恶意站点可以使用 cookie 发送请求,但它无法读取请求的响应(同源策略)。 您可以在您的(个人)浏览器中关闭此行为,但默认情况下它是启用的,因为某些应用程序依赖于它。