深入了解跨域资源共享
发布于 作者 Steve McDougall
在本教程中,了解如何利用 Laravel CORS 的强大功能。 探索什么是 CORS 以及如何释放它的潜力,实现无缝的跨域资源共享。
Laravel 很久以前就开始支持 CORS;但是,直到最近的版本才开始内置支持,之前只能通过第三方包来实现。 让我们深入了解 Laravel 中的 CORS,它是什么,以及为什么它很重要。
CORS 代表跨域资源共享。 它是允许您安全地向与自身不同的域发出请求的机制。 它定义了一组服务器可以使用来控制哪些来源可以访问其资源的标头。 但是这对您来说意味着什么呢?
作为一名 API 开发者,我非常习惯使用 CORS。 它现在已经成为一种自然习惯。 Laravel 默认情况下内置了 CORS 支持,它会从 config/cors.php
中读取配置,并根据配置的值以编程方式构建保护规则。 让我们遍历该文件中的选项,了解它们对我们意味着什么。
路径
我们的第一个选项是 paths,它默认情况下包含以下内容
'paths' => ['api/*', 'sanctum/csrf-cookie'],
在这个选项中,我们告诉 CORS 中间件匹配此处列出的任何请求,并允许 CORS 继续进行下一个检查。 如果传入的请求与我们添加到配置中的任何模式都不匹配,我们将自动阻止来自外部主机的任何请求。
方法
我们的下一个选项是 allowed methods,它默认情况下以以下方式配置
'allowed_methods' => ['*'],
默认情况下,Laravel 将允许任何方法从外部传入,这意味着 API 集成不需要任何特殊考虑。 您可以在此处设置严格或宽松的规则。 这完全取决于您。 我通常保持默认设置,因为我通常构建的 API 在某些方面需要完全的外部控制。 如果我们将此更改为
'allowed_methods' => ['GET', 'POST','PUT','PATCH'],
这意味着我们希望拒绝任何明确为 DELETE
请求或未列在 CORS 配置中的请求的外部请求。 如果您有一个公共只读 API,您更有可能以不同的方式配置它。
来源
接下来,我们看一下允许的来源,它默认情况下配置如下
'allowed_origins' => ['*'],
默认情况下,我们表示将允许来自任何来源(又名 IP 地址或服务器)的连接或请求。 如果我们正在构建内部 API,我们将考虑将其配置为 IP 范围或限制为特定域名。 这有助于保护您免受来自您可能不希望他们发送请求的位置的人的请求。 再次强调,如果您的 API 是公开的,您可能会保留默认设置。 如果您在与您的 API 集成时遇到 CORS 问题,请记住此设置。
您可以使用额外的配置部分来减少特异性,更多地依赖正则表达式匹配。 这是允许的来源模式,您可以在其中添加正则表达式来检查请求的来源,以查看它们是接受还是拒绝。 默认情况下,它是一个空数组,因为您需要谨慎使用此配置
'allowed_origins_patterns' => [],
标头
在 CORS 配置中,您可以根据需要设置标头的严格或宽松程度。 这部分配置允许您设置来自第三方来源的请求传入时允许的标头。 假设您想要非常具体,以便外部方只能使用特定内容类型进行请求,或者强制接受特定内容类型。 这不太可能,但是一个很好的例子。 在某些 API 中,尤其是在几年前,我曾经添加应用程序中间件来检查它们是否接受 JSON,如果它们没有接受,则会发出警告。 我们可以在此处执行相同的操作,但仅限于第三方。 尽管 Laravel 中的默认配置如下所示
'allowed_headers' => ['*'],
公开标头
公开标头很有趣。 您可能不需要它,但如果您需要,那么弄清楚您需要它将花费很长时间! 默认配置如下
'exposed_headers' => [],
为了了解在此处添加的内容,如果您需要它,您需要了解是谁或什么与您集成。 通常,此处的 CORS 问题将与浏览器规则、CORS 和 CORS 请求有关,其中标头被剥离,因为它们被认为是不安全的。 假设您有一些非默认的标头,例如:X-VAPOR-ENCODE
或 X-GITHUB-ID
或类似的东西,默认情况下这些标头将在 CORS 请求中被剥离,这反过来可能会导致您没有意识到的意外副作用。
最大年龄
我们可以使用 CORS 配置中的此选项来配置客户端可以缓存资源多长时间。
'max_age' => 0,
默认情况下,我们将此配置为使客户端不缓存应用程序中的任何内容。 但是,这是灵活的,因为只有浏览器之类的集成才能完全遵守此规则。
凭证
最后,我们有支持凭据选项。 此选项默认情况下设置为 false
'supports_credentials' => false,
我们在此处配置的是,我们是否希望允许来自第三方来源进行身份验证。 这需要认真考虑,因为如果您将其设置为 true,人们可以登录并获取身份验证详细信息。 如果我们将此设置为 true,那么您将使自己面临用户潜在的钓鱼攻击,这会导致进一步的问题。 如果您必须将其设置为 true,那么请确保其他选项是精确的,以便您可以控制谁可以执行此操作。 您最不想做的事情就是允许来自支持凭据的任何来源的所有请求!
这只是对配置中可以做什么以及每个选项对您和您的应用程序意味着什么的概述。 在配置 CORS 配置和规则时始终要谨慎,因为您不希望由于错误的配置而使自己以及您的用户面临潜在的攻击。
技术作家,就职于 Laravel 新闻,开发者大使,就职于 Treblle。 API 专家,资深 PHP/Laravel 工程师。 YouTube 直播主.