【发布时间】:2010-12-19 08:05:12
【问题描述】:
在 GET 和 POST 参数,不仅仅是 cookie;
检查 HTTP Referer 标头;
在维基百科上看到这篇文章,想知道如何应用它们
好的...我正在使用 Kohana PHP 框架,并且可以确定引荐来源标头,但我究竟要在引荐来源标头中检查什么?框架函数只返回引荐来源网址
我如何验证 GET 和 POST 参数?反对什么?存储信息?预期类型?
【问题讨论】:
在 GET 和 POST 参数,不仅仅是 cookie;
检查 HTTP Referer 标头;
在维基百科上看到这篇文章,想知道如何应用它们
好的...我正在使用 Kohana PHP 框架,并且可以确定引荐来源标头,但我究竟要在引荐来源标头中检查什么?框架函数只返回引荐来源网址
我如何验证 GET 和 POST 参数?反对什么?存储信息?预期类型?
【问题讨论】:
为了防止 CSRF,您需要验证一次性令牌,经过 POST 并与当前会话相关联。类似于以下内容。 . .
在用户请求删除记录的页面:
confirm.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>
那么当谈到实际删除记录时:
confirm_save.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 接受并在几分钟后过期(此示例中未显示过期)。
【讨论】:
uniqid() must not be used for security purposes. Use a cryptographically secure random function/generator and cryptographically secure hash functions to create unpredictable secure IDs.
通过推荐检查,您所做的一切都是为了确保推荐人来自您的站点/系统。如果引用者不存在或来自外部站点,则引用检查将失败,您可能不想接受正在发出的任何请求。
过去,各种技术和浏览器(flash..et al)的问题允许伪造引用标头。它需要考虑。有几种方法使用 javascript 链接到请求标头中不存在/传递引用数据的资源。
这种行为因浏览器而异。如果您使用 javascript 提交表单,您通常可以。如果您使用诸如 window.location 之类的东西,您很可能不应该期望存在参考数据。
一种流行的 CSRF 预防方法是不使用 cookie 并始终在引用之间传递状态...在整个应用程序的所有链接中传递会话令牌。
【讨论】:
[注意:] Kohana 框架已弃用,Kohana PHP 7 的新分支是https://koseven.ga/,它确实支持 CSRF 功能是安全类。
您可以使用官方的 koseven 安全功能。 这是koseven security class 的链接。
【讨论】: