CORS Api 与 symfony

CORS Api with symfony

我应该使用 Symfony 跨域 API。 有一些捆绑包吗?

我试过 FOS Rest Bundle,但似乎没有解决我的问题。

我建议你使用 NelmioCorsBundle:

https://github.com/nelmio/NelmioCorsBundle

此捆绑包允许您使用 ACL-style per-URL 配置发送 Cross-Origin 资源共享 headers。

对于CORS问题非常有用

我不确定这是正确的方法,但我为我解决了:

  1. 创建新的事件订阅者(如ResponseSubscriber
  2. 监听KernelEvents::RESPONSE事件
  3. 在您的处理程序中添加以下内容:
if ($event->getRequest()->getMethod() === 'OPTIONS') {
    $event->setResponse(
            new Response('', 204, [
                'Access-Control-Allow-Origin' => '*',
                'Access-Control-Allow-Credentials' => 'true',
                'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
                'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type',
                'Access-Control-Max-Age' => 1728000,
                'Content-Type' => 'text/plain charset=UTF-8',
                'Content-Length' => 0
            ])
        );
    return ;
}

我使用了 Symfony 5Wordpress 文件中的这段代码 public/index.php 工作得很好。

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Allow: GET, POST, OPTIONS, PUT, DELETE");
$method = $_SERVER['REQUEST_METHOD'];
if ($method == "OPTIONS") {
    die();
}

此外,我删除了包 cors .. 这个包对我不起作用

https://github.com/nelmio/NelmioCorsBundle

如果你想自己写一个cors包,这里有一些提示:

  • 'to Checked' Origin 将被任何浏览器自动嵌入 HTTP_ORIGIN
  • 不要使用唯一的“*”通配符
  • 如果您使用请求和响应侦听器(如果需要),您可以提前结束请求处理
  • 不要只使用 OPTIONS 方法发送它(某些浏览器可能需要它在 GET 甚至 POST 请求中。)

例如,在一些配置 yaml 文件中管理您的 Origin cors 列表。 并验证 HTTP_ORIGIN 是否与您的 cors 列表匹配。然后将 HTTP_ORIGIN AS "VALID" 发回。

Access-Control-Allow-Origin: THE_HTTP_ORIGIN_HERE

+另一个Access-Controlheader。 有关更多详细信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS


最后,这与 https://github.com/nelmio/NelmioCorsBundle 使用的工作流程基本相同。 我的建议:注意安全 ;)

TLDR;不要仅仅使用通配符就轻视 cors,在糟糕的 cors 实施中,每个攻击者站点都可以从您的用户那里获取活跃的 session。

  • 第 1 步:用户使用您的 API,有一个 session cookie,
  • 第 2 步:用户访问一个随机站点,该站点嵌入了刚刚请求浏览器使用 cookie 凭据直接向您的 api 触发请求的代码。
  • 第 3 步:您的 api 必须将此检测为攻击,而不是用 *.
  • 来回答

受害者浏览器,不可能通过javascript发送伪造的HTTP_ORIGIN。