如何设置 CORS

news/2024/11/20 18:30:24/文章来源:https://www.cnblogs.com/sonui/p/18558981

0x00 引言

CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种安全机制,用于限制哪些源(origin)可以访问服务器上的资源,这里探讨下该如何正确的设置 CORS。

TLDR

关键配置要点:

  • Access-Control-Allow-Origin: 禁止使用 *,应该设置为具体的白名单域名
  • Access-Control-Allow-Methods: 明确指定允许的 HTTP 方法
  • Access-Control-Allow-Headers: 明确指定允许的请求头
  • Access-Control-Allow-Credentials: 如需携带认证信息,必须设置为 true

0x01 跨域触发条件

flowchartA[浏览器]B[请求URL]C[是否同源]D[获取同源策略]E[允许访问]F[触发CORS检查]G[跨域错误]H[是否简单请求]I[Preflight]J[正式请求]A --> |发起请求| BB --> |检查| CC --> |否| FC --> |是同协议+域名+端口| ED --> |检查请求体| HH --> |是| EH --> |否| II --> |允许| EI --> |不允许| G

注:简单请求的定义:

  1. 请求方法为 GET、POST 或 HEAD
  2. 请求头只包含安全的字段(Accept、Accept-Language、Content-Language、Content-Type等)
  3. Content-Type 只限于:application/x-www-form-urlencoded、multipart/form-data、text/plain

这里只选取了部分内容,更多内容请参考 MDN 文档

0x02 CORS 规范

当为非同源非简单请求时会触发 preflight 检查,浏览器会先发出一个 OPTIONS 请求,用于检查服务器是否支持该请求,其请求头信息和正式请求一致,但不会携带Body。

🚨 重要提示: 为什么特别强调非简单请求?当浏览器认为这个请求为简单请求时,不会通过两次请求进行检查,也就是没有 OPTIONS preflight 请求,是直接发送正式请求,然后根据正式请求的返回头判定是否跨域决定脚本是否可以读取返回内容。

因此也带来一个问题,虽然前端读取不到服务器返回的信息,但请求是真实发出去服务器执行了的,如果服务器没有正确的跨域处理中间件则会导致安全问题。

Example:

OPTIONS /api/v1/user HTTP/1.1
Origin: http://hacker.com
Sec-Fetch-Dest: empty
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors

服务器在收到 OPTIONS 请求后,需要根据配置进行检查,如果允许则返回以下信息:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://hacker.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization

0x03 设置建议

Origins

创建一个中间件,在处理器处理之前检查 OriginMethod,首先判断 Origin 是否在白名单内,如果在白名单允许范围内再检查 Method,如果是 OPTIONS 请求则直接返回 204 No Content,否则进入下一步继续处理请求。

Methods

可以设置为 *,如果需要限制则设置为白名单。

Headers

可以设置为 *,推荐限制则设置为白名单。注意,在 Authorization 标头不能被泛化处理,始终需要明确列出。如果服务器还提供视频服务且为白名单策略时需要添加一个 Range 头。

Credentials

如果设置为 true,则允许浏览器在跨域请求中携带 Cookie 信息,但同时 Access-Control-Allow-Origin 不能设置为 * 必须明确指出具体域名,如果设置为 * 会无效。

Expose-Headers

无所谓,可以不指定,如果浏览器需要访问未在 Access-Control-Allow-Headers 中列出的头可以通过设置这个头来解决。

0x04 示例代码

const allowedOrigins = ['https://example.com', 'https://api.example.com'];app.use((req, res, next) => {const origin = req.headers.origin;if (allowedOrigins.includes(origin)) {res.setHeader('Access-Control-Allow-Origin', origin);res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');res.setHeader('Access-Control-Allow-Credentials', 'true');}if (req.method === 'OPTIONS') {return res.sendStatus(204);}next();
});

特别注意:

  1. 预检请求的缓存:可通过 Access-Control-Max-Age 设置预检请求的缓存时间,避免重复发送
  2. 错误处理:当 CORS 检查失败时,浏览器会在控制台输出详细的错误信息,但实际的网络请求响应会被浏览器拦截,JavaScript 无法访问具体的错误信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837457.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时多模态 AI 的 N 种新可能丨实时互动和大模型专场@RTE2024回顾

在本届 RTE2024 大会上,来自产业界和学术界的多位专家深入探讨了实时互动和大模型技术的最新进展及其潜在应用。西湖心辰联合创始人俞佳、声网 AI 算法工程师乔齐、MiniMax 资深音频算法专家张博闻、商汤科技数字文娱解决方案负责人焦文奎以及面壁智能算法 VP 翟忠武等分享了他…

vscode主题美化

vscode 主题美化 主题使用Tokyo Night由于我在用rust的时候发现其对一些变量的颜色不太好看,所以自己又在设置中改了一点"editor.tokenColorCustomizations": {...."[Tokyo Night]": { // or "[Tokyo Night Storm]""textMateRules": […

2024.11.20总结

1本文于 github 博客同步更新。 A: 一个数可以被操作当且仅存在一列的顶部元素为它且存在一列的底部元素为它,初始扫一遍,将合法的元素以顶部所在列为关键字扔到小根堆里,每次找到最小的元素添加,然后检查将新露出来的元素是否存在匹配,若结束时未填完即为无解。 B: 要么…

ABAP 日期计算

RP_CALC_DATE_IN_INTERVAL 日期函数2 FIMA_DATE_CREATE 有问题 在2月份计算有问题 慎用 计算两个日期月份 FIMA_DAYS_AND_MONTHS_AND_YEARS

群晖NAS维修数据恢复

一台群晖NAS,开机状态灯是黄灯,DISC4也是亮黄灯,机器一直在报警。 群辉型号DS415+,是一种典型的硬盘损坏的情况,这是一台四盘位的一个群辉NAS,第一时间把每个硬盘取下来编个编号,WD的红盘也就是nasVR专用硬盘,型号是WD401F2X的,生产日期有三块是2015年,有一块是比较新…

实景三维技术在基层社会治理中的数智化应用

在推进国家治理体系和治理能力现代化的进程中,基层社会治理的数字化转型尤为关键。实景三维技术,以其直观、精准的空间信息表达能力,正在成为基层社会治理的有力工具。本文将探讨实景三维技术如何在“地、房、人、用、管”五个维度赋能基层社会治理。一、实景三维技术简介实…

Nginx服务器配置---反向代理服务时proxy_pass的转发规则

nginx是由俄罗斯开发的一款http web服务器,我们经常用这款服务器做负载均衡和反向代理。今天我们就来聊聊Nginx作为反向代理时,如何进行路由配置。假设你已经部署好Nginx了,我们进入Nginx安装目录,进入nginx.conf文件。找到http节点下的server节点,值是一个json。在json中…

less 全局变量使用 引用

参考链接: https://blog.csdn.net/qq_42493241/article/details/120021001 照搬成功 (以防链接失效截图)

Ablations

消融实验(ablation study)是什么? 太长不看版: 说白了就是设立对照组/控制变量法的意思,通过去除/增加某个模块的作用,来证明该模块的必要性,如果消融实验后得到性能结果大幅变化,说明该模块起到了作用。—————————————————————————— 严谨版: …

低代码无代码开发工具:TOP10排名

随着企业数字化转型步伐的加快,无代码及低代码开发工具(LCNC)已跃升为构建应用的首选方案。这些工具凭借简化开发流程、降低技术壁垒的优势,赋能企业迅速构建并部署应用,以灵活应对市场的瞬息万变。为何需要低无代码? 在快速迭代的商业环境中,传统的代码开发模式往…

Debian12关闭休眠模式

场景描述: 日常服务器部署中,系统环境如果是Debian12操作系统,那么安装完操作系统后,会默认开启系统自动休眠模式, 需要关闭系统的自动休眠,否则网络状态也会休眠,导致远程连接服务器的时候,没有响应! 临时解决方式: 如果目标服务器在机房或者在旁边,可以移动下该服…