问题原因-浏览器同源策略
同源:
- 协议相同
- 域名相同
- 端口相同
浏览器是从两个方面去做这个同源策略的
- 针对接口的请求
- 针对Dom的查询
没有同源策略限制的接口请求
我们经常用cookie来记住用户的登录信息,如果你请求了接口进行登录,服务端验证通过后会在响应头加入Set-Cookie字段,然后下次再发请求的时候,浏览器会自动将cookie附加在HTTP请求的头字段Cookie中,服务端就能知道这个用户已经登录过了。由于没有同源策略的限制,它向淘宝发了个请求!然后淘宝就会在响应头加入Set-Cookie字段,这样下次再发请求的时候,浏览器会自动将cookie附加在HTTP请求的头字段中发给钓鱼网站,这样一来,这个不法网站就相当于登录了你的账号。也就是CSRF攻击
题外话,即使有了同源策略限制,但cookie是明文的,还不是一样能拿下来。其实服务端可以设置httpOnly,使得前端无法操作cookie,用来防止XSS攻击。
没有同源策略限制的Dom查询
有一个钓鱼网站直接引入了淘宝登录的页面,同时监听你账号密码输入框的事件,这样就直接拿到了你的密码。
<iframe name="yinhang" src="www.yinhang.com"></iframe>
解决方案
现在访问某个系统的所有请求一般都要经过网关,所以在网关微服务配置CORS拦截器就好了。
这种处理方式前端代码不用做任何变化,是最常用的方式
@Configuration
public class GulimallCorsConfiguration {
@Bean // 添加过滤器
public CorsWebFilter corsWebFilter() {
// 基于url跨域,选择reactive包下的
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 跨域配置信息
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 允许跨域的头
corsConfiguration.addAllowedHeader("*");
// 允许跨域的请求方式
corsConfiguration.addAllowedMethod("*");
// 允许跨域的请求来源
corsConfiguration.addAllowedOrigin("*");
// 是否允许携带cookie跨域
corsConfiguration.setAllowCredentials(true);
// 任意url都要进行跨域配置
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsWebFilter(source);
}
}
XSS攻击
简介
XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。
示例
假如有下面一个textbox
<input type="text" name="address1" value="value1from">
value1from是来自用户的输入,如果用户不是输入value1from,而是输入 " onfocus="alert(document.cookie)
那么就会变成
<input type="text" name="address1" value="" onfocus="alert(document.cookie)">
事件被触发的时候嵌入的JavaScript代码将会被执行
攻击的威力,取决于用户输入了什么样的脚本
解决
- 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
- 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
- 对数据进行Html Encode 处理。将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。
- 过滤或移除特殊的Html标签, 例如: