这是我参与
「第四届青训营」笔记创作活动的第4天
web的安全可靠性是十分重要的,用户或内网信息是否容易被泄露,服务提供商能否正常运转,都与web的安全性有关,接下来从攻击和防御两个方面概况如何保护网站业务的安全。
进攻方
XSS[Cross-Site-Scripting]
在页面中攻击者能够通过脚本的注入实现攻击
漏洞产生原因:
开发者盲目信任用户提交的内容,将用户提交的字符串直接转换成DOM运行在HTML中
XSS攻击的特点
- 难以在UI上被发现
- 窃取用户信息(Cookies\token)
- 绘制假表单诱骗用户输入
XSS攻击类型
- Stored XSS(攻击脚本存放数据库,对所有用户可见,危害性最大)
- Reflected XSS(附件在URL上进行攻击)
- DOM-based XSS(完全运行在浏览器上)
- Mutation-based XSS(按浏览器区别进行攻击)
CSRF[Cross-Site request forgery]
通过跳转链接,让目标接口被请求,进行不正常操作
特点
- 需要用户对攻击不知情
- 利用窃取的用户权限(cookie)
- 构造HTTP请求,窃取或修改用户敏感信息
Injection
在请求中附带参数实现注入攻击,通常为SQL
攻击方式
- CLI(终端)
- OS command
- Server-Side Request Forgery(SSRF)伪造请求
Denial of Services[DoS]
通过构造特定请求不断让服务器进行响应,导致服务器资源消耗过多造成拥挤
类型
- ReDoS(基于正则表达式-贪婪匹配)
- DDoS(Distributed DoS)
中间人攻击[传输层]
在浏览器和服务器之间插入,使浏览器和服务器误认为在相互发送请求,
可能发生原因
- 内容使用明文传输
- 无法察觉信息是否被篡改
- 双方身份无法认证
防守方
针对XSS攻击
-
永远不要相信用户提交的内容
-
不要将用户提交的内容转换为DOM
工具
- 主流框架默认防御XSS
- google-closure-library
- DOMpurify(Node)服务端
注意事项
- 需要动态生成DOM,要对字符串进行转义,
- 对用户上传的文件进行扫描
- 不要让用户能自定义链接跳转,必要时做过滤操作
- 不要让用户自定义样式
针对CSRF
- 对异常来源请求进行限制
- token标识(与具体用户绑定,设定过期时间)
- 必须同源页面才能加载iframe
- 不要将GET与POST混合
- SameSite Cookie
针对Injection
- 针对SQL语句使用prepared statement
- 最小权限原则
- 建立白名单
- 拒绝类如rm命令的输入
- 对URL类型参数进行协议、域名、ip等限制
- 拒绝访问内网
针对DoS
- 检查代码避免贪婪模式的正则表达式,类如接口处理
- 使用工具对正则表达式的代码进行规整,并进行性能测试
- 拒绝用户自定义正则表达式
- 流量治理
- 负载均衡
- API网关
- CDN
- 快速扩容
- 非核心服务降级
防御中间人
使用HTTPS
HTTP Strict-Transport-Security[HSTS] 将HTTP主动升级为HTTPS
PS
Content Security Policy[CSP]
同源:指协议、域名、端口相同
对于HTTP请求一般来说同源可行,跨域不可行
- 哪些域名被认为是安全
- 来自安全源的脚本可以执行,否则报错
- 对eval和inline script直接报错
Feature Policy/Permission Policy
限制页面的使用功能
- camera
- microphone
- autoplay