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问题非常有用
我不确定这是正确的方法,但我为我解决了:
- 创建新的事件订阅者(如
ResponseSubscriber
)
- 监听
KernelEvents::RESPONSE
事件
- 在您的处理程序中添加以下内容:
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 5
和 Wordpress
文件中的这段代码 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。
我应该使用 Symfony 跨域 API。 有一些捆绑包吗?
我试过 FOS Rest Bundle,但似乎没有解决我的问题。
我建议你使用 NelmioCorsBundle:
https://github.com/nelmio/NelmioCorsBundle
此捆绑包允许您使用 ACL-style per-URL 配置发送 Cross-Origin 资源共享 headers。
对于CORS问题非常有用
我不确定这是正确的方法,但我为我解决了:
- 创建新的事件订阅者(如
ResponseSubscriber
) - 监听
KernelEvents::RESPONSE
事件 - 在您的处理程序中添加以下内容:
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 5
和 Wordpress
文件中的这段代码 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。