【问题标题】:preventing csrf in php防止 php 中的 csrf
【发布时间】:2010-12-19 08:05:12
【问题描述】:
  1. 在 GET 和 POST 参数,不仅仅是 cookie;

  2. 检查 HTTP Referer 标头;

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

好的...我正在使用 Kohana PHP 框架,并且可以确定引荐来源标头,但我究竟要在引荐来源标头中检查什么?框架函数只返回引荐来源网址

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

【问题讨论】:

    标签: php security kohana


    【解决方案1】:

    为了防止 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 接受并在几分钟后过期(此示例中未显示过期)。

    【讨论】:

    • 会话过期应该不够吧?我的意思是不要使用自定义函数检查过期时间。
    • 会话不会阻止 CSRF @JavierConstanzo。有时它们会持续数周或更长时间。如果您在会话仍处于活动状态时打开一个受到 CSRF 攻击的网站会怎样?
    • 您为什么要配置您的服务器 @EdsonMedina 以进行持续数周的会话?我知道会话不足以阻止 CSRF,我并不是在暗示这一点。
    • 根据php.net/manual/en/function.uniqid.phpuniqid() must not be used for security purposes. Use a cryptographically secure random function/generator and cryptographically secure hash functions to create unpredictable secure IDs.
    • 当您在不同的标签页中打开同一个网页时,这是一个问题。因为随机值在每个选项卡中都会再次生成,所以用户必须坚持使用他当前的选项卡。
    【解决方案2】:

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

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

    这种行为因浏览器而异。如果您使用 javascript 提交表单,您通常可以。如果您使用诸如 window.location 之类的东西,您很可能不应该期望存在参考数据。

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

    【讨论】:

    • 非常正确,HTTP Referer 标头很容易被伪造,并且不提供任何针对 CSRF 的真正保护。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2014-11-29
      • 1970-01-01
      • 2018-01-08
      • 2015-01-27
      • 1970-01-01
      • 2017-03-03
      相关资源
      最近更新 更多