做过前端开发的小伙伴肯定会遇到下面这样报红的 error 经历: 如果没有遇到,那你就还需要多努力努力了,这个错误就是今天SEO禅要说的 CORS(Cross-origin resource sharing)跨域资源共享 ,这是在前端开发中再常见不过的问题,比如我们本地开发,使用的域名地址是 localhost ,或者IP如 192.x.x.x 之类的,如果请求后端API服务器和前端服务器不是同一个,就会有CORS错误,为什么会产生这种错误呢? CORS问题的起因 其实CORS并不算是一种问题,它是一种浏览器保护机制,在很久很久以前,各大浏览器厂商都在抢着实现JS的功能,很少去考虑安全性问题,直到JS这个孩子闹出了很多问题,各浏览器厂商爸爸终于做下来协商如何管一管这调皮的孩子,最后他们一致决定,把这孩子关起来,不让它出去玩,也不让它带其他捣蛋鬼回来。 说白了,这是浏览器对外部资源的一种限制手段,是为了保证用户的安全,最初各大浏览器厂商规定网站只能请求自身同源同域名的资源,但是这种方式不利于网站的发展,因为很多资源是分布在其他服务器上的,所以后来浏览器通过CORS机制,限制性的访问外部资源服务器。 CORS请求方式 下面来说说CORS实现的原理,首先我们明确一点,会触发CORS保护机制,一定是在请求外部资源的情况下,在这种情况下,又分为两种请求,一种是 简单请求 ,一种是 预检请求 。 简单请求需要满足两大条件,包括一下: 使用下列方法之一: GET HEAD POST Http头部只有下列集合: Accept Accept-Language Content-Language Content-Type Content-type的值仅限于: text/plain multipart/form-data application/x-www-form-urlencoded 当然还有一些不常用的情况,可以参考MDN关于 。 比如说有如下请求头: 如果是简单请求,浏览器就会在请求头中加入 origin 字段,host服务器对比这个字段在不在自己的请求允许名单中,如果不在,就会返回正常的http响应,浏览器发现这个CORS请求没有包括 Access-Control-Allow-Origin 字段,就知道这次跨域请求有问题,就会显示文章开头那张图片所示的报错信息。 如果简单请求成功,服务器的返回头一般会有下面的字段: 这个字段的意思是运行任何来源访问本服务器资源,当然正常情况我们需要对这个来源作出限制,只有可信赖的来源才能请求服务器资源,这里不去深究,具体如何操作看MDN文档手册。 如果发起的跨域请求不满足简单请求,就会被浏览器认为是预检请求,预检请求浏览器首先会发送 options 预检请求头,类似下面格式: 我们可以看到这个预检请求比上面说到的简单请求多了两个字段: 这两个字段主要是询问资源服务器是否支持相应的请求方法,和请求头参数,如果服务器支持预检的请求,一般会返回下面两个字段: 一个是允许的请求方法,一个是允许的头部字段,如果预检请求没有通过,和简单请求一样,都是返回正常的Http响应,但是头部字段中不会有这些CORS字段信息,浏览器就知道预检请求没有通过,一旦预检请求通过之后,后面的请求就和简单请求一样了。 在跨域请求中,我们有时候会携带上验证信息,如果说 cookies ,这时候CORS机制就有特殊的要求: 如果是简单请求,首先在发起Ajax请求是,需要设置 withCredentials 为 true ,之后服务器端返回信息,必须携带 Access-Control-Allow-Credentials: true 头部字段,如果没有这个字段,浏览器不会把响应内容展示给请求者。 如果是预检请求,在预检请求Options的时候不需要带上cookies等凭证,但是预检的响应头中,服务器必须设置 Access-Control-Allow-Credentials: true 字段,之后的请求和简单请求一致。 在服务器响应凭证请求时,有下面几个约束: 服务器不能将 Access-Control-Allow-Origin 的值设为通配符“ * ”,而应将其设置为特定的域,如: Access-Control-Allow-Origin: https://example.com 。 服务器不能将 Access-Control-Allow-Headers 的值设为通配符“ * ”,而应将其设置为首部名称的列表,如: Access-Control-Allow-Headers: X-PINGOTHER, Content-Type 服务器不能将 Access-Control-Allow-Methods 的值设为通配符“ * ”,而应将其设置为特定请求方法名称的列表,如: Access-Control-Allow-Methods: POST, GET 也就是说要指定明确的允许请求列表,和请求方法。 关于CORS的问题暂时SEO禅就说这么多,以前我们解决跨域资源请求时候还会用到JSONP,现在基本很少使用,使用CORS机制的比较多一些,有什么问题可以留言评论,要是有什么说的不对的地方欢迎点出。 你可能想看: 2021网站服务器安全优化-SQL注入攻击 为什么SEO禅的博客不像其他SEO同行,SEO公司一样都是说SEO的内容呢?因为想做好SEO优化可以很简单,也可以不简单,很简单的方法大家应该都知道,那就是用一些手段让排名暂时靠前,不简单是因为,真要... 2021网站服务器安全优化-跨站请求伪造攻击CSRF SEO禅在上一篇文章跨站脚本攻击XSS中介绍了客户端最常见的安全攻击漏洞,今天再来介绍一个同样很热门的一种攻击方法CSRF跨站请求伪造攻击,CSRF英文全称:cross-site request fo... 2021网站服务器安全优化-跨站脚本攻击XSS 前一段时间SEO禅介绍了WebPageTest这个网站测速SEO工具,其中第一项分数就是安全测试,今天SEO禅就来分享一下关于如何防止网站被跨站脚本XSS攻击,首先还是老套路,做这件事之前我们要知道这... 怎样迁移网站服务器和域名? 想要迁移网站,内容不变,但域名不同,服务器也不同,该如何整站迁移又不影响排名和SEO? 更改搜索引擎蜘蛛的抓取速度,避免占用太多服务器资源 正常情况下,我们做Google SEO当然是希望搜索引擎蜘蛛可以天天在你网站里面爬行抓取内容,但是如果你的服务器有资源限制,那么可能Google蜘蛛太频繁的抓取你网站会导致服务器资源耗尽,或者网站打开 同一个服务器多个网站(虚拟主机)会影响SEO吗? 一个服务器下面有多个网站,且这些网站做的关键词基本都差不多,但架构内容都不一样,他们之间会相互影响SEO排名吗?搜索引擎(百度)会如何看待这些网站? 同一个服务器有多个网站对SEO有影响吗? 相信很多站长在开始建站的时候都有一个疑虑,那就是一个服务器上面放多个网站会不会影响到SEO优化效果?SEO禅帮企业做SEO优化的时候,基本都是推荐一个IP,一个服务器放一个网站,这样在优化网站排名的时... 如何与缺乏安全感的伴侣建立“安全的关系”? 情感安全是一段健康关系的基石,它有助于增进亲密关系,增强情感幸福,甚至能够促进我们的身体健康。 链接诱饵实例:资源大列表 这种诱饵最最常见的标题模式就是,“十大最xx的xxx”这种列表或排行榜,而且屡用不爽。 利用谷歌Search Console分析SEO优化方法 谷歌Google Search Console对于做谷歌SEO优化的人来说应该是再熟悉不过,自从新版上线之后,增加了一个非常有用的功能Crawl Stats中文解释为“爬虫统计”,今天SEO禅就跟大家...
网站服务器安全优化-CORS跨域资源共享
2024-07-05 | 浏览: 23
做过前端开发的小伙伴肯定会遇到下面这样报红的
error
经历:如果没有遇到,那你就还需要多努力努力了,这个错误就是今天SEO禅要说的 CORS(Cross-origin resource sharing)跨域资源共享 ,这是在前端开发中再常见不过的问题,比如我们本地开发,使用的域名地址是
CORS问题的起因localhost
,或者IP如192.x.x.x
之类的,如果请求后端API服务器和前端服务器不是同一个,就会有CORS错误,为什么会产生这种错误呢?其实CORS并不算是一种问题,它是一种浏览器保护机制,在很久很久以前,各大浏览器厂商都在抢着实现JS的功能,很少去考虑安全性问题,直到JS这个孩子闹出了很多问题,各浏览器厂商爸爸终于做下来协商如何管一管这调皮的孩子,最后他们一致决定,把这孩子关起来,不让它出去玩,也不让它带其他捣蛋鬼回来。
说白了,这是浏览器对外部资源的一种限制手段,是为了保证用户的安全,最初各大浏览器厂商规定网站只能请求自身同源同域名的资源,但是这种方式不利于网站的发展,因为很多资源是分布在其他服务器上的,所以后来浏览器通过CORS机制,限制性的访问外部资源服务器。
CORS请求方式下面来说说CORS实现的原理,首先我们明确一点,会触发CORS保护机制,一定是在请求外部资源的情况下,在这种情况下,又分为两种请求,一种是 简单请求 ,一种是 预检请求 。
简单请求需要满足两大条件,包括一下:
GET
HEAD
POST
Accept
Accept-Language
Content-Language
Content-Type
Content-type的值仅限于:
text/plain
multipart/form-data
application/x-www-form-urlencoded
当然还有一些不常用的情况,可以参考MDN关于 。
比如说有如下请求头:
如果是简单请求,浏览器就会在请求头中加入
origin
字段,host服务器对比这个字段在不在自己的请求允许名单中,如果不在,就会返回正常的http响应,浏览器发现这个CORS请求没有包括Access-Control-Allow-Origin
字段,就知道这次跨域请求有问题,就会显示文章开头那张图片所示的报错信息。如果简单请求成功,服务器的返回头一般会有下面的字段:
这个字段的意思是运行任何来源访问本服务器资源,当然正常情况我们需要对这个来源作出限制,只有可信赖的来源才能请求服务器资源,这里不去深究,具体如何操作看MDN文档手册。
如果发起的跨域请求不满足简单请求,就会被浏览器认为是预检请求,预检请求浏览器首先会发送
options
预检请求头,类似下面格式:我们可以看到这个预检请求比上面说到的简单请求多了两个字段:
这两个字段主要是询问资源服务器是否支持相应的请求方法,和请求头参数,如果服务器支持预检的请求,一般会返回下面两个字段:
一个是允许的请求方法,一个是允许的头部字段,如果预检请求没有通过,和简单请求一样,都是返回正常的Http响应,但是头部字段中不会有这些CORS字段信息,浏览器就知道预检请求没有通过,一旦预检请求通过之后,后面的请求就和简单请求一样了。
在跨域请求中,我们有时候会携带上验证信息,如果说
cookies
,这时候CORS机制就有特殊的要求:如果是简单请求,首先在发起Ajax请求是,需要设置
withCredentials
为true
,之后服务器端返回信息,必须携带Access-Control-Allow-Credentials: true
头部字段,如果没有这个字段,浏览器不会把响应内容展示给请求者。如果是预检请求,在预检请求Options的时候不需要带上cookies等凭证,但是预检的响应头中,服务器必须设置
Access-Control-Allow-Credentials: true
字段,之后的请求和简单请求一致。在服务器响应凭证请求时,有下面几个约束:
Access-Control-Allow-Origin
的值设为通配符“*
”,而应将其设置为特定的域,如:Access-Control-Allow-Origin: https://example.com
。Access-Control-Allow-Headers
的值设为通配符“*
”,而应将其设置为首部名称的列表,如:Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Allow-Methods
的值设为通配符“*
”,而应将其设置为特定请求方法名称的列表,如:Access-Control-Allow-Methods: POST, GET
也就是说要指定明确的允许请求列表,和请求方法。
关于CORS的问题暂时SEO禅就说这么多,以前我们解决跨域资源请求时候还会用到JSONP,现在基本很少使用,使用CORS机制的比较多一些,有什么问题可以留言评论,要是有什么说的不对的地方欢迎点出。
2021网站服务器安全优化-SQL注入攻击
为什么SEO禅的博客不像其他SEO同行,SEO公司一样都是说SEO的内容呢?因为想做好SEO优化可以很简单,也可以不简单,很简单的方法大家应该都知道,那就是用一些手段让排名暂时靠前,不简单是因为,真要...
2021网站服务器安全优化-跨站请求伪造攻击CSRF
SEO禅在上一篇文章跨站脚本攻击XSS中介绍了客户端最常见的安全攻击漏洞,今天再来介绍一个同样很热门的一种攻击方法CSRF跨站请求伪造攻击,CSRF英文全称:cross-site request fo...
2021网站服务器安全优化-跨站脚本攻击XSS
前一段时间SEO禅介绍了WebPageTest这个网站测速SEO工具,其中第一项分数就是安全测试,今天SEO禅就来分享一下关于如何防止网站被跨站脚本XSS攻击,首先还是老套路,做这件事之前我们要知道这...
怎样迁移网站服务器和域名?
想要迁移网站,内容不变,但域名不同,服务器也不同,该如何整站迁移又不影响排名和SEO?
更改搜索引擎蜘蛛的抓取速度,避免占用太多服务器资源
正常情况下,我们做Google SEO当然是希望搜索引擎蜘蛛可以天天在你网站里面爬行抓取内容,但是如果你的服务器有资源限制,那么可能Google蜘蛛太频繁的抓取你网站会导致服务器资源耗尽,或者网站打开
同一个服务器多个网站(虚拟主机)会影响SEO吗?
一个服务器下面有多个网站,且这些网站做的关键词基本都差不多,但架构内容都不一样,他们之间会相互影响SEO排名吗?搜索引擎(百度)会如何看待这些网站?
同一个服务器有多个网站对SEO有影响吗?
相信很多站长在开始建站的时候都有一个疑虑,那就是一个服务器上面放多个网站会不会影响到SEO优化效果?SEO禅帮企业做SEO优化的时候,基本都是推荐一个IP,一个服务器放一个网站,这样在优化网站排名的时...
如何与缺乏安全感的伴侣建立“安全的关系”?
情感安全是一段健康关系的基石,它有助于增进亲密关系,增强情感幸福,甚至能够促进我们的身体健康。
链接诱饵实例:资源大列表
这种诱饵最最常见的标题模式就是,“十大最xx的xxx”这种列表或排行榜,而且屡用不爽。
利用谷歌Search Console分析SEO优化方法
谷歌Google Search Console对于做谷歌SEO优化的人来说应该是再熟悉不过,自从新版上线之后,增加了一个非常有用的功能Crawl Stats中文解释为“爬虫统计”,今天SEO禅就跟大家...