网络安全 频道

7个API安全最佳实践

一、序言

API是对公网暴露的系统入口,是直面网络攻击的最前线,如果不能将其做到坚不可摧,那它很容易会在qiang林弹雨的网络攻击中倒下
那怎样的API才算得上坚不可摧呢?下面我将分享一些自己在实际的工作的安全心得,希望对大家有启发!

二、API安全最佳实践

1、注重用户认证:

用户的认证和授权是非常关键的,如果未做好相关工作,很容易出现认证绕过、任意用户登陆、登陆或者注册接口爆破等问题
那怎样才能做好用户认证接口呢

  • 通过验证码、短信验证码和接口调用速度来限制关键接口的爆破

  • 清晰的设计密码找回、密码修改等敏感接口的流程和token,避免被攻击者绕过

  • 使用强随机数和强加密算法生成token,避免使用静态token

  • 后台对密码强度进行校验,限制用户设置弱密码

2、权限控制

水平越权和垂直越权属于业务逻辑漏洞,目前还没有很好的工具能对该类漏洞进行有效检测,越权漏洞的数量是和系统业务的复杂度成正比的
越权不是技术问题,而是设计问题,当一个系统的业务复杂度不断升高时,它的权限系统也要随之进行升级,和业务高度耦合的而又精简的权限框架能有效的减少越权漏洞出现

批量操作的权限校验往往会被开发者忽略,因为批量操作需要对数组进行循环鉴权,这也是越权漏洞的一个突破点

3、避免注入攻击:

注入攻击是很经典的攻击类型,常见的sql注入、命令注入和xxe等都属于注入攻击
这类漏洞的防护相对会简单一些

  • 保证每个进入系统的参数都被校验,可以使用 spring validate 来做参数格式校验

  • 尽量使用成熟框架,比如mybatis等,可以有效降低sql注入发生概率

在使用 spring validate 时,如果需要使用正则对一个复杂的参数进行校验,应该尽量避免redos漏洞的出现
尽管使用框架,但排序、筛选字段和超复杂的查询还是容易出现sql注入,因为某些开发者会使用sql拼接来完成复杂的sql查询

4、避免信息泄露

信息泄露造成的后果往往都是严重的,核心数据的泄露更是非常致命。

  • 做好输出数据的控制,比如使用一个实体类来定义每个API输出的数据,避免多余的字段被输出到了前端

5、访问频率限制

关键接口要做好访问频率限制,比如:发送短信验证码、登陆、修改密码和注册等,一般都是某些重要资源消耗型接口

  • 某些接口可以做多层限制,比如第1次发验证码直接发,第2次开始需要图像验证码,第15次开始限制ip

6、设置安全头

安全头可以大大提升系统整体的安全性,减少攻击风险

  • Content-Security-Policy 可以在一定程度上防护xss攻击

  • X-Frame-Options 可以阻止点击挟持攻击

  • Strict-Transport-Security 可以强制通讯使用https

  • X-Content-Type-Options 可以限制MIME嗅探

  • Content-Security-Policy 可以管理网站允许加载的内容

7、注意容器和组件漏洞

前面6个措施有效的增加了API的安全性,但是如果某些攻击是在程序还未执行到API入口就完成攻击了呢
那一定是容器和组件漏洞,比如fastjson 、struts、甚至 tomcat、weblogic
这些框架和容器的某些版本都是存在一定可以执行RCE的CVE的

  • 尽量将项目使用的第三方组件升级到最新修正版

  • 使用sca产品对项目的组件进行检测

三、结束语

通过上述的措施,可以大大提升API的安全能力,但是无法彻底的解决安全问题,因为安全是一个多维度、多角度、多层次的复杂问题,没有任何一个产品和工具能彻底的解决安全的问题
安全需要开发者和安全工程师一起努力,掌握更多的安全知识和攻击场景,才能将安全能力做到更高的水平

1
相关文章