这是我参与「第五届青训营」笔记创作活动的第二十一天
Web 开发安全
-
安全问题很常见
-
看待Web安全的两个角度
Web 开发安全 - 攻击篇
Cross-Site Scripting (XSS) 跨站脚本攻击
通过某种方式将恶意脚本注入到网站中,当用户访问网站时,则会被恶意攻击,可能造成的后果有,用户隐私泄露,用户电脑被当成矿机来挖矿等等
容易遭受XSS的原因:
- 盲目信任用户的提交内容
- 直接把内容转化为Dom
可以看到这里无论是向数据库写数据还是从数据库读数据,都没做过滤,这样攻击者就可以很方便地进行XSS攻击了
根据XSS攻击的特点,可以被分为以下几类:
-
存储型的XSS攻击,恶意脚本会被存在数据库中,这种XSS的危害是最大的,因为可以攻击所有用户
-
反射型XSS攻击,不涉及数据库,是从URL上攻击
-
基于Dom的XSS攻击 完全不需要服务器参与,全在浏览器端发生
- 反射型XSS攻击 和 基于Dom的XSS攻击很相似,最大的不同在注入恶意脚本的地方不同
- 基于Mutation的XSS攻击 利用浏览器特性进行攻击 也是最难防御的一种
Cross-site request forgery(CSRF) 跨站伪造请求
- 最常见的是构造Get请求,当然构造其它类型的请求也都是可以的,比如POST等等
SQL Injection (SQL 注入攻击)
其它注入的类型
Denial of Service (Dos)
-
ReDos
-
Distributed Dos (DDos)
这种攻击不会限制在域名的访问,而是直接访问IP,不会区分接口,主要的目的是消耗带宽
常见的洪水攻击
基于传输层的攻击方式
Web 开发安全 - 防御篇
防御XSS
如果用户需要 要求 必须动态生成DOM,那我们需要注意以下几个点:
-
如果要把String 直接生成 Dom,比如说调用了一个DomParser的API,我们就一定要注意对String进行转译
-
上传SVG,如果允许用户上传SVG文件,那我们也一定要对SVG文件进行扫描,因为按照规范,svg中可以插入Script标签,也就是说svg图片被加载,script标签被执行,也就完成了一次XSS攻击
-
Blob动态生成script
-
尽量不要做让用户自定义跳转的行为,如果做也一定要做好过滤,因为如果允许它自定义跳转链接的话,实际上是可以传输JS代码的
-
自定义样式,一定要对这种能设置url,比如说背景图片,字体文件的地方格外留意
Same-origin Policy(SoP) 同源策略
同源策略要求 协议 域名 端口都对的上, http://example.com 和 https://example.com是协议不同,https://example.com和https://sub.exmaple.com是域名不同
对Http请求,一般来说同源是可以的,非同源|跨域往往是不可以的(或者可以说更多是看请求的类型和服务器的配置)
Content Security Policy(CSP) 内容安全策略
- 服务器的响应头部
- 例子中的第一个是 -> 这个页面中的任何Script标签,我们只允许同源的才能执行,非同源的则不允许执行
- 例子中的第二个是除了同源 还额外允许了
https://domain.com
- 服务器meta也可以实现类似的功能,和服务器的类似,就不详细介绍了
- 从域名的角度限制了哪些脚本可以运行,使很多恶意脚本就难以攻击了
防御CSRF
有的时候,Referer这个字段会被更广泛地利用
具体原理,button下包着一个iframe, iframe里是原网站,在样式这里组织了button的行为,所以点击button的行为,会交给iframe来发起,也就变成同源了
简单例子⬇️:
防御方法:通过设置一个HTTP响应头部就可以解决(在服务器端设置): X-Frame-Options: DENY/SAMEORIGIN,DENY: 当前这个页面不能被作为Iframe进行加载;SAMEORIGIN: 只有在同源的情况下,这个页面才能被作为Iframe进行加载。通过这种方法就可以规避攻击者使用Iframe进行CSRF的攻击