一、浏览器相关安全知识
1、XSS 攻击
定义:Cross-Site Scripting(跨站脚本攻击),是一种代码注入攻击。 本质:攻击代码和本地代码混合在一起,浏览器无法分辨,导致 cookie 等信息被截获。 分类:
- 存储型:脏代码被存到了数据库中,如在评论中输入一个脚本,其他人查看此条评论,就会触发;
- 反射型:通过构造特殊的 URL 携带了攻击代码,如网站搜索,跳转功能等;
- DOM 型:脏代码写入了 DOM 中,由用户手动触发了;
防范手段:
- 用户输入过滤(对于明确的输入类型,如URL,电话号码,邮箱),对于复杂类型输入,如果统一使用过滤可能会导致乱码;
- 转义 HTML,用转义库来帮助转义,转义<、>,等特殊字符
- 用 .innerHTML、document.write(),插入元素前要判断
- Vue/React 技术栈,避免使用 v-html、dangerouslySetInnerHTML 等功能,在 render 方法中避免使用 innerHTML 等代码;
- CSP 规则:
- 禁止加载外域代码;
- 禁止外域代码提交;
- 禁止内联脚本执行;
- cookie 操作:
- HTTP-only 设置
2、CSRF
Cross-site request forgery 跨站请求伪造 本质:利用浏览器的 cookie 共享机制,同一个 domain 的请求会携带上公共的 cookie; 描述:
- 用户登陆了银行 yinhang.com,银行的登录态没有过期;
- 用户访问了钓鱼网站,网站上触发了发送到 yinhang.com 的转账请求;
- 银行收到了转账请求,同时检测到携带了登录态;
- 发生了转账;
防止的措施:
- referer 校验,检测请求的来源地址,如果不是 yinghang.com,则自动拦截;
- 表单提交的时候,在 http 头中存一个随机 token,登录后存在 session 当中,服务器校验此是否真实的请求;
- cookie 的 same-site 机制
- Strict:完全禁止第三方的 Cookie,跨站点时候,任何情况都不会发送 Cookie;
- 这种比较严格,所有的跳转都携带不了认证消息;
- Lax:大多数情况不发送第三方 Cookie,导航到目标网站的 Get 除外;
- None:关闭;
- Strict:完全禁止第三方的 Cookie,跨站点时候,任何情况都不会发送 Cookie;
- 跨域请求携带 cookie,设置 withCredentials 可以携带
3、CORS
Cross-origin resource sharing(跨域资源共享) 定义:允许浏览器向跨源服务器发出 XHR 请求,克服只能同源请求 ajax 的缺点。 请求类型:
- 简单请求
- 直接发出去,携带 Origin 字段;
- 如果这个 Origin 指定的域名在符合范围内,服务器就会多几个响应;
- Access-Control-Allow-Origin:源
- Access-Control-Allow-Credentials:是否允许 Cookie
- Access-Control-Expose-Headers:请求头
- 复杂请求
- 定义:
- 除了HEAD,GET,POST;
- HTTP 有自定义属性,或 Content-Type 为 json;
- 预检请求
- 请求类型是 OPTIONS,意思是问询;
- Access-Control-Max-Age:本次预检请求有效期
- 定义:
withCredentials 属性 CORS 请求默认不发送 Cookie 和 HTTP,配置此表单,可以携带。
二、防爬虫措施
1、常见策略:
- UA + Referer 检测;
- 验证码;
- 风控系统 + 蜜罐
2、前端方法:
- 关键字写入伪元素的 content 里面,爬取数据后,需要解析 css
- 元素定位覆盖:
- 正式的价格通过一定规则 “错位” 显示。
- 图片剪切:
- 把数字写到图片里面,雪碧图一样使用数字
- 动态的 font 字体
三、开发中常见越权手段:
1、横向越权
a、初级场景:
问题描述
同级别的 A 用户获得了 B 用户的权限, Delete 58.com/{articalID}… 如果帖子 ID 是自增 ID 来用的,如422013,那么我们是不是可以控制422014,422012等的删除操作;
b、复杂场景
问题描述
Delete 58.com/{userID}/{a… 学明白了,接收一个 userId,校验该 articalId 是否属于此 userId; 因为 userId 大概率也是自增 ID,我们可以进行海量攻击,成功几率很高;
常见类型
userId 等关键 ID,放在 token 中,或者 http 的 body 中,或者 url 的 query 里面;
如何避免
- 所有 ID 均做混淆处理,如雪花算法处理;
- 能从 token 或者 sessionID 中得到的用户信息不允许重新在报文中再体现,包括 cookie 中;
- 不可避免的请求头文件(如 saas 化的平台) 可以从 nginx 等服务器中添加;
- 前后端完全分离项目,用 nginx 等做服务代理,隔绝了服务端地址,保障了服务安全;
- 使用 https 协议;
2、纵向越权
问题描述
普通用户触发了管理员的操作,没有做好用户角色等级管理机制;
处理方案
- 加入 RBAC 角色管理功能,使用动态路由机制;
- 后端有专门的鉴权中心服务;
四、开发中常见的加密手段
1、常见加密算法知识
hash 算法是不是加密
hash算法,散列函数,把任意长度的输入,变成固定长度的输出; 常用地方:passport 插件,登录的时候,把密码处理一下,避免明文; hash 不可逆,所以不属于加密算法,md5 部分可逆是因为这个算法碰撞出来的; 如 MD5,SHA1,SHA2;
对称加密
同一个密钥可以进行加密和解密操作;如 AES,3DES;
非对称加密
加密密钥与解密密钥不一样; 如 ssh 服务器的公钥与私钥,CA 证书的公钥和私钥 RSA(2048),ECDSA(椭圆曲线加密,256)
2、开发中常见的案例
HTTPS 是如何做的加密策略
加入了 SSL/TLS 安全传输层这个概念;
对称算法用来进行加解密,非对称算法用来传输对称算法秘钥;
支付宝如何做的加密
如支付宝用的就是 RSA 加密(2048位以上密钥)
3、国密算法简介
SM系列,1,2,3,4到9,后续会越来越普及,关键部门已经使用了。
| 密码分类 | 国产商用密码 | 国际商用密码 | |
|---|---|---|---|
| 对称加密 | 分组加密/块加密 | SM1/SCB2 SM4/SMS4 SM7 | DES 3DES AES |
| 序列加密/流加密 | ZUC(祖冲之算法) | RC4 | |
| 非对称加密 | 大数分解 | RSA DSA ECDSA | |
| 离散对数 | SM2 SM9 | DH DSA ECC | |
| 散列/杂凑 | SM3 | SHA-1 SHA-2 MD5 |
五、企业级监控操作
- 水印,数字水印技术;
- window 如果安装的企业镜像,有很高的权限,截屏或者录制视频都可以;
- 网络监控,植入特定 CA 证书;
六、参考链接
www.ruanyifeng.com/blog/2019/0… blog.csdn.net/diaolanbeng… zhuanlan.zhihu.com/p/132352160