跨站脚本攻击(XSS)
跨站脚本攻击的主要核心是脚本。说白了就是利用编程漏洞植入js脚本。
根据植入脚本方式的不同,可以简单的分为三类:
- 反射型攻击:通过url的qurey参数,例如一个搜索接口www.xxx.com?search=xxx ,xxx是用户输入的要搜索的内容,后端在返回数据时除了返回相应内容之外还会原封不动的把这个xxx也返回。这样正常搜索没有问题。但是如果xxx是恶意输入的
<script>恶意js代码</script>代码呢,后端返回这个xxx,浏览器就会直接解析这段js代码。 通过植入方式可以看出是一次性的立马反射回来的,因此叫反射型攻击。 - 存储型攻击:通过输入框输入,比如留言板和资料信息的录入。输入内容为恶意js代码,如果不加处理,那么这段代码会存储在数据库当中,在某个特定时刻被调用出来。
- dom型攻击: 主要是插入原生的js改变dom结构。
以上内容百度和博客到处都是,因此这里只是简单介绍一下。我想强调的是,当我进行测试的时候,后端返回给我的
<script>alert(5)</script>,浏览器并没有弹窗,而是以字符串的形式展示在了页面上,这是为什么呢? 最后发现我用的react框架,react已经对基本的xss攻击做了防护(vue也是),其中就包括对<>的转译。因此,在使用前端框架时,开发者一般较少关注xss攻击。
跨域请求伪造(CSRF)
跨站请求伪造的主要核心是伪造。说白了就是利用浏览器自动发送cookie的特性伪造用户身份(后端通过cookie标识用户身份)
攻击举例: 首先有三个身份:一个正规网站A,一个黑客网站B,一个用户C。 用户C登录了正规网站A,网站A会生成合法的sessionID,前端将这个sessionID存入到网站A域名下的cookie中。此时用户c打开了黑客网站B,网站B含有网站A的一个接口,接口隐藏在图片中(只适用于get,post用form表单),比如<img src="网站A的接口"> ,当用户打开网站B的那一时刻,浏览器解析到这个图片时,就会请求网站A接口。恰好此时网站A的cookie还在生效当中,那么即使你在网站B中请求网站A的接口,浏览器也会自动带上网站A的cookie值。(我猜想是因为cookie保存在这个域下,在这个浏览器下不管以何种方式访问这个域,都会携带cookie)。这就完成了身份的伪造。
跨站请求伪造需要用户同时登录正规网站和具有针对性的黑客网站,触发条件更苛刻一些。
预防办法: 1. 优先使用post方法,增加攻击成本
2. 利用http请求头的refer字段,标识请求来源,但refer字段在某些浏览器版本中,可以被修改或者被禁用。
3. 使用 http的SameSite字段,设置为strict。
4. 使用jwt,或者csrf-token。