本文目录一览:
关于跨域的问题
一、在前端开发过程中,如果准备开发富应用,跨域的问题将会随之而来。
我们先看看什么是跨域呢:
所谓跨域,或者异源,是指主机名(域名)、协议、端口号只要有其一不同,就为不同的域(或源) 。出于保护用户数据的目的,浏览器有一个最基本的策略就是同源策略,只允许页面内的脚本访问当前域的资源(加载脚本、资源等不受此限制)。
二、如果浏览器厂商不对跨域请求进行处理,会给我们带来什么危害呢?
有心人士(病毒制造者)会利用这个漏洞进行如下攻击:
1. CSRF/XSRF 攻击 ,简单的来讲就是在 b.com 页面中请求 a.com 的接口(浏览器会自动带上 用户在 a.com 的 cookie),从而获取用户的在 a.com 的相关信息。
2. XSS 注入攻击 ,类似于 SQL 攻击,提交含有恶意脚本的数据到服务器,从而达到破坏页面或者获取用户的 cookie。
三、我们了解到了什么是跨域,那我们又应该如何解决呢,现在找到了这些比较权威的文章,大家先品读一下:
1. mozilla 官方网站关于跨域的文章(Cross Origin), HTTP访问控制(CORS)
2. mozilla 官方网站关于浏览器同源策略的简要介绍(Same Origin), 浏览器的同源策略
四、读完这些文章,你打算怎么处理跨域问题呢,我先谈谈自己关于跨域的解决方案:
1. 采用 CORS 协议,直接在 Nginx 中设置允许跨域的 header(也可以在后端的应用程序内设置,不过在 Nginx 入口配置的话更加统一),在 location 配置中直接使用指令 add_header( 官方文档链接 ),示例配置如下:
2. 使用 JSONP,也是需要后端配合,利用“浏览器加载脚本、资源时不受同源策略的约束”这个特性,但是这种方式非常受限制,例如只能使用 GET 请求,不能携带自定义 header 等。
3. 其他的一些方法,例如 window.name, document.domain 以及 HTML5 中的特性 window.postMessage 等
五、其他参考链接
1. 浅谈JS跨域问题
2. 跨域资源共享 CORS 详解----阮一峰
六、声明
现在网络上的知识非常复杂,有些是摘自权威书籍的,有些是作者自己理解然后记录下来的,有些是瞎掰的,所以一定要结合情况多多甄别,对于有权威文档的知识点,建议先参考文档。
Spring Security 与 HTTP 安全 header
HTTP 安全header对于网站安全防护来说至关重要。借助安全header,我们可以降低网站遭受攻击的风险。
Spring Security作为Spring家族御用的安全框架,自然考虑到了这方面的需求。它为我们提供了大量预定义好的配置,可减小开发工作量。
下面章节介绍常用的安全header,和Spring Security中的配置方法。
用于控制Request和Response的缓存机制。可以通过如下设置,禁用cache:
禁用cache的方法如下:
用于控制客户浏览器可加载哪些外部资源。相当于一个白名单,从而减少攻击者注入恶意脚本的可能性。
该 header的配置方法较为复杂,可参考: Content Security Policy 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)
主要是以下三种场景会发送Referer字段。
(1)用户点击网页上的链接。
(2)用户发送表单。
(3)网页加载静态资源,比如加载图片、脚本、样式。
可以使用 rel 属性,修改默认的referer行为。
rel属性只能定制单个元素的Referer行为,而且选择比较少,只能发送或不发送。W3C 为此制定了更强大的 Referrer Policy。
Referrer Policy 可以设定8个值。
(1)no-referrer
不发送Referer字段。
(2)no-referrer-when-downgrade
如果从 HTTPS 网址链接到 HTTP 网址,不发送Referer字段,其他情况发送(包括 HTTP 网址链接到 HTTPS 网址)。这是浏览器的默认行为。
(3)same-origin
链接到同源网址(协议+域名+端口 都相同)时发送,否则不发送。注意, 链接到 也属于跨域。
(4)origin
Referer字段一律只发送源信息(协议+域名+端口),不管是否跨域。
(5)strict-origin
如果从 HTTPS 网址链接到 HTTP 网址,不发送Referer字段,其他情况只发送源信息。
(6)origin-when-cross-origin
同源时,发送完整的Referer字段,跨域时发送源信息。
(7)strict-origin-when-cross-origin
同源时,发送完整的Referer字段;跨域时,如果 HTTPS 网址链接到 HTTP 网址,不发送Referer字段,否则发送源信息。
(8)unsafe-url
Referer字段包含源信息、路径和查询字符串,不包含锚点、用户名和密码。
注:以上内容来源于
。侵删。
网站通过这个请求头告诉浏览器,只能通过HTTPS访问该网站,而不是HTTP。
max-age=expire-time
设置在浏览器收到这个请求后的expire-time秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。
includeSubDomains 可选
如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
preload 可选
查看 预加载 HSTS 获得详情。不是标准的一部分。
参考链接:
用来确定Content-Type指定的MIME type可否被修改。有些资源的Content-Type是错的或者未定义,这时某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行,有安全风险。可以使用此header用来防止MIME type嗅探攻击。
禁用MIME type嗅探攻击的方法为:
X-Frame-Options用来告诉浏览器是否允许渲染 frame , iframe , embed 和 object 内的页面。主要用于防止clickjack攻击。
它有如下三个值:
参考链接: X-Frame-Options - HTTP | MDN (mozilla.org)
这个header用于防御XSS攻击。当浏览器检测到疑似XSS攻击的时候,自动阻止页面加载。
该header的配置项如下:
对于常用的HTTP header,Spring Security已经有现成的方法可用。但是对于自定义的header,我们要如何处理呢?
Spring Security提供了 addHeaderWriter 方法,可用于添加任意的 HeaderWriter :