CORS Api与Symfony

17

我应该使用Symfony创建跨域API。是否有相关的bundle可用?

我已经尝试了FOS Rest Bundle,但似乎没有解决我的问题。


1
看看这个 https://github.com/nelmio/NelmioCorsBundle - Robert
也可以查看API平台捆绑包。 - COil
"我的问题" - 什么问题?虽然很容易猜到,但我们不应该被迫在第一时间猜测。-1 - svgrafov
5个回答

21

非常有用,解决了CORS问题。我不会说CORS是一个问题,没有它才是问题! - James

12

我在文件public/index.php中使用了Symfony 5WordPress,这段代码完美运行。

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包。这个扩展包对我没有用。


3
天才。我和 Nelmio cors bundle 相同的问题,没有添加头部。这个解决方案对我有效! - Ste
4
你在代码的哪个位置插入了这些行?我尝试了很多位置,但它对我没有用。谢谢。 - Écio Silva
嗨,您必须在代码头部使用。 - juanitourquiza
3
使用“Access-Control-Allow-Origin:”可以禁用CORS检查。 引自维基百科: 如果一个站点指定了头部“Access-Control-Allow-Credentials:”,第三方站点可能能够执行特权操作并检索敏感信息。即使没有这样做,攻击者也可能通过代理用户的浏览器来绕过任何基于IP的访问控制。 - Dominik
1
@Dominik 你提供的维基百科摘录讨论的是Access-Control-Allow-Credentials而不是Access-Control-Allow-Origin头部。据我所知,将Access-Control-Allow-Origin头部设置为适当的值不会引起任何安全问题。 - undefined

10

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

  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 ;
}

1

https://github.com/nelmio/NelmioCorsBundle

或者

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

  • “被检查”的来源将自动嵌入到HTTP_ORIGIN中,由任何浏览器完成
  • 不要使用单个的 '*' 通配符
  • 如果需要,可以在请求和响应监听器中尽早地削减请求处理
  • 不仅使用OPTIONS方法发送它(某些浏览器可能希望在GET或甚至POST请求中使用它)

你可以在一些配置yaml文件中管理你Origin Cors列表。如果HTTP_ORIGIN与你的Cors列表匹配,则验证HTTP_ORIGIN。然后将HTTP_ORIGIN作为“VALID”发送回去。 < p > < code>Access-Control-Allow-Origin: THE_HTTP_ORIGIN_HERE

+其他的访问控制头。了解更多深入信息请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS


最终,这基本上是与https://github.com/nelmio/NelmioCorsBundle使用的相同工作流程。 我的建议:节省你的时间;)
TLDR; 不要轻视跨域资源共享(CORS),不要只使用通配符,一个糟糕的CORS实现可以让攻击者从你的用户那里窃取活动会话。
步骤1:用户使用您的API,拥有会话cookie, 步骤2:用户访问一个随机站点,该站点嵌入代码,刚刚请求浏览器直接向您的API触发带有cookie凭据的请求。 步骤3:您的API必须将其检测为攻击并不回答*。
受害者浏览器不能通过JavaScript发送伪造的HTTP_ORIGIN。

0

提供静态文件

NelmioCorsBundle文档中提到提供静态文件时要小心。

配置在PHP/应用程序级别。这很方便,但也意味着任何请求提供静态文件而不经过Symfony的请求都不会添加CORS标头,因此,如果您需要为静态文件提供CORS,则最好在Web服务器中配置这些标头。

对于那些使用Api platformcaddy server的人来说。

您可以使用header指令编辑您的Caddyfile,以设置Access-Control-Allow-Origin的默认值。

header ?Access-Control-Allow-Origin "http://localhost:3000"

您也可以使用环境变量:

.env

WEB_APP_URL=http://localhost:3000

Caddyfile

header ?Access-Control-Allow-Origin "{$WEB_APP_URL}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接