这是我参与「第四届青训营 」笔记创作活动的第6天
Web开发的安全之旅
在前端web开发过程中,安全也一直使我们老生常谈的话题了,总之一句话就是:
永远不要相信用户输入的任何东西,只能相信自己手下的键盘
今天我们以两个方面来讲解web安全
- 攻击方
- 防御方
作为一名开发者 - 防御
XSS防御
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成DOM
防御措施
-
前端
- 主流框架默认防御XSS
- goole-closure-librery
-
服务端(node)
- DOMPurify
CSRF防御
-
阻止不明外域的访问
- 同源检测
- Samesite Cookie
-
提交时要求附加本域才能获取的信息
- CSRF Token
- 双重Cookie验证
Dos防御
基于正则的Dos防御
- Code Review( × /(ab*)+/)
- 代码扫描+正则性能测试
- × 用户提供的正则
本地Dos防御
- 不是非黑即白,有些case只有在请求量大到一定程度后才会体现
- 分析代码的性能瓶颈
- 限流
作为一名hacker - 攻击
XSS攻击 (Cross-Site Scripting)
概念
攻击者在网页中嵌入客户端脚本(例如Javascript),当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。
主要利用了:不对用户的输入进行校验盲目信任用户提交的内容后,导致注入伪代码,转换为DOM元素
特点
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
储存式XSS攻击
攻击者直接提交恶意脚本,并且不进行任何验证
- 恶意脚本被储存在数据库中
- 访问页面->读数据---被攻击
- 危害最大,对全部用户可见
反射式XSS攻击
- 不涉及数据库
- 从URL上攻击
通过params传参将恶意脚本注入
基于DOM的XSS攻击
- 不需要服务器参与
- 恶意攻击的发起 + 执行 ,全部在浏览器完成
Mutation-based XSS
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
CSRF攻击 (Cross-site request forgery)
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造制定的HTTP请求,窃取或修改用户敏感信息
概念
攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
分类
- GET类型的CSRF
- POST类型的CSRF
- 链接类型的CSRF
总的来说就是诱导用户做出一些事情,从而实施攻击
DOS
通过某种方式(构造特点请求),导致服务器资源被显著消耗,来不及响应更多的请求,导致请求挤压,进而出现雪崩效应
特点
- 直接访问IP
- 任意API
- 消耗大量宽带(耗尽)
小demo
总结
总之不能相信用户输入的任何东西,只能相信自己,甚至自己的后端有时也不可信