- 服务端
- 第三方组件漏洞
- 针对java可以选择使用dependency-check-maven检查项目的组件是否存在安全漏洞
- SQL注入
- 尽量不用基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架
- 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题
- 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义
- 命令执行
- 对动态的值尽可能设置白名单进行验证
- 如果某些位置无法白名单,需要尝试对数据类型进行校验
- 特殊字符黑名单的过滤,或者转义
- 越权漏洞
- 黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情
- 防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口
- SSRF
- 防护方式:对url的host进行白名单过滤,获取对host解析的ip地址进行判定,是否是内网地址
- 文件上传漏洞
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式
- 站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS,OSS等进行文件存储
- 防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等。
- 客户端
- 开放重定向
- 危害:钓鱼攻击
- 修复方案:对重定向严格进行白名单控制并正确检验匹配白名单
- XSS(跨站脚本攻击)
- 场景:反射型、存储型、Dom型
- 危害:通常的危害包括窃取用户敏感信息,以用户身份执行敏感操作
- 防护方式:
- 输入过滤:对输入的特殊字符进行拦截,禁止前端提交特殊字符
- 输出过滤:
- a.当字符输出到Dom时候,对危险字符进行html encode,避免XSS
- b.使用vue/react等框架的时候,避免使用危险指令,而应该使用安全指令。v-html/v-text
- 富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单
- CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。
- CSRF(跨站请求伪造)
- 危害:用户执行敏操作,如关注其他用户,或者更改账号的安全邮箱等。
- 防护方式:核心是判断请求的来源
- CSRF tokens:首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问。
- SameSite cookies:Strick - > Lax(Default) - > None.核心是禁止某些场景发送第三方cookie
- Referer-based validation:校验Referer来源是否是合法站点。
- 思考:大厂微服务场景,CSRF防护应该怎么做?
- 点击劫持(clickjacking)
- 防护的核心是不让非预期的网站iframe我的站点
- CORS跨域配置错误
- 防护的核心是正确设置跨域白名单
- 代码层:Middleware统一处理
- 网管层:Nginx反代统一拦截处理
- WebSocket
- CSWSH防护手段:
- Cookie鉴权:限制请求的origin
- ticket/token鉴权:http服务提供接口,用于获取了临时的身份凭证,并传递到WebSocket的初始化流程中



