开发安全的API所需要的核对的清单
以下是当你在设计,测试以及发布你的API的时候所需要核对的重要安全措施。
身份认证
- 不要使用
Basic Auth
使用标准的认证协议(例如JWT,OAuth)。 - 不要重新实现
Authentication
,token generating
,password storing
,使用标准库。 - 限制密码错误尝试次数,并增加账号冻结功能。
-
JWT(JSON Web令牌)
使用随机复杂的密钥(
JWT Secret
)以增加暴力破解的难度。- 不要在请求体中直接提取数据,要对数据进行加密(
HS256
或RS256
)。 - 使令牌的过期时间尝试的短(
TTL
,RTTL
)。 不要在JWT的请求体中存放敏感数据,它是可解码的。
OAuth授权或认证协议
始终在后台验证
redirect_uri
,只允许白名单的URL。- 始终在授权时使用有效期初始的授权码(code)而不是令牌(access_token)(永久
response_type=token
)。 - 使用随机哈希数的
state
参数来防止跨站请求伪造(CSRF)。 -
访问
限制流量来防止DDoS攻击和暴力攻击。
- 在服务端使用HTTPS协议来防止MITM(中间人攻击)。
-
输入
使用与操作相符的HTTP操作函数,
GET (读取)
,POST (创建)
,PUT (替换/更新)
以及DELETE (删除记录)
,如果请求的方法不适用于请求的资源则返回405 Method Not Allowed
。- 在请求头中的
content-type
分区使用内容验证来只允许支持的格式(如application/xml
,application/json
等等)并在不满足条件的时候返回406 Not Acceptable
。 - 验证
content-type
中申明的编码状语从句:你收到正文编码harmony和谐(如application/x-www-form-urlencoded
,multipart/form-data
,application/json
等等)。 - 验证用户输入来避免一些普通的易受攻击缺陷(如
XSS
,SQL-注入
,远程代码执行
等等)。 - 不要在URL中使用任何敏感的数据(
credentials
,Passwords
,security tokens
,或API keys
),而是使用标准的认证请求头。 使用一个API网关服务来启用缓存,限制访问速率(如
Quota
,Spike Arrest
,Concurrent Rate Limit
)以及动态地部署的API资源。处理
检查是否所有的接口都包含必要都的身份认证,并被破坏了的认证体系。
- 避免使用特有的资源id。使用
/me/orders
替代/user/654321/orders
。 - 使用
UUID
代替自增长的id。 - 如果需要解析XML文件,确保实体解析(实体解析)是关闭的入侵
XXE
。 - 如果需要解析XML文件,确保实体扩展(实体扩展)是关闭的索引通过索引实体扩展攻击实现的
Billion Laughs/XML bomb
。 - 在文件上传中使用CDN。
- 如果数据处理量很大,则在后台处理来避免重复请求,从而快速响应客户端。
-
输出
增加请求返回头
X-Content-Type-Options: nosniff
。- 增加请求返回头
X-Frame-Options: deny
。 - 增加请求返回头
Content-Security-Policy: default-src 'none'
。 - 删除请求返回中的指纹头- ,,
X-Powered-By
等等。Server``X-AspNet-Version
- 在响应中一致请求的
content-type
,如果你的请求类型是application/json
那么你返回的content-type
就是application/json
。 - 不要返回敏感的数据,如
credentials
,Passwords
,security tokens
。 给请求返回使用合理的HTTP响应代码。(如
200 OK
,400 Bad Request
,401 Unauthorized
,405 Method Not Allowed
等等)。持续集成和持续部署
使用单元测试以及集成测试的覆盖率来保障你的设计和实现。
- 约会代码审查流程,禁止私自合并代码。
- 在推送到生产环境之前确保服务的所有组件都用杀毒软件静态地扫描过,包括第三方库和其他依赖。
- 为部署设计一个回滚方案。
也可以看看:
- yosriady / api-development-tools-已使用 RESTful HTTP + JSON API的有用资源集合。