防止PHP中的csrf

时间:2009-11-23 01:26:01

标签: php security kohana

  1. 需要在GET和GET中进行身份验证 POST参数,不仅仅是cookie;

  2. 检查HTTP Referer标头;

  3. 在维基百科上看到这篇文章,并想知道如何应用它们

    好的......我正在使用Kohana PHP框架,我有确定引用者标题的工具,但我究竟要检查引用者标​​题? framework函数只返回引用者的URL

    如何验证GET和POST参数?反对什么?存储的信息?期望的类型?

3 个答案:

答案 0 :(得分:45)

为防止CSRF,您需要验证一次性令牌,POST并与当前会话相关联。像下面这样的东西。 。

在用户请求删除记录的页面上:

<强> confirm.php

<?php
 session_start();
 $token= md5(uniqid());
 $_SESSION['delete_customer_token']= $token;
 session_write_close();
?>
<html>
<body>
<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);" />
</form>
</body>
</html>

然后,当涉及到实际删除记录时:

<强> confirm_save.php

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

令牌难以猜测,每个删除请求都是唯一的,仅通过$ _POST接受,并在几分钟后过期(此示例中未显示过期)。

答案 1 :(得分:3)

通过引荐检查,您所做的一切都是为了确保引用来自您的站点/系统。如果引用者不存在或来自外国网站,则转介检查失败,您可能不想接受任何请求。

在过去,各种技术和浏览器(flash..et al)的问题允许伪造referal标头。它需要考虑的事情。有几种方法可以使用javascript链接到请求标头中不存在/传递referal数据的资源。

此行为在浏览器之间有所不同。如果您使用javascript提交表单,通常可以。如果你使用像window.location这样的东西,你很可能不会期望存在反馈数据。

一种流行的CSRF预防方法是不使用cookie并始终在引用之间传递状态...在整个应用程序的所有链接中传递会话令牌。

答案 2 :(得分:2)

[注意:] Kohana框架已弃用,Kohana PHP 7的新分支是https://koseven.ga/,它确实支持CSRF功能是安全类。

您可以使用官方koseven安全功能。 这是koseven security class的链接。