深入了解跨域资源共享

发布于 作者

Diving into Cross-Origin Resource Sharing image

在本教程中,了解如何利用 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-ENCODEX-GITHUB-ID 或类似的东西,默认情况下这些标头将在 CORS 请求中被剥离,这反过来可能会导致您没有意识到的意外副作用。

最大年龄

我们可以使用 CORS 配置中的此选项来配置客户端可以缓存资源多长时间。

'max_age' => 0,

默认情况下,我们将此配置为使客户端不缓存应用程序中的任何内容。 但是,这是灵活的,因为只有浏览器之类的集成才能完全遵守此规则。

凭证

最后,我们有支持凭据选项。 此选项默认情况下设置为 false

'supports_credentials' => false,

我们在此处配置的是,我们是否希望允许来自第三方来源进行身份验证。 这需要认真考虑,因为如果您将其设置为 true,人们可以登录并获取身份验证详细信息。 如果我们将此设置为 true,那么您将使自己面临用户潜在的钓鱼攻击,这会导致进一步的问题。 如果您必须将其设置为 true,那么请确保其他选项是精确的,以便您可以控制谁可以执行此操作。 您最不想做的事情就是允许来自支持凭据的任何来源的所有请求!

这只是对配置中可以做什么以及每个选项对您和您的应用程序意味着什么的概述。 在配置 CORS 配置和规则时始终要谨慎,因为您不希望由于错误的配置而使自己以及您的用户面临潜在的攻击。

Steve McDougall photo

技术作家,就职于 Laravel 新闻,开发者大使,就职于 Treblle。 API 专家,资深 PHP/Laravel 工程师。 YouTube 直播主.

归档于
Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,绝不错过新的提示、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。 使用 AI、自动完成和对本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

无妥协

来自 No Compromises 播客的两位经验丰富的开发者 Joel 和 Aaron 现已可以为您的 Laravel 项目提供服务。 ⬧ 固定价格为每月 7500 美元。 ⬧ 无需冗长的销售流程。 ⬧ 无需合同。 ⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,使您的应用程序保持最新状态。

Shift
Bacancy logo

Bacancy

只需每月 2500 美元,即可使用经验丰富的 Laravel 开发者(具有 4-6 年的经验)为您的项目提供强大支持。获得 160 小时的专有技术和 15 天无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得 Lucky - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

适用于 Laravel 的电子商务。一个开源软件包,为 Laravel 带来了现代无头电子商务功能的强大功能。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表板、身份验证、即用型组件、统计信息、博客、文档等等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

您无缝升级 Laravel、降低成本并加速创新的合作伙伴,助力企业取得成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发者能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包在您的 Laravel 应用程序中添加评论

阅读文章