澄清 CORS——跨域资源共享
内容
引言
接续我之前关于网站安全周的博客,我们将讨论网络上的 CORS。
CORS 是跨域资源共享协议,通常用于网站和 API 托管在不同的服务器上的情况。例如,您的网站位于 website.com,而 API 位于 api.com。
这是一种常见的架构模式,因为它允许每个 API 和网站独立运行,速度更快,但也可能引入一些安全问题。
访问控制标头
要允许 CORS 请求,您的 API 需要响应某些标头,这些标头允许您的网站/前端执行某些行为。
来源访问控制允许
这个请求头可以通过调用 API 的源地址来设置origin,但只能是单源请求。
或者,它也可以是一个单源*请求头,但这不允许传递凭据,我们稍后会讨论这个问题。
如果可能的话,最好将特定原点设置为*。
用法示例:
Access-Control-Allow-Origin: https://mozilla.org
访问控制允许方法
您可以设置此标头,其中包含允许用于联系您的 API 的 HTTP 方法列表。
一般来说,OPTIONS 请求应该包含在这个列表中,因为任何前端在发出实际请求之前都会先发出一个 OPTIONS 请求(通常称为预检请求)。GET 请求不会发出 OPTIONS 请求。
也可以*,但是如果可以的话,你应该说得更具体一些。
用法示例:
Access-Control-Allow-Methods: POST, GET, OPTIONS
访问控制最大期限
这个请求头可以设置为前端缓存预检 OPTIONS 请求的时间段。该值以秒为单位,例如 86400 秒等于 24 小时。
假设您已将 Max-Age 设置为上述值,这意味着您从前端向 API 发出的第一个请求将先发出一个 OPTIONS 请求,然后再发出实际请求。之后 24 小时内无需再向该 API 发出另一个 OPTIONS 请求。
用法示例:
Access-Control-Max-Age: 86400
访问控制允许标头
您可以设置此标头,其中包含允许传递给 API 的标头列表。
用法示例:
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
访问控制允许凭据
此标头指定是否在请求中包含凭据。凭据包括 cookie、授权标头或 TLS 客户端证书。
用法示例:
Access-Control-Allow-Credentials: true
速率限制
请注意,该Access-Control-Allow-Origin标头仅阻止浏览器向 API 发送请求,并不能阻止其他机器、命令行、Postman 等工具调用您的 API。
您应该确保已采取其他安全措施来防止 API 被滥用,例如身份验证和速率限制。
速率限制是指限制对 API 的调用次数。根据 API 的开发方式,可以通过多种方式实现。我建议您寻找一些库来帮助您管理速率限制。
概括
总而言之,将 API 和网站分离可以带来实实在在的开发优势,但同时也可能引入安全问题,例如需要处理 CORS 问题。
希望本文能帮助您更好地理解 CORS 及其安全防护措施。
现在就设置这些标头!
祝您搭建愉快!
文章来源:https://dev.to/jordanfinners/clarifying-cors-cross-origin-resource-sharing-4dk9