在PHP中防止csrf

  1. 要求在GET和POST参数中进行validation,而不仅仅是cookie;

  2. 检查HTTP Referer头;

在维基百科上看到这个post,并想知道如何应用它们

好吧…我使用Kohana PHP框架,我有设施来确定引用标题,但是我究竟在引用标头中检查? 框架函数只返回引用者的URL

以及如何validationGET和POST参数? 反对什么? 存储的信息? 预期types?

为了防止CSRF,您需要validation一次性令牌,POST'ed并与当前会话相关联。 像下面这样。 。 。

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

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> 

那么当涉及到实际删除logging时:

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接受,并在几分钟后过期(本例中未显示过期)。

随着转介检查你所做的一切都是要确保引用来自你的站点/系统。 如果引荐人不存在或来自外国,那么检查检查失败,您可能不想expression任何要求。

在过去的各种技术和浏览器(Flash ..等)的问题允许伪造referal头。 它的东西要考虑。 有几种方法使用javascript来链接资源,其中请求头中不存在/传递参考数据。

这种行为在浏览器之间有所不同。 如果您使用JavaScript来提交表单,您通常可以。 如果你使用类似window.location的东西,你可能不应该期望提供相关的数据。

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

Kohana框架已经过时,Kohana PHP 7的新版本是https://koseven.ga/ ,支持CSRFfunction的是Security类。

您可以使用官方koseven安全function。 这里是koseven安全类的链接。