常见攻击方式
- XSS: Cross-Site Scripting 跨站脚本攻击
- CSRF: Cross-Site Request Forgery 跨站伪造请求
- Injection: 注入, 常见的如SQL注入
- Dos: Denial of Service 拒绝服务攻击
- 中间人攻击: 各大山寨浏览器
XSS
浏览器直接渲染用户提交的数据, 不进行任何处理
可能发生在前端开发的任何位置
防御策略:
- 使用主流框架, 大部分默认防御XSS
- google-closure-library
- 不要相信用户提交的任何数据
- 尽量减少自定义内容, 或在渲染自定义内容时进行处理
CSRF
在用户不知情的情况下, 利用用户信息对指定接口进行请求, 完成伪造攻击
并非一定要在脚本运行中进行, 还可以利用用户手动点击a
标签和img
标签自动加载发送get
请求的方式
防御策略:
- 同源策略, 只允许同源脚本执行(GET和HEAD请求在头部中不会加入Origin, 需要进行特殊处理)
- 利用token并与用户信息绑定, 严格控制权限, 例如不允许用户A通过调用接口(如传入用户B的id)请求到用户B的数据
- 利用X-Frame-Options, 禁止iframe透穿执行同源请求
- 操作进行读写分离, GET和POST分离
- Same Site Cookie, 禁止Cookie全局携带
- 利用中间件统一处理CSRF攻击, 例如网关鉴证鉴权
Injection
使用用户自定义的内容
攻击者通过构造特殊的数据内容并提交, 在前端或服务端执行时篡改实际运行的代码逻辑, 并利用其相对较高的权限进行攻击
常见的如SQL注入/SSRF等
防御策略:
- 尽量减少自定义内容, 或在使用自定义内容时进行处理
- 对用户操作进行权限管控
DoS
通过某种方式构造请求, 频繁向服务器发送, 造成资源被显著消耗, 无法响应正常的用户请求
拓展有基于正则的ReDos和分布式DDos(Distributed Dos)
除了利用HTTP请求三次握手等待的方式以外, 主要是靠海量的请求完成攻击
防御策略:
- 对于前端开发人员, 能做的东西很少
- 对于后端开发人员, 通过网关/熔断/限流/降级等方式维持核心业务稳定
中间人攻击
基于数据明文传输, 中间人隐藏在用户和服务器之间, 实现请求的拦截与转发, 从而达到修改请求内容/伪造返回值/窃取数据等攻击
个人不喜欢国内五花八门的特色浏览器, 我偏执的认为它们可能会进行中间人攻击
防御策略:
- HTTPS一统天下