CORS 跨域请求 - 2

13、CORS跨域请求与安全实践 本文深入探讨了CORS(跨域资源共享)的相关知识及其安全实践,包括设置Access-Control-Allow-Origin头部、处理空源和同源请求中的Origin头部,并明确CORS不是一种安全机制。文章还介绍了如何防范CSRF攻击,包括源验证、shortCircuit选项、CSRF令牌的使用,以及OAuth2授权机制在跨域请求中的应用。最后,总结了CORS安全配置的最佳实践,并展望了未来Web安全的发展方向。 阅读详情

前面一篇,我们通过在服务器端使用了 header 中  'Access-Control-Allow-Origin'  使得跨域请求可以获取数据。那么是不是使用了这个header 就可以使得所有跨域请求都成功呢?否!

下面我们就来讲一下,浏览器跨域请求的一些限制。

首先,我们把之前的html 页面中ajax 请求用fetch 写一下。如下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>MyHtml</title>
</head>
<body>
    <div>hello world</div>
    <div>don't speak</div>
    <script>
        fetch('http://localhost:8887/', {
            method: 'POST',
            headers: {
                'X-Test-Cors': '123'
            }
        })
    </script>
</body>
</html>

然后,我们启动相同的两个服务器。

在浏览器中输入“http://127.0.0.1:8888/” 会发现如下,报错。错误信息中显示request header 中 x-test-cors 在跨域请求中不被允许。

CORS 预请求

跨域的时候

 - 允许的方法:GET, HEAD,POST。其他方法都是默认不允许的,浏览器会有一个预请求的方式去验证。刚刚说的“GET,HEAD,POST” 方法,则是不需要预请求去验证的。

 - 允许的 Content-Type: “text/plain”,"multipart/form-data","application/x-www-form-urlencoded"。其他的Content-Type,也是需要预请求去验证之后才能发送的。

 - 其他限制:

    1. 请求头限制 (https://fetch.spec.whatwg.org/#cors-safelisted-request-header)

    2. XMLHttpRequestUpload 对象均没有注册任何事件监听器 (少用)

    3. 请求中没有使用 ReadableStream 对象 (少用)

我们可以看到,之前网页请求,虽然报错,但在network 中,我们还是可以看到有一个请求,如下。并且是返回了信息的。只不过,浏览器因为一些安全策略的原因,忽略了这个请求的返回并报错了。

那么,浏览器是根据什么判断这个请求是否是允许的。是通过Response Headers。

如果我们要允许我们自定义的Header 在请求中发送,那么我们需要一个新的(Response)Header 告诉浏览器,这个操作是允许的。这个header 就是“Access-Control-Allow-Headers”. 如下,我们在Headers 中添加X-Test-Cors。现在原来的ajax 请求就可以正常使用了。

const http = require('http')
const fs = require('fs')

http.createServer(function (request, response) {
    console.log('request come', request.url)
    
    response.writeHead(200, {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': 'X-Test-Cors'
        // 'Access-Control-Allow-Origin': 'http://127.0.0.1:8888'
    })
    response.end('123456')
}).listen(8887)

console.log('serve listening on 8887')

这个时候,我们来看我们的请求,是有两个请求的,一个方法是OPTION,另一个是POST。

OPTION 请求 就是预请求。浏览器通过OPTION 请求返回的内容,判断后面的请求是否允许。

同理,我们也可以设置CORS允许的方法,如下:

'Access-Control-Allow-Methods': 'POST, DELETE, PUT'

浏览器跨域的限制,是为了服务器端的安全。它限制了不同的域名与一些HTTP 方法,同时也提供了一些Header 配置项,使得我们能够在特定条件下实现跨域。

最后一个关于跨域的Header: (下面的代码,代表了允许以这种方式跨域的请求的最长时间为1000s。也就是1000s 内不需要再发送预请求OPTION来验证了,直接发正式的请求即可)

'Access-Control-Max-Age': '1000'

Done.

test-cors:跨域资源共享(CORS) 测试cors 跨域资源共享(CORS) 编译前 下载安装依赖 进入子项目服务器 make bower install 立即下载

相关推荐

test_cors

test_cors

CORS跨域配置

webconfig中: <system.webServer> <ctpProtocol> </system.webServer> 另外,对于复杂请求(非GET请求),需要在WebApi中添加,无参无返的 Options 方法public void Options(){} //这是预请求 Globa...

qq_44954984的博客 434

无人驾驶--车道线检测实战(附源码)

做完项目后写了个技术小结,供自己回顾也为他人学习提供参考。 另外准备建一个无人驾驶方面的微信交流群,有兴趣的朋友可以加我微信:wxl609278502 请注明: 姓名-单位/学校 项目描述: 使用opencv实时处理车载摄像机采集的道路图像,检测当前的车道,并计算出当前车辆偏离车道中心的距离,计算当前车道的曲率。 项目代码GitHub地址:https://g...

weixin_38746685的博客 6万+

20200128——关于跨域问题

自己创建的实例之后,前端用的Vue,后端用springmvc。前端发送ajax请求后端数据的时候,控制台报错 Access to XMLHttpRequest at 'http://localhost:8080/loign/login' from origin 'http://127.0.0.1:8888' has been blocked by CORS policy: Response to ...

寄蜉蝣于天地,渺沧海之一粟。 448

NX/UG二次开发—CAM—设置程序修剪边界Boundary

最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type

门前大桥下,游过一群鸭,快来看一看,原来是C++ 3732

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1528

“http://127.0.0.1:8888' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header”

axios跨域问题: 会一直报错:“http://127.0.0.1:8848’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header” 因为使用了前后端分离开发,跨域访问了,解决方案:需要配置springboot内置tomcat允许跨域访问。 package com.lzhhuo.shop.config;...

LZHHuo的博客 1万+

提升仿真效率:Synopsys VCS高级编译选项优化技巧(2023最新版)

本文深入探讨了Synopsys VCS 2023版本中的高级编译选项优化技巧,帮助工程师提升仿真效率。通过并行编译、智能代码分析、精准覆盖率采样等策略,结合真实案例展示如何显著缩短仿真周期并优化资源使用,适用于数字芯片验证和大型SoC设计。

weixin_30338481的博客 113

解决The 'Access-Control-Allow-Origin' header has a value 'null' 问题

当发送Ajax请求时,如果你在本地直接打开浏览器运行,肯定会出现此错误。 原因是没有相关运行环境(如Apache) 解决办法: 1. 代码放到服务器上 2.在本地使用开发环境(如wampserver)...

qq_35125915的博客 9041

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码

本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。

weixin_42569329的博客 478

诊断CAPL自动化(3)——封装了接收诊断数据的通用CAPL脚本函数库

DiagGetRespPrimitiveSize (获取诊断响应的单个数据) diagGetPrimitiveData (获取诊断返回的所有数据) DiagGetRespParameter(数值类型) DiagGetRespParameter(字符串类型) DiagGetRespParameter(byte数组)

蚂蚁小兵 6218

调接口报错The 'Access-Control-Allow-Origin' header has a value 'http://www.yemengs.cn'

用axios的时候请求数据出现错误:The ‘Access-Control-Allow-Origin’ header has a value ‘http://www.yemengs.cn’ 说跨域了,解决方法: <meta http-equiv="Access-Control-Allow-Origin" content="*"> ...

Practice! 1170

[xboard-real6410]39 real6410中的BL1和BL2实验及流程分析

文章目录uboot控制uboot 流程uboot加载kernel uboot控制 uboot 流程 uboot加载kernel

鹰之翔 297

Koa2使用CORS完成跨域及解决OPTIONS请求

方法1:设置CORS允许跨域 const Koa = require('koa'); const bodyParser = require('koa-bodyparser'); //post数据处理 const router = require('koa-router')(); //路由模块 const app = new Koa(); app.use(async (ctx, next) =&g...

lihefei_coder的博客 1万+

【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云

本文聚焦爬虫技术在金融科技监管中的应用。开篇阐述金融科技发展带来监管挑战,引出爬虫技术的重要性。接着介绍金融科技监管政策与合规要求,包括政策法规体系、合规细则及政策变化应对。随后探讨爬虫技术选型、数据监测策略、风险指标抓取及案例实操。还阐述基于爬虫数据构建风险预警与防控机制,含模型构建、阈值设定等。最后总结爬虫技术应用成果,展望其与人工智能融合、适应新监管需求及重视数据安全的未来发展趋势。

邓邓子的博客 1063

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Laravel-CORS与OAuth2认证:如何配置支持OAuth2的跨域请求

在当今前后端分离的开发模式下,跨域资源共享(CORS)已成为现代Web应用不可或缺的技术。特别是当你的Laravel应用需要与OAuth2认证服务集成时,正确配置CORS更是确保应用安全稳定运行的关键。本文将为你详细解析如何使用laravel-cors包来配置支持OAuth2认证的跨域请求。 ## 🎯 什么是CORS及其重要性 CORS(Cross-Origin Resource Shari

gitblog_00781的博客 477

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

springboot2.0解决跨域问题(CORS请求)

springboot2.0解决跨域问题(CORS请求)很简单,只需在Controller中添加@CrossOrgin(maxAge=3600),花了好几个小时解决 @CrossOrgin(maxAge=3600) 即可,可以在类上面添加,也可以在方法上添加,类上面添加就是指定该类都可以跨域访问,方法上面加就是该方法可以跨域访问,这个注解也可以指定跨域的地址 下面贴一下我代码跨域输出的信息(...

qq_39187822的博客 840

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

koa2跨域请求cors官方MD笔记

自己平时学习笔记,有不对的地方希望大家指出完善 @koa/cors npm的要求版本 支持build … … … Cross-Origin Resource Sharing(CORS) for koa Installation(安装) $ npm install @koa/cors@2 --save Quick start Enable cors with default opti...

weixin_43945196的博客 785

koa2-cors应答跨域请求实现

var koa = require('koa'); var app = new koa(); var router = require('koa-router')(); // CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 // 下面以koa2-cors为例, const cors = require('ko...

weixin_30888027的博客 153

CORS 请求未能成功_Spring Boot2 系列教程(十四)CORS 解决跨域问题

今天和小伙伴们来聊一聊通过CORS解决跨域问题。同源策略很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略。同源策略是由 Netscape 提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策略。所谓同源是指协议、域名以及端口要相同。同源策略是基于安全方面的考虑提出来的,...

weixin_39679091的博客 253

Koa2框架利用CORS完成跨域ajax请求

实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。 本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明(深层次的配置我也不会)。 CORS将请求分为简单请求和非简单请求,可以简单的认为,简单请求就是没有加上额外请求头部的get和post请求,并且如果是post请求,请求格式不能是app...

weixin_33862514的博客 295

springboot2.x 设置允许跨域请求

springboot2.x 设置允许跨域请求 最近使用axios请求的时候出现了跨域请求被拦截的问题,如下图: 找了一些解决方法,总结一下主要有两种解决方法。 1.配置cors配置类,也可以说是cors过滤器,这是设置全局请求都允许跨域 package com.zzdreamz.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configur

zzdreamz的博客 480

Spring Cloud 2.x之SpringBoot配置Cors解决跨域请求

CORS(Cross-Origin Resource Sharing)"跨域资源共享",是一个W3C标准,它允许浏览器向跨域服务器发送Ajax请求,打破了Ajax只能访问...

天行健,君子以自强不息;地势坤,君子以厚德载物。 682

跨域资源共享 CORS 解析

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求OPTIONS请求,用于校验该次请求是否被服务器允许,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

Karka_的博客 1162

Yii2 Cors 跨域

(跨域资源共享)的检查是由浏览器端实现的。浏览器通过一系列的安全策略来保护用户免受恶意网站的攻击,其中同源策略(Same-Origin Policy)是核心之一。CORS 是对同源策略的一种补充机制,允许浏览器在满足特定条件下跨域请求资源。

zhoubin.wang 690

zuul+security跨域Cors问题解决

zuul+security跨域Cors问题解决纯爱小说 https://www.shupu.org/ 简介 场景 在服务后台都会出现跨域cors问题,不过一般spring解决起来比较方便,在框架+框架的基础上,问题就显得特别明显了,各种冲突,不了解源码的运行原理,解决起来也是有心无力。 这里介绍的是zuul配置了跨域,在前端调用仍然会出现跨域的问题。 一般没有权限的接口加上cors配置就...

爱无止 669
上一篇: CORS 跨域请求 - 1
下一篇: 缓存头 Cache-Control 的含义和使用
purple_lumpy
博客等级 码龄10年 73粉丝 340原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值