我们真的从CSRF中获得了保障吗?

时间:2011-08-03 15:57:09

标签: php security xss csrf csrf-protection

confirm.php

<?php
 session_start();
 $token= md5(uniqid());
 $_SESSION['delete_customer_token']= $token;
 session_write_close();
?>
<form method="post" action="confirm_save.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />

confirm_save.php

<?php
 session_start();
 $token= $_SESSION['delete_customer_token'];
 unset($_SESSION['delete_customer_token']);
 session_write_close();
 if ($_POST['token']==$token) {
   // delete the record
 } else {
   // log potential CSRF attack.
 }
?>

假设我们有像这样的典型CSRF保护 如果攻击者使用此代码绕过csrf令牌怎么办?

//On any site
<img src="http://cia.teletubbies.com/csrf.php" height="0" weight="0"/>

//csrf.php
$cont = get_file_contents("http://cia.google.com/confirm.php");
// parse the html using [PHP Simple HTML DOM Parser][2] and get the CSRF token
//CURL and send a POST request to confirm_save.php with the token

这件事一直困扰着我,但我懒得试图攻击任何随机网站。这不可能吗?

示例代码是从preventing csrf in php

中窃取的

更新

当有人想将令牌从一个平台传递到另一个平台或从服务器端传递到客户端时会发生什么?以Flash为例,它如何从csrf安全?

2 个答案:

答案 0 :(得分:5)

您将获取用于刮擦页面的服务器会话的CSRF令牌。由于该会话不是受害者,因此它是安全的。 (如果您正在窃取用户的会话,则不再是CSRF攻击!)

所以,是的,除非它实施得非常糟糕,否则你不能只刮掉CSRF令牌并在CSRF攻击中使用它。

答案 1 :(得分:2)

CSRF保护有效,因为只有经过身份验证的用户才能访问令牌。

您的csrf.php页面位于另一个域上,因此无法查看合法站点的会话cookie,也无法访问CSRF令牌。