越权漏洞
在服务端开发过程中,我们往往知道给不同的接口赋予不同的访问权限(如:普通用户不能访问管理员的接口),然而这种权限配置仍存在一些漏洞。
水平越权
即使用户有权限调用某个接口,但该用户不一定有权访问该接口下的全部实体。
例如:用户可以调用查看订单的接口,理论上只需要传入订单 ID 即可查得到。然而,每个订单都有它的主人,用户不应该看到其它人的订单情况。由于用户和订单的属主关系保存在数据库内,这可能不能简单地在网关通过 token 鉴权来完成,而是需要到具体的微服务中通过查询数据库来判断。
垂直越权
有时业务可能会设计多个不同角色都有权限访问某个接口,比如管理员和老师都能访问“管理学生”接口。此时需要注意管理员和老师能管理的学生范围也是不一样的,管理员可以管理全部学生,而老师也许只能管理一个班的学生。具体实现时就需要网关解析出该用户的角色(role),并在调用微服务时携带上该字段。
小结
在极简版抖音项目中,经常能看到接口接受用户 ID 作为参数,此时需要通过 token 判断这个用户 ID 是否就是这个调用者的,或者直接从 token 中解析出真实的用户 ID。
SSRF
SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作。
有时业务上需要用户传入一个 url 给服务端,由服务端调用这个 url 进行一些操作(比如:翻译某个网页、从 url 获取头像等)。此时攻击者可以传入一个内网的地址,让服务端调用它。
防护方式:对 url 的 host 进行白名单过滤,获取对 host 解析的 ip 进行判定,是否是内网地址。
文件上传漏洞
文件上传漏洞分为两种:
- 用户上传的文件可以直接被执行(如:php文件)
- 用户上传文件后逆向得到文件链接,并用于自己的服务中
防护方案:
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式,这样可以防止文件被执行。
- 站库分离:应用部署的位置和上传的文件分离,一般可以使用 TOS、OSS 等进行文件存储,这样也可以防止文件被执行。
- 防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等。这样可以防止有人盗用链接,有时业务规定静态资源不需要登录就可以查看,比如抖音不用登录就能刷,此时可以用时间限制的方式。