此份清单对于参与API设计、测试和发布过程的相关安全评估人员而言非常重要,大家可以根据清单核查自身行为!
认证
不要使用Basic Auth(基本身份认证),而要使用standard authentication(标准身份认证,例如JWT,OAuth);
在身份认证、令牌生成、密码存储过程中不要重造轮子,必须使用标准的规范;
在登录中使用Max Retry和jail功能;
对所有敏感数据进行加密处理;
JWT (全称JSON Web Token)
使用一个随机的、复杂的密钥(JWT密钥)来增加暴力破解令牌的难度;
不要从JWT的有效载荷中提取算法,在后端强制执行算法(HS256 or RS256);
限制Token的过期时间(TTL,RTTL),越短越好;
不要将敏感数据存储在JWT的有效载荷中,因为它可以很轻松地被解码;
OAuth
始终验证服务器端redirect_uri地址,确定其只允许白名单的网址进去;
通过code(代码)而不是tokens(令牌)的方式进行信息交换(禁用response_type=token);
在state参数中使用一个随机的哈希值,来防止OAuth认证过程中发生CSRF攻击行为;
定义默认范围,并验证每个应用程序的范围参数;
访问
限制请求(节流),以避免DDoS/暴力破解攻击;
在服务器端使用HTTPS来避免中间人攻击(MITM);
使用带有SSL的HSTS标头,来避免SSL Strip攻击(一种中间人攻击);
输入
根据实际操作使用适当的HTTP方法:GET(读取)、POST(创建)、PUT(替换/更新)以及DELETE(删除记录),如果请求的方法无法对应请求的资源,则使用“405错误(方法不被允许)”进行响应;
验证请求接受标头(内容协商)中的content-type(内容类型),只允许你支持的格式(例如application/xml、application/json等),如果不匹配,则返回“406 错误(无法接受请求)”;
验证发布数据中你接受的内容类型(例如 application/x-www-form-urlencoded、multipart/form-data、application/json等);
验证用户输入以避免一些常见的漏洞(例如XSS、SQL注入以及远程代码执行等);
请勿在链接中使用任何敏感数据(凭据、密码、安全令牌或API密钥等),而要使用标准的Authorization header(认证标头);
处理
检测所有端点是否受到身份验证保护,以避免身份验证过程中断;
用户应该避免使用自己的资源ID。应该选择使用/me/orders 替代 /user/654321/orders;
禁止使用自增ID,可以使用UUID替代;
如果你正在解析XML文件,请确保未启用实体解析,以避免遭受XXE(XML外部实体攻击);
如果你正在解析XML文件,请确保实体扩展功能未启用,以避免遭受递归实体扩展攻击(这种方式也被称之为“XML Bomb”或是“Billion Laughs Attack”);
使用CDN进行文件上传;
如果你需要处理的数据量很大,请尽可能在后台使用Workers 和 Queues的方式进行快速响应,以避免HTTP阻塞;
不要忘记关闭DEBUG模式;
输出
发送X-Content-Type-Options:nosniff 标头;
发送X-Frame-Options:deny标头;
发送Content-Security-Policy:default-src‘none’ 标头;
对响应的内容类型进行限制,如果你返回application/json,那么你的响应内容类型应为application/json;
不要返回凭据、密码、安全令牌等敏感数据;
根据已经完成的操作返回适当的状态码。(例如200 OK、400 Bad Request、401 Unauthorized、405 Method Not Allowed等);
CI(持续集成)& CD(持续交互)
使用unit/integration(单元/集成)测试来审核你的设计和实施活动;
启用代码审查程序,避免盲目自信;
确保你服务器上的所有组件在进入生产之前都通过AV软件进行了静态扫描,包括供应商库(libraries)和其他依赖项;
为部署过程设计一个回滚(rollback)的解决方案。