要求在 GET 和 POST 参数中进行身份验证,而不仅仅是 cookie;
检查 HTTP Referer 标头;
在维基百科上看到这篇文章,想知道如何应用它们
好的...我正在使用 Kohana PHP 框架,并且我有能力确定引荐来源标头,但是我在引荐来源标头中究竟要检查什么?框架函数只返回引荐来源网址
以及如何验证 GET 和 POST 参数?反对什么?存储信息?预期类型?
为了防止 CSRF,您需要验证一次性令牌、POST 并与当前会话相关联。类似于以下内容。. .
在用户请求删除记录的页面:
确认.php
<?php
session_start();
$token = isset($_SESSION['delete_customer_token']) ? $_SESSION['delete_customer_token'] : "";
if (!$token) {
// generate token and persist for later verification
// - in practice use openssl_random_pseudo_bytes() or similar instead of uniqid()
$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>
然后在实际删除记录时:
确认保存.php
<?php
session_start();
// validate token
$token = isset($_SESSION['delete_customer_token']) ? $_SESSION['delete_customer_token'] : "";
if ($token && $_POST['token'] === $token) {
// delete the record
...
// remove token after successful delete
unset($_SESSION['delete_customer_token']);
} else {
// log potential CSRF attack.
}
session_write_close();
?>
令牌应该难以猜测,对于每个删除请求都是唯一的,仅通过 $_POST 接受并在几分钟后过期(此示例中未显示过期)。
通过推荐检查,您所做的一切都是为了确保推荐人来自您的站点/系统。如果引荐来源不存在或来自外国站点,则引荐检查失败,您可能不想兑现正在提出的任何请求。
在过去,各种技术和浏览器(flash..et al)的问题允许伪造引用标头。它需要考虑。有几种方法使用 javascript 链接到请求标头中不存在/传递参考数据的资源。
这种行为在浏览器之间有所不同。如果您使用 javascript 提交表单,您通常可以。如果您很可能使用诸如 window.location 之类的东西,则您不应该期望存在参考数据。
预防 CSRF 的一种流行方法是不使用 cookie 并始终在引用之间传递状态...在整个应用程序的所有链接中传递会话令牌。
[注意:] Kohana 框架已弃用,Kohana PHP 7 的新分支是https://koseven.ga/,它确实支持 CSRF 功能是安全类。
您可以使用官方 koseven 安全功能。这是koseven 安全类的链接。