Spring MVC(2)-跨域、CORS、XSS、 CSFR

news2024/11/26 9:40:11

同源和跨域

同源

什么是同源?请求的“协议+ip(域名)+端口”被称之为“源”。

如果当前页面的url和在当前页面中要访问的url具有相同的源,那么我们称这两个请求“同源”,即它们来自或者去往同一个服务器。

跨域

什么是跨域?如果当前页面的url和请求的url非同源,那么我们就可以称之为跨域,也称之为跨源!或者说,当请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域!非同源和跨域,可以说是一种事务的不同说法!

跨域例子

假设某个页面的URL为http://mall.pplus.com/goods/detail.html,下面是常见的跨域(非同源)请求的类型:

请求的URL是否跨域(非同源)原因
http://mall.pplus.com/other.html只有访问的资源路径不同
http://mall.pplus.com/dir/inner/another.html只有访问的资源路径不同
https://mall.pplus.com/dir/page.html协议不同
http://mall.pplus.com:81/dir/page.html端口不同 ( http:// 默认端口是80)
http://news.pplus.com/dir/page.html主机(域名)不同

同源策略

什么是同源策略?同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,它的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。

如果缺少了同源策略,则浏览器的正常功能可能都会受到影响,很容易受到 XSS、 CSFR 等攻击。

同源策略对跨域(非同源)请求进行了如下限制:

  1. 无法读取非同源网页的 CookieLocalStorageIndexedDB;当然如果两个网页一级域名相同,只是次级域名不同,那么Cookie可以通过设置相同的domainName来实现共享Cookie。
  2. 无法获取非同源网页的 DOM树和Js对象。
  3. 无法获取非同源地址返回的响应,例如通过XMLHttpRequest发送的AJAX请求,以及标签请求的非同源图片资源,获取想要加载的各种网络字体、样式资源。

一级域名:
一级域名就是顶级域名,是同一种域名的两种叫法。
例如pplus.com是顶级域名,也是一级域名。

二级域名:
例如www.pplus.com、mall.pplus.com为二级域名。

同源策略的限制通常是浏览器自己来实现的,当同源策略触发时:

  1. 对于某些浏览器,可能已经正常发送了跨域请求,甚至服务器已经正常处理了请求并且返回了响应,只不过在处理结果时浏览器做了限制,导致无法获取服务器响应的结果!
  2. 对于另一些浏览器以及某些请求方式,它会首先发送一个OPTIONS 预检请求到服务器,以获知服务器是否允许该实际请求,当服务器响应允许此次跨域时,才会发送真正的请求并且正确的处理响应结果。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。

解决跨域

同源策略虽然带来一定的安全性,但是这往往给一些正规的跨域需求带来不便,特别是前后端分离以及服务化的项目,通常不同的服务之间是不同源但,但是它们之间需要互相调用那个。为此,我们可以采取一些方式来绕过同源策略!

解决的方案:

  1. JSONP:一种只需要前端处理的比较简单的方法,但是只能支持get请求,不支持其他类型的请求,因此用的不多。
  2. WebSocket:一种基于HTTP升级而来的协议,它不实行同源策略,只要服务器支持,就可以通过它进行跨域通信。但是WebSocket协议的前后端代码开发和普通HTTP开发有很大区别,通常是被用于即时通信或者要求服务器实时推送数据的项目中,普通web项目为了解决跨域问题而使用WebSocket是得不偿失的!
  3. Nginx:反向代理,也是一种非常有效的解决跨域问题的方法,用的也非常多!
  4. CORS:CORS(Cross-origin resource sharing),通俗地译为跨域资源共享。CORS是一个W3C标准,是一种基于HTTP头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(源,包括域、协议和端口),这样浏览器可以访问加载这些资源。

CORS解决跨域

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。

对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的OPTIONS“预检”请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。

CORS可以看作是跨源AJAX请求的一种根本解决方法。相比JSONP只能发GET请求,CORS允许任何类型的请求。

CORS标准

W3C为CORS标准新增了一组 HTTP 首部字段,以允许服务器在响应头中通过这些字段声明和控制哪些源站通过浏览器有权限访问哪些资源。

另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

header

  1. Access-Control-Allow-Origin:必须的字段,服务器允许的域,允许所有域设置为 *。
  2. Access-Control-Allow-Methods: 服务器允许的请求方法,允许所有方法设置为*。
  3. Access-Control-Allow-Headers:如果请求包括Access-Control-Request-Headers字段,则响应的Access-Control-Allow-Headers字段是必需的。表明服务器允许添加的请求头字段,采用“,”分隔,不限于浏览器在预检请求中传递的字段。
  4. Access-Control-Allow-Credentials:处理方式与简单请求时一致。
  5. Access-Control-Max-Age: 该预检请求响应的有效时间,单位秒时。在有效时间内,浏览器无须为同一请求再次发起预检请求。浏览器自身同样维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效。

Spring MVC 对CORS支持

Spring MVC的HandlerMapping的实现为CORS提供了内置支持。在成功将request映射到handler处理器后,HandlerMaping 实现将检查给定request和handler的 CORS 配置信息,随后,将会直接处理预检请求,同时拦截、验证简单和实际 CORS 请求,并设置所需的(配置的)CORS响应头信息。

为了启用跨源请求,需要具有一些显式声明的 CORS 配置。如果未找到匹配的 CORS 配置,则预检请求将直接被拒绝。

每个HandlerMapping都可以使用基于URL模式的 CorsConfiguration映射单独配置。在大多数情况下,web程序使用 MVC JavaConfig或 XML文件来声明这些映射规则,这会导致单个全局映射传递将给所有 HandlerMaping 实例。

可以将HandlerMapping级别的全局CORS配置与更细粒度的handler级别的CORS配置相结合使用。例如,基于注解的Controller控制器可以使用类或方法级的@CrossOrigin注解来为某些或者某个接口单独定义CORS配置。

@CrossOrigin注解配置
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
	@AliasFor("origins")
	String[] value() default {};
	@AliasFor("value")
	String[] origins() default {};
	/**实际请求中允许的请求标头列表,可能使用“*”来允许所有标头。*/
	String[] allowedHeaders() default {};
	/**用户代理将允许客户端在实际响应中访问的响应标头列表,而不是“简单”标头,即Cache Control、Content Language、Content Type、Expires、Last Modified或Pragma, 暴露的标头列在实际CORS请求的访问控制暴露标头响应标头中。 默认情况下,不会将任何标头列为已公开标头。*/
	String[] exposedHeaders() default {};
	/**支持的HTTP请求方法的列表。 默认情况下,支持的方法与控制器方法映射到的方法相同。*/
	RequestMethod[] methods() default {};
	/**浏览器是否应向带注释的端点发送凭据,如Cookie以及跨域请求。配置的值是在飞行前请求的访问控制允许凭据响应标头上设置的。*/
	String allowCredentials() default "";
	/**缓存持续时间的最大期限(以秒为单位)。*/
	long maxAge() default -1;
}

@CrossOrigin使用:

@RestController
public class AccessControlController {

    @CrossOrigin
    @GetMapping("/accessControl/{id}")
    public User accessControl(@PathVariable Long id, String name) {
        return new User(id, name);
    }
}
全局配置

Controller方法级别配置外,我们更多的可能还希望定义一些全局CORS配置。我们可以在任何处HandlerMapping上单独设置基于URL的CorsConfiguration映射。但是,大多数应用程序使用 MVC JavaConfig或 MVC XML配置来做到这一点。

Java配置:
采用JavaConfig的配置方式非常简单,我们只需要实现WebMvcConfigurer接口并且,实现addCorsMappings回调方法即可,在方法中即可通过参数配置CORS信息!

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    /**
     * 配置跨源请求处理。
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //为指定的路径(模式)启用跨源请求处理。
        //默认情况下,此映射的CORS配置采用CorsConfiguration.applyPermitDefaultValue()的配置
        //即允许所有的origins(源),所有的headers(请求头字段),所有的GET、HEAD和POST方法。
        registry.addMapping("/api/**")
                //设置允许访问该资源的外域源,这里是所有
                .allowedOrigins("*")
                //设置实际请求所允许使用的 HTTP 方法。这里是所有
                .allowedMethods("*")
                //设置实际请求所允许携带的自定义首部字段。这里是所有
                .allowedHeaders("*")
                //设置是否允许请求中携带身份认证信息,比如Cookie。这里是允许
                .allowCredentials(true);
    }

}

XML配置:
若要在Spring的XML配置文件中启用CORS,可以使用mvc:cors标签:

<mvc:cors>
    <!--配置第一个CORS映射处理规则-->
    <mvc:mapping path="/api/**"
                 allow-credentials="true"
                 allowed-headers="*"
                 allowed-methods="*"
                 allowed-origins="*"
                 max-age="1800"/>
    <!--配置第二个CORS映射处理规则-->
    <mvc:mapping path="/service/**"/>
</mvc:cors>

XSS

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。

跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。

CSFR

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

CSRF原理

CSRF 攻击流程:
在这里插入图片描述
其实这个流程很简单:

  1. 假设用户打开了招商银行网上银行网站,并且登录。
  2. 登录成功后,网上银行会返回 Cookie 给前端,浏览器将 Cookie 保存下来。
  3. 用户在没有登出网上银行的情况下,在浏览器里边打开了一个新的选项卡,然后又去访问了一个危险网站。
  4. 这个危险网站上有一个超链接,超链接的地址指向了招商银行网上银行。
  5. 用户点击了这个超链接,由于这个超链接会自动携带上浏览器中保存的 Cookie,所以用户不知不觉中就访问了网上银行,进而可能给自己造成了损失。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用

【自选】 时间地点&#xff1a;2023年7月22日-28日【乌鲁木齐】时间地点&#xff1a;2023年8月12日-18日【福建泉州】 【六天实践教学、提供全部资料】 专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门…

Android有官方的GPS定位API,为什么还要使用百度/高德定位SDK ?

1. 背景 小组在一个Demo项目中&#xff0c;图省事准备使用官方的GPS定位API。 但在我的印象中&#xff0c;官方的定位API是不好用的&#xff0c;一般都是用 高德地图/百度地图 的定位SDK的。 使用官方的定位API获取定位的话&#xff0c;在办公室调试的时候&#xff0c;可能室内…

技术人的管理学-业务管理

主要内容前言制定计划遇到的问题&#xff1f;过程监控遇到的问题&#xff1f;复盘改进遇到的问题&#xff1f;通过PDCA循环解决业务管理问题总结前言 没有人天生就会管理&#xff0c;优秀的管理者都是在知行合一的过程中成长起来的&#xff0c;他们既需要系统的管理知识&#…

数据结构_第十三关(2):快速排序

目录 1.快速排序 原理&#xff1a; 代码如下&#xff08;递归实现&#xff09;&#xff1a; 性能比较 快速排序的特性总结 2.快速排序的优化 1&#xff09;三数取中优化&#xff1a; 2&#xff09;小区间优化&#xff1a; 3. 挖坑法&#xff08;快排的另一种思路&#…

Android Jetpack 从使用到源码深耕【调度任务组件WorkManager 从实践到原理 】(三)

本文,是Jetpack 调度任务组件WorkManager 从实践到原理系列文章的最后一篇,本文我们将对WorkManager 任务的具体执行源码,进行深入的解读。 大家坐好,我们要开始飙车了。 1.任务的具体执行 书接上文,我们既然知道了WorkManager,既然把worker包装为了workrequset,然后…

本地生活为什么会迎来爆发?点赋科技带你了解这些关键点

随着全球疫情的结束和加速数字化转型进程&#xff0c;本地生活市场已经成为了经济发展的亮点。本地生活指的是人们在生活中所需的一切服务和消费&#xff0c;例如美食、购物、医疗保健、教育培训等各种类别。点赋科技就和大家来聊聊其中的一些关键点。 以下是本地生活迎来爆发的…

网络编程套接字( TCP )

目录 1、实现一个TCP网络程序&#xff08;单进程版&#xff09; 1.1、服务端serverTcp.cc文件 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端提供服务 服务端main函数命令行参数 服务端serverTcp.cc总代码 1.2、客户端clientTcp.cc文件 客户端main函数命令行…

【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了

JPA编程专题JPA的介绍JPA的介绍分析JPA注解总览JPA实体型注解EntityTableTableGeneratorTableGenerator 属性TemporalTransientColumnColumn 属性ColumnUniqueConstraint属性状态VersionVersionEmbeddable 和 EmbeddedEmbeddedEmbeddedIdMappedSuperclassEntityListenersEntity…

30分钟Maven 从入门到精通

一、什么是Maven Maven 是一个流行的 Java 项目构建和管理工具,它包含了一个项目对象模型 (POM Project Object Model) 一组标准集合。不仅简化了我们开发过程中对jar包依赖的导入&#xff0c;还对项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等所有…

SpringCloud集成Seata saga模式案例

文章目录一、前言二、Seata saga模式介绍1、示例状态图2、“状态机”介绍1&#xff09;“状态机”属性2&#xff09;“状态”属性3&#xff09;更多状态相关内容三、SpringCloud 集成 seata saga1、saga模式状态机相关信息1&#xff09;状态机配置相关的三个表2&#xff09;状态…

根据 cadence 设计图学习硬件知识 day01了解腾锐 D2000芯片

1. 首先了解 腾锐 D2000 1.介绍 腾锐D2000 芯片 D2000芯片集成8个飞腾自主研发的新一代高性能处理器内核FTC663&#xff0c;采用乱序四发射超标量流水线&#xff0c;兼容64位ARMV8指令集并支持ARM64和ARM32两种执行模式&#xff0c;支持单精度、双精度浮点运算指令和ASIMD处…

ASP.NET动态Web开发技术第6章

第6章ASP.NET状态管理一.预习笔记 1.ASP.NET状态管理概述 状态管理是在一个网页或者不同网页的多个访问请求中&#xff0c;维护网页状态和信息的过程。 状态管理包含视图状态(ViewState)、控件状态(ControlState)、隐藏域状态(HiddenField)、Cookie、查询字符串(QueryString…

24位AD和16位DA超高精度PID串级控制器在张力控制中的应用

摘要&#xff1a;针对目前张力控制器中普遍存在测量控制精度较差和无法实现串级控制这类高级复杂控制的问题&#xff0c;本文介绍了具有超高精度和多功能的新一代张力控制器。这种新一代张力控制器具有24位AD模数转换、16位DA数模转换、双精度浮点运算和0.01%的最小输出百分比&…

【教程】使用R语言绘制词云图

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 最近木易巷在了解R语言&#xff0c;今天给大家分享一下使用R语言绘制出词云图的教程。 什么是R语言 R语言是一个开源的数据分析环境&#xff0c;起初是由数位统计学家建立起来&#xff0c;以更好的进行统计计算和绘图。由于R可…

Android之AppWidget 开发浅析

什么是AppWidget AppWidget 即桌面小部件&#xff0c;也叫桌面控件&#xff0c;就是能直接显示在Android系统桌面上的小程序&#xff0c;先看图&#xff1a; 图中我用黄色箭头指示的即为AppWidget&#xff0c;一些用户使用比较频繁的程序&#xff0c;可以做成AppWidget&#x…

分布式系统概念和设计-分布式对象和远程调用

分布式系统概念和设计 分布式对象和远程调用 能够接收远程方法调用的对象称为远程对象&#xff0c;远程对象实现一个远程接口。 调用者和被调用对象分别存在不同的失败可能性&#xff0c;RMI和本地调用有不同的语义。 中间件 在进程和消息传递等基本构造模块之上提供编程模型的…

PDCA循环模型——如何用同样的时间做更多的事?【No.1 】

PDCA循环模型&#xff0c;又称戴明环&#xff0c;是一个持续改进模型。PDCA循环包括以下内容&#xff1a; Plan阶段&#xff1a;确认目标&#xff0c;制定计划Do阶段&#xff1a;执行措施和计划Check阶段&#xff1a;检查验证&#xff0c;评估效果Action阶段&#xff1a;有效措…

健哥MYSQL私房菜 - 基础与介绍

前言 从今天开始, 健哥就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 ------------------------------前戏已做完&#xff0c;精彩即开始---…

docker-compose详讲

一、概述 docker-compose 项目是docker官方的开源项目&#xff0c; 负责实现对docker容器集群的快速编排&#xff0c;来轻松高效的管理容器&#xff0c;定义运行多个容器。 docker-compose将所管理的容器分为三层&#xff0c; 分别是工程&#xff08;project&#xff09;&#…

C#,码海拾贝(19)——一般实矩阵的QR分解(QR Decomposition)方法之C#源代码,《C#数值计算算法编程》源代码升级改进版

1 实矩阵 实矩阵&#xff0c;指的是矩阵中所有的数都是实数的矩阵。如果一个矩阵中含有除实数以外的数&#xff0c;那么这个矩阵就不是实矩阵。 2 QR&#xff08;正交三角&#xff09;分解法 QR&#xff08;正交三角&#xff09;分解法是求一般矩阵全部特征值的最有效并广泛应…