【问题标题】:Codeigniter 4 csrf filter for post methods in given area onlyCodeigniter 4 csrf 过滤器仅用于给定区域中的 post 方法
【发布时间】:2021-12-28 19:06:40
【问题描述】:

app/Config/Filters.php

您可以为所有发布方法设置过滤器

public $methods = [
    'post' => ['filter'],
];

或者您可以为给定区域设置过滤器(但所有方法)

public $filters = [
    'filter' => ['before' => ['account/*', 'profiles/*']]
];

如何在给定区域中为仅发布方法设置过滤器?或者甚至在除一个以外的所有领域都更好?

我知道个人端点路由是可能的,但我希望找到更多的全球解决方案..

【问题讨论】:

  • From the docs: "选择的 URI 可以被列入 CSRF 保护的白名单(例如 API 端点需要外部发布的内容)。您可以通过将这些 URI 添加为过滤器中的例外来添加这些 URI:。 ..”。这就是你所追求的吗?
  • @Don'tPanic 是的,但我觉得它不仅可以用于发布,还可以用于其他方法。我还假设 $method 配置覆盖了以前的配置,或者我可以将它们结合起来?..
  • 我尝试将 $global 与 $method 结合起来,似乎后者覆盖了前者。就像在 csrf 中一样,post 忽略了 global..中的异常。
  • 我不确定我理解你的意思。我从文档中引用的文本是关于将 URI 从 CSRF 保护中排除,方法是将它们添加到 except 数组中。您的问题是“在除一个以外的所有领域”,所以我认为这就是您要尝试做的。 except 也支持正则表达式,因此您可以排除模式。关于方法 - 在该文档页面的顶部它说:“CSRF 保护仅适用于 POST/PUT/PATCH/DELETE 请求。其他方法的请求不受保护。”
  • @Don'tPanic 是的,但 URI 排除只是一部分。问题是将其与特定的请求方法结合起来。

标签: php codeigniter-4


【解决方案1】:

这个怎么样,未经测试,但应该可以。

创建一个从 CSRF 扩展的新过滤器并检查请求方法

namespace App\Filters;

use CodeIgniter\Filters\CSRF;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
use Exception;

class CustomCSRF extends CSRF implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        $request = parent::before($request, $arguments);
        try {
            if ($request->getMethod() != "post") {
                throw new Exception("Wrong method");
            }
        } catch (Exception $e) {
            return Services::response()
                ->setJSON([
                    'error' => $e->getMessage()
                ])
                ->setStatusCode(ResponseInterface::HTTP_UNAUTHORIZED);
        }
        return $request;
    }
}

然后将其添加到路由过滤器下

public $aliases = [
    ...
    ...
    'customcsrf' => CustomCSRF::class
];

...
...

public $filters = [
    'customcsrf' => ['before' => ['account/*', 'profiles/*']]
];

【讨论】:

  • 是的,这是可能的,谢谢。我在想如果它是一个帖子,检查每个请求是不必要的负载,但我想在每种情况下都是这种情况。我会看看是否有人提供另一种解决方案,否则我会选择这个:)
猜你喜欢
  • 2017-10-16
  • 2015-08-11
  • 2021-06-26
  • 2012-06-20
  • 2018-02-17
  • 2019-01-08
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多