前端安全开发总结草稿
# 1. 有哪些风险
# 1.1 按端分类
# 1.1.1 Web 安全
- CSRF
双重 token 校验:发送鉴权请求->注入 Cookie + 鉴权响应头->真实请求发送(携带 token 和 Cookie)
- XSS
使用 xss npm 包,基于白名单的策略防护
- 钓鱼攻击
- 任意 URL 重定向: https://www.cnblogs.com/NoId/p/16631462.html 通过配置白名单进行跳转拦截
- 外链 opener 修改原页面:禁用
- iframe 风险
- 嵌套第三方页面:开启 sandbox 进行防护
- 被钓鱼网站嵌套:配置 x-frame-options
- 跨域风险
- CORS 需要配置白名单
- MIME 嗅探
客户端认为文件 MIME 配置不对,通过查看资源进行嗅探,进而可能造成文件执行。比如把一段 JS 脚本伪装成 IMG 让用户加载。配置 X-Content-Type-Options 关闭 MIME 嗅探
- CSS Injection
https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf 、用 CSS 來偷資料 (opens new window)
- 信息泄露
- 内网信息泄露
process.env
对象暴露- 敏感信息传输加密:下发秘钥加密敏感参数,服务端解密
- SourceMap 上传外网
- 敏感代码加固:对加解密等核心 JS 代码转化为二进制字节码,运行在虚拟机
- 添加水印:明水印、暗水印
- 数据脱敏:比如身份证、手机号等需要用
*
字符替换 - Cookie 安全策略:根据使用场景合理配置 Cookie
- 其他
- HTML 文件使用 UTF-8 编码:避免绕过一些防御措施
# 1.1.2 传输层安全
- HTTP 劫持
DNS 污染,开启 HTTPS 解决
- CDN 回源劫持
CDN 投毒,见 https://ph4ntonn.github.io/Web-Cache-Poisoning ;使用 SRI (opens new window)(子资源完整性)解决,如 integrity 属性
- HTTPS 剥离攻击
黑客利用 SSL Stripping (opens new window) 攻击(未带协议头浏览器默认使用 HTTP 访问)让 HTTPS 降级为 HTTP ,可以使用 HSTS 方案防护
- TLS 证书无效
证书过期将重新出现 HTTP 劫持问题;注意 BGP 劫持无法预防,只能尽早发现。可以利用无头浏览器访问并获取证书剩余有效时间
- 证书伪造
CA 签发证书相对随意;浏览器引入证书透明度策略,通过 Expect-CT HTTP Header 开启
- 私有网络访问
浏览器安全防护策略。页面请求了比当前页面更私有的请求,浏览器会进行拦截,可通过
Access-Control-Allow-Private-Network
响应头豁免
# 1.1.3 跨端安全
- JSB 鉴权漏洞
任意页面可直接调用 JSB 方法;解决方案:根据页面来源做鉴权管控,并对 JSB 进行分级。案例:闲鱼支付运费诈骗
- Electron 安全设置
不安全的启动参数和 browserWindow 配置,详见 https://yuzhigang5460.gitbook.io/electron/tutorial/security
# 1.1.4 服务端安全
- SSRF 请求伪造
攻击外网无法访问的内网系统,可通过白名单解决
- 注入攻击
- SQL 注入
- 动态脚本执行注入:服务端动态执行代码,可通过 Sandbox 防护
- 动态命令执行注入:动态执行 shell 命令
- 任意目录遍历注入:web安全目录遍历漏洞学习及绕过 (opens new window)
- 任意文件上传
https://www.freebuf.com/vuls/279171.html
- ReDOS(正则表达式拒绝服务攻击)
构造特殊字符让服务器的正则校验变慢,消耗系统资源 ,http://mykings.me/2017/01/03/%E6%B5%85%E6%9E%90-ReDoS-%E7%9A%84%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E8%B7%B5/ 。可以使用 safe-regex、rxxr2 等工具编写无漏洞的 RegEx ,也可以使用 Google 的 re2 引擎代替 Node.js 默认的 RegEx 引擎
- 信息泄露
- 日志数据脱敏
- 鉴权信息硬编码
- Node.js 源码加固
- 其他
- 三方依赖漏洞:定时升级
- 请求大小限制:避免服务端带宽浪费,一般服务器也会有默认的一些限制。请求实体限制、请求头部限制,URL 长度限制
- 避免弱加密是算法,防止爆破和碰撞风险
# 1.1.5 合规
- 第三方依赖合规
遵守开源协议
- 禁止海外数据回传国内
- 跨境域名访问
- 避免滥用浏览器指纹
- GDRP 合规(欧盟一般数据保护条例)
- 非用户同意不能使用三方追踪技术:弹出 Cookies Banner
- 使用 GA、GTAG 必须开启 IP 匿名化: https://codechilli.lk/ip-anonymization-ip-masking-in-google-analytics-universal-analytics-ga4/
- 其他
- 海外项目含有中文硬编码
- 海外项目含有国内产品信息硬编码
- 产品名称错别字
# 1.2 按风险类型分类
# 1.2.1 合规
同 1.1.5
# 1.2.2 敏感信息
- 内网域名泄露
- 环境变量泄露
- 员工信息泄露
- 鉴权信息泄露
- 调试信息泄露
比如
console.log
未删除,携带敏感调试信息
# 1.2.3 依赖问题
- 使用授权不清的依赖
- 使用有开源协议合规风险的依赖
- 使用有安全漏洞的依赖
# 1.2.4 安全风险
见 1.1.1 ~ 1.1.4
# 2. 如何发现风险
- 自动扫描
- 人工渗透
# 3. 如何防护风险
- 浏览器策略防护
- 漏洞防护
- 代码安全
- 混淆
- 加固
- 数据安全防护
- 脱敏
- 反扒
- 水印
- 鉴权
- 加密
# 4. 系统解决方案(WIP)
待梳理,分为卡点流程、检测原理、修复方案三个环节
# 5. 安全研发流程
- 评审
- 合规评审(若有)
- 安全技术评审(若有)
- 开发
- 研发规范
- 研发工具:IDE 插件、Chrome 拓展
- 上线前
- MR Action 构建产物检测
- 小流量测试验证
- 上线后
- 日常巡检:定时扫描+人工测试
- 安全监控