#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。

目录

一、什么是CORS

跨域请求的背景

CORS的工作原理

CORS的实现

总结

二、CORS预检请求的详细流程解析

预检请求的触发条件

预检请求的详细流程

示例代码

总结

三、CORS预检请求的安全性分析

四、服务器响应CORS预检的配置方法

五、CORS预检请求常见错误排查

六、CORS配置不当导致的安全漏洞案例

案例一:Access-Control-Allow-Origin设置为*

案例二:Access-Control-Allow-Credentials设置为true

案例三:Access-Control-Allow-Origin设置为请求头中的Origin字段

七、如何避免CORS配置不当导致的安全漏洞

八、如何检测CORS配置的安全性?

方法一:手动测试

方法二:使用自动化工具

方法三:参考安全最佳实践


一、什么是CORS

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种用于在浏览器中处理跨域资源访问的机制。当一个网页尝试从一个源请求获取资源,而该资源的服务器与网页所在的源不同时,就会涉及到跨域请求。CORS通过在HTTP请求头中添加一些特定的字段信息来进行通信,以告知服务器是否支持跨域请求,从而使得网页能够在受限的情况下安全地进行跨域资源访问。

跨域请求的背景

在默认情况下,浏览器的同源策略会限制跨域请求,即只允许网页从同一域名下获取数据。这是为了保护用户的安全和隐私。然而,在某些情况下,我们希望网页能够跨域请求并获取其他域名下的资源,这时就需要使用CORS来解决跨域问题。

CORS的工作原理

CORS通过在HTTP请求头中添加一些特定的字段信息来进行通信。具体来说,当网页发送跨域请求时,浏览器会自动发送一个预检请求(OPTIONS请求)给服务器,该请求包含了一些额外的头信息,如Origin(标识发起请求的源)、Access-Control-Request-Method(请求方法)、Access-Control-Request-Headers(请求头)等。服务器收到预检请求后,根据请求头中的信息,决定是否允许该跨域请求。

如果服务器确认允许,就会在响应头中添加一些字段信息,如Access-Control-Allow-Origin(指定允许的源)、Access-Control-Allow-Methods(指定允许的请求方法)、Access-Control-Allow-Headers(指定允许的请求头)等。

CORS的实现

CORS的实现主要包括一些客户端的工作以及两类服务端的处理。服务端需要对满足以下所有条件的HTTP请求做出相应的CORS回应:

  1. 如果Origin被服务端允许,服务端返回请求是带有Access-Control-Allow-Origin头,并且这个头部信息的值和客户端Origin的值保持一致;否则就表示不被允许。
  2. 如果Access-Control-Allow-Origin被设置成*,则意味着任何Origin都被允许。注意:如果所访问的资源需要凭证,那么Access-Control-Allow-Origin则不应该被设置为*,而且Access-Control-Allow-Credentials头需要被设置成true

总结

CORS是一种用于在浏览器中处理跨域资源访问的机制,它通过在HTTP请求头中添加一些特定的字段信息来进行通信,以告知服务器是否支持跨域请求。CORS的实现主要包括客户端和服务器端的工作,通过设置特定的HTTP头来控制浏览器是否允许跨域请求。

二、CORS预检请求的详细流程解析

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种用于在浏览器中处理跨域资源访问的机制。当一个网页尝试从一个源请求获取资源,而该资源的服务器与网页所在的源不同时,就会涉及到跨域请求。为了确保跨域请求的安全性,浏览器会在发送实际请求之前,先发送一个预检请求(OPTIONS请求),以确认服务器是否允许该跨域请求。

预检请求的触发条件

预检请求并不是每次跨域请求都会触发,而是满足以下条件之一时才会触发:

  1. 请求方法:如果请求方法不是GET、POST、HEAD这三种之一,就会触发预检请求。例如PUT、DELETE等方法的请求会触发预检请求。
  2. 自定义头字段:当请求包含自定义头字段时,会触发预检请求。例如在请求中设置了自定义的头信息如test:test,就会触发预检请求。
  3. 特定MIME类型的POST请求:对于搭配某些MIME类型的POST请求(非Content-Type为特定三种类型的POST请求)也会触发预检请求。

预检请求的详细流程

  1. 发送预检请求:当满足触发条件时,浏览器会自动发送一个OPTIONS请求给服务器。该请求包含了一些额外的头信息,如Origin(标识发起请求的源)、Access-Control-Request-Method(请求方法)、Access-Control-Request-Headers(请求头)等。

  2. 服务器处理预检请求:服务器接收到预检请求后,会根据请求头中的信息,决定是否允许该跨域请求。如果允许,服务器会在响应头中添加一些字段信息,如Access-Control-Allow-Origin(指定允许的源)、Access-Control-Allow-Methods(指定允许的请求方法)、Access-Control-Allow-Headers(指定允许的请求头)等。

  3. 浏览器处理预检请求的响应:浏览器接收到服务器的响应后,会检查响应头中的CORS头信息,以确定是否允许实际请求。如果允许,浏览器才会真正发送实际请求。

  4. 发送实际请求:如果预检请求成功,浏览器会发送实际请求。此时,服务器会根据实际请求的内容,返回相应的资源。

示例代码

以下是一个使用fetch API发送跨域请求的示例代码,其中包含了预检请求的触发过程:

// 假设我们请求https://api.github.com/ ,这个接口支持跨域访问 
// 通过添加自定义请求头,来触发预检请求 
var requestOptions = {method: 'GET',headers: {test: 'test' // 自定义的头信息 },redirect: 'follow'
};fetch('https://api.github.com/',  requestOptions).then(response => response.json()) .then(result => console.log(result)) .catch(error => console.log('error',  error));

在上述代码中,由于添加了自定义头信息,浏览器会先发送一个OPTIONS预检请求,探测服务器是否允许实际的GET请求跨域访问。服务器根据自身的规则返回响应头信息,如果允许跨域,浏览器才会真正发送GET请求。

总结

CORS预检请求是为了确保跨域请求的安全性而设计的一种机制。通过在发送实际请求之前,先发送一个预检请求,浏览器可以确认服务器是否允许该跨域请求,从而避免潜在的安全风险。预检请求的触发条件包括请求方法、自定义头字段和特定MIME类型的POST请求。了解CORS预检请求的详细流程,有助于开发者更好地理解和使用CORS机制,从而实现安全的跨域资源访问。

三、CORS预检请求的安全性分析

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种用于在浏览器中处理跨域资源访问的机制。为了确保跨域请求的安全性,浏览器会在发送实际请求之前,先发送一个预检请求(OPTIONS请求),以确认服务器是否允许该跨域请求。这种机制虽然提高了跨域请求的安全性,但也带来了一些新的安全风险。

  1. CORS误配置风险:如果服务器对CORS的配置不当,可能会导致未经授权的跨域请求被接受,从而引发安全问题。例如,服务器错误地配置了Access-Control-Allow-Origin*,允许所有源的跨域请求,这可能会导致敏感信息泄露。

  2. CSRF(跨站请求伪造)风险:攻击者可以利用CORS实现CSRF攻击。例如,恶意网站可以利用CORS请求接口获取用户数据或执行增删改操作。为了防止CSRF攻击,服务器应该在CORS请求中验证Origin头字段,并且在响应中设置合适的Access-Control-Allow-Credentials值。

  3. 信息泄露风险:攻击者可以利用CORS的一些特性获取敏感信息。例如,根据CORS头部判断网站架构,根据错误信息判断后台技术栈等。

  4. 报文劫持风险:攻击者可以在客户端通过JavaScript劫持CORS报文,改变请求参数、添加非法头部甚至修改响应内容。为了防止报文劫持,服务器应该在响应中设置合适的Content-Security-Policy(CSP)头部。

四、服务器响应CORS预检的配置方法

为了确保CORS预检请求的安全性,服务器需要正确配置响应头信息。以下是一些常见的配置方法:

  1. 设置Access-Control-Allow-Origin:该头部指定了允许进行跨域请求的源。例如,设置为https://example.com 表示只允许来自https://example.com 的跨域请求。如果设置为*,表示允许所有源的跨域请求,但需要注意,这样做可能会导致安全风险。

  2. 设置Access-Control-Allow-Methods:该头部指定了允许的请求方法。例如,设置为GET, POST, PUT, DELETE表示允许GET、POST、PUT、DELETE四种请求方法。

  3. 设置Access-Control-Allow-Headers:该头部指定了允许的请求头。例如,设置为Content-Type, Authorization表示允许Content-Type和Authorization两个请求头。

  4. 设置Access-Control-Allow-Credentials:该头部指定了是否允许发送凭据(如Cookies)。如果设置为true,表示允许发送凭据;如果设置为false,表示不允许发送凭据。

  5. 设置Access-Control-Max-Age:该头部指定了预检请求的结果可以被缓存的时间。例如,设置为86400表示预检请求的结果可以被缓存一天。

五、CORS预检请求常见错误排查

  1. 预检请求未通过:如果服务器拒绝了预检请求,浏览器将不会发送实际请求。此时,可以在浏览器的开发者工具中查看预检请求的响应头信息,检查是否有错误信息。例如,如果服务器没有设置Access-Control-Allow-Origin头部,预检请求将会失败。

  2. 实际请求未通过:如果预检请求通过了,但实际请求未通过,可以在浏览器的开发者工具中查看实际请求的响应头信息,检查是否有错误信息。例如,如果服务器没有设置Access-Control-Allow-Credentials头部,实际请求将会失败。

  3. 请求头信息错误:如果请求头信息错误,可能会导致预检请求或实际请求失败。例如,如果请求头中包含了不允许的自定义头部,预检请求将会失败。此时,可以检查请求头信息,确保其符合服务器的要求。

  4. 服务器配置错误:如果服务器配置错误,可能会导致预检请求或实际请求失败。例如,如果服务器没有正确设置CORS相关的响应头信息,预检请求将会失败。此时,可以检查服务器的配置文件,确保其正确配置了CORS相关的响应头信息。

六、CORS配置不当导致的安全漏洞案例

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种用于在浏览器中处理跨域资源访问的机制。为了确保跨域请求的安全性,服务器需要正确配置CORS响应头信息。然而,许多开发者由于缺乏对CORS的理解,或者为了方便,往往会错误地配置CORS,从而导致安全漏洞。以下是一些CORS配置不当导致的安全漏洞案例。

案例一:Access-Control-Allow-Origin设置为*

在某些情况下,开发者为了方便,会将Access-Control-Allow-Origin设置为*,表示允许所有源的跨域请求。然而,这种做法可能会导致安全风险。例如,假设有一个网站https://example.com ,它的API接口允许跨域请求,并且Access-Control-Allow-Origin设置为*。此时,如果有一个恶意网站https://malicious.com ,它可以利用JavaScript代码向https://example.com 发送跨域请求,并且可以读取响应内容。这样,恶意网站就可以窃取用户的敏感信息。

案例二:Access-Control-Allow-Credentials设置为true

在某些情况下,开发者为了方便,会将Access-Control-Allow-Credentials设置为true,表示允许发送凭据(如Cookies)。然而,这种做法可能会导致安全风险。例如,假设有一个网站https://example.com ,它的API接口允许跨域请求,并且Access-Control-Allow-Credentials设置为true。此时,如果有一个恶意网站https://malicious.com ,它可以利用JavaScript代码向https://example.com 发送跨域请求,并且可以读取响应内容。这样,恶意网站就可以窃取用户的敏感信息。

案例三:Access-Control-Allow-Origin设置为请求头中的Origin字段

在某些情况下,开发者为了方便,会将Access-Control-Allow-Origin设置为请求头中的Origin字段。然而,这种做法可能会导致安全风险。例如,假设有一个网站https://example.com ,它的API接口允许跨域请求,并且Access-Control-Allow-Origin设置为请求头中的Origin字段。此时,如果有一个恶意网站https://malicious.com ,它可以利用JavaScript代码向https://example.com 发送跨域请求,并且可以读取响应内容。这样,恶意网站就可以窃取用户的敏感信息。

七、如何避免CORS配置不当导致的安全漏洞

  1. 不要将Access-Control-Allow-Origin设置为*:除非你确实希望允许所有源的跨域请求,否则不要将Access-Control-Allow-Origin设置为*。相反,你应该明确指定允许哪些源的跨域请求。

  2. 不要将Access-Control-Allow-Credentials设置为true:除非你确实希望允许发送凭据(如Cookies),否则不要将Access-Control-Allow-Credentials设置为true。相反,你应该明确指定是否允许发送凭据。

  3. 不要将Access-Control-Allow-Origin设置为请求头中的Origin字段:除非你确实希望允许所有源的跨域请求,否则不要将Access-Control-Allow-Origin设置为请求头中的Origin字段。相反,你应该明确指定允许哪些源的跨域请求。

  4. 使用Content-Security-Policy头部:为了防止CSRF攻击,服务器应该在响应中设置合适的Content-Security-Policy(CSP)头部。例如,设置为default-src 'self'表示只允许从同一个源加载资源。

  5. 使用X-Content-Type-Options头部:为了防止MIME类型嗅探攻击,服务器应该在响应中设置合适的X-Content-Type-Options头部。例如,设置为nosniff表示禁止浏览器对响应内容进行MIME类型嗅探。

  6. 使用X-Frame-Options头部:为了防止点击劫持攻击,服务器应该在响应中设置合适的X-Frame-Options头部。例如,设置为DENY表示禁止在iframe中加载页面。

  7. 使用Referrer-Policy头部:为了防止Referer信息泄露,服务器应该在响应中设置合适的Referrer-Policy头部。例如,设置为no-referrer表示禁止在请求中发送Referer信息。

  8. 使用Feature-Policy头部:为了防止滥用API,服务器应该在响应中设置合适的Feature-Policy头部。例如,设置为geolocation 'none'表示禁止使用地理位置API。

  9. 使用Expect-CT头部:为了防止中间人攻击,服务器应该在响应中设置合适的Expect-CT头部。例如,设置为max-age=30表示要求客户端在接下来的30秒内验证证书透明度。

  10. 使用Strict-Transport-Security头部:为了防止SSL/TLS降级攻击,服务器应该在响应中设置合适的Strict-Transport-Security头部。例如,设置为max-age=31536000; includeSubDomains; preload表示要求客户端在接下来的一年内只使用HTTPS连接,并且包括所有子域名。

通过以上措施,可以有效地避免CORS配置不当导致的安全漏洞。

八、如何检测CORS配置的安全性?

CORS(跨域资源共享)配置不当可能会导致严重的安全漏洞,因此检测CORS配置的安全性非常重要。以下是一些检测CORS配置安全性的方法和工具。

方法一:手动测试

手动测试是最基本的方法,可以通过以下步骤进行:

  1. 查看响应头:向目标网站发送跨域请求,并查看响应头中是否有CORS相关的头信息,如Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers等。

  2. 测试不同的源:尝试从不同的源向目标网站发送跨域请求,看看目标网站是否允许这些请求。

  3. 测试凭据:尝试发送带有凭据(如Cookies)的跨域请求,看看目标网站是否允许这些请求。

  4. 测试不同的方法:尝试使用不同的HTTP方法(如GET、POST、PUT、DELETE等)向目标网站发送跨域请求,看看目标网站是否允许这些请求。

  5. 测试不同的头部:尝试在请求头中添加不同的头部信息,看看目标网站是否允许这些请求。

方法二:使用自动化工具

自动化工具可以大大提高检测效率,以下是一些常用的CORS配置漏洞检测工具:

  1. CORScanner:CORScanner是一款专为发现网站CORS配置错误漏洞而设计的Python工具。它支持多线程和文件输入,适合进行大规模的网络扫描任务1。

  2. OWASP ZAP:OWASP ZAP是一款开源的Web应用安全扫描工具,它内置了CORS配置漏洞检测功能。使用OWASP ZAP,可以轻松地检测出CORS配置不当导致的安全漏洞。

  3. Burp Suite:Burp Suite是一款功能强大的Web应用安全测试工具,它也可以用于检测CORS配置的安全性。通过使用Burp Suite的拦截功能,可以手动或自动地发送跨域请求,并查看响应头中的CORS相关头信息。

方法三:参考安全最佳实践

参考安全最佳实践可以帮助你更好地理解和配置CORS。以下是一些CORS配置的安全最佳实践:

  1. 明确指定允许的源:不要将Access-Control-Allow-Origin设置为*,而是明确指定允许哪些源的跨域请求。

  2. 谨慎使用Access-Control-Allow-Credentials:只有在确实需要发送凭据(如Cookies)的情况下,才将Access-Control-Allow-Credentials设置为true

  3. 限制允许的方法和头部:只允许必要的HTTP方法和头部信息,不要允许所有方法和头部信息。

  4. 使用预检请求:对于非简单请求,服务器应该先处理预检请求(OPTIONS请求),然后再处理实际请求。

  5. 定期审查和更新配置:定期审查和更新CORS配置,确保其符合最新的安全要求。

通过以上方法和工具,可以有效地检测CORS配置的安全性,从而防止CORS配置不当导致的安全漏洞。

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

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

相关文章

基于Springboot + vue实现的办公用品管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

金融项目实战 01|功能测试分析与设计

前置内容:金融项目准备的内容笔记可直接看如下笔记 只看:一、投资专业术语 和 二、项目简介 两部分文章浏览阅读2.3k次,点赞70次,收藏67次。安享智慧理财金融系统测试项目,测试用例,接口测试,金…

【docker】exec /entrypoint.sh: no such file or directory

dockerfile生成的image 报错内容: exec /entrypoint.sh: no such file or directory查看文件正常在此路径,但是就是报错没找到。 可能是因为sh文件的换行符使用了win的。

python-42-使用selenium-wire爬取微信公众号下的所有文章列表

文章目录 1 seleniumwire1.1 selenium-wire简介1.2 获取请求和响应信息2 操作2.1 自动获取token和cookie和agent2.3 获取所有清单3 异常解决3.1 请求url失败的问题3.2 访问链接不安全的问题4 参考附录1 seleniumwire Selenium WebDriver本身并不直接提供获取HTTP请求头(header…

Bytebase 3.0.1 - 可配置在 SQL 编辑器执行 DDL/DML

🚀 新功能 新增环境策略,允许在 SQL 编辑器内直接执行 DDL/DML 语句。 支持为 BigQuery 数据脱敏。 在项目下新增数据访问控制及脱敏管理页面。 在数据库页面,支持回滚到变更历史的某个版本。 🔔 兼容性变更 禁止工单创建…

C++类的引入

C中类的前身 1> 面向对象三大特征:封装、继承、多态 2> 封装:将能够实现某一事物的所有万事万物都封装到一起,包括成员属性(成员变量),行为(功能函数)都封装在一起&#xff…

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结: 农作物幼苗与杂草检测系统:基于YOLOv8深度学习框架,通过2822张图片训练了一个目标检测模型&#xff…

图像处理 | 图像二值化

在图像处理领域,图像二值化是一个重要的操作,它将彩色或灰度图像转换为只有两种颜色(通常是黑白)的图像。二值化广泛应用于文字识别、图像分割、边缘检测等领域,尤其在处理简洁和高对比度的图像时非常有效。本文将深入…

概率论与数理统计总复习

复习课本:中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布(两点分布) 7.二项分布 8.帕斯卡分布(负二项分布&am…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言: 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream,许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下,龙蜥操作系统(OpenAnolis)作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

计算机网络期末复习(知识点)

概念题 在实际复习之前,可以看一下这个视频将网络知识串一下,以便更好地复习:【你管这破玩意叫网络?】 网络规模的分类 PAN(个人区域网络):用于个人设备间的连接,如手机与蓝牙耳机…

IDEA Maven构建时报错:无效的目标发行版17

报错分析 报错原因:Maven 构建时,Java 版本配置不匹配 我安装的JDK版本是1.8,但由于种种原因,Maven构建时指定了 Java 17 作为目标发行版,从而导致错误 解决方案 首先,java -version,查看环…

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本:关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时,部分文档已经修改,而大部分没有修改,为了减少在众多已打开文档中来回跳转的不便,可以将没有修改的文档全部关闭,但目前提供的快速关闭窗…

Knowledge Editing through Chain-of-Thought

题目 通过思路链进行知识编辑 论文地址:https://arxiv.org/abs/2412.17727 摘要 大型语言模型 (LLM) 在广泛的自然语言处理 (NLP) 任务中表现出卓越的能力。然而,由于频繁重新训练的成本很高,让这些模型与不断发展的世界知识保持同步仍然是一…

运行.Net 7 Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录,双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…

spark——RDD算子集合

目录 算子转换算子示例mapflatMapReduceByKeyfilterdistinctglomgroupBygroupByKeySortBysortByKeyunion交集intersection和差集subtractjoinpartitionBymapPartitionsample 行动算子示例ForeachPartitionForeachSaveAsTextFileCountByKeyReducefoldfirst、take、counttop、tak…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node,请确保已具备较新的 node 环境(>16.20.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

Qt C++读写NFC标签NDEF网址URI

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …

Js的回调函数

一、什么是回调函数&#xff08;Callback&#xff09;&#xff1f; 回调函数&#xff08;Callback Function&#xff09;是指一个函数被作为参数传递给另一个函数&#xff0c;并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中&#xff0…

OSPF - 1类LSA(Router-LSA)

前篇博客有对常用LSA的总结 1类LSA是OSPF计算最原始的材料&#xff0c;他会泛洪发给所有的路由器 LSA是包含在LSU中的&#xff0c;一条LSU能够携带多条LSA options位所有LSA都会有&#xff0c;用于标记起源于什么类型的区域&#xff0c;具体查看文章【邻居建立】 flags位是一…