安全
- 所有入参均经过校验,包括验证参数数据类型、范围、长度,尽可能采用白名单形式验证所有的输入。对于非法请求,记录WARN log。参考Input Validation Cheat Sheet;前后端统一校验标准,最好统一自动生成代码。
- 避免拼接客户端可控参数到SQL语句,采用预编译形式执行SQL,尽可能使用#{},特殊场景需使用${}时必须对参数做严格校验,比如限制类型、长度等。
- 对于服务端内部异常,统一返回Error Code和Error Message,避免返回Stacktrace等内部系统细节,参考统一异常处理&错误码规范使用说明。
- 所有接口读写敏感数据前必须增加 session 鉴权,校验数据归属为当前登录账户。
- 敏感信息不要硬编码到代码中(比如密码等)。
- 非公开页面或资源,必须要求服务端身份验证。
- 符合Least Privilege原则,具备逻辑严密的权限配置。
- 重要数据变动皆有审计日志,日志中不要保存敏感信息(系统详细信息、会话session或密码等)。
- 所有上传文件类型必须要做白名单检查,且统一存储到OSS。
- 禁止在代码中留任何形式的后门
兼容性
- 所有的模块外部接口不存在兼容性问题;
- 如果有DB Migration,说明需在发布前或发布后执行,兼容平滑发布;
- 所有的DB Schema变动均已考虑对统计的影响;
- 数据的含义或处理逻辑有变更时,考虑对存量/在途数据的影响;
性能
- 相关DB查询有恰当的索引;
- 接口处理时间与数据库中既有数据量不存在相关性;
- 批量数据处理、定时任务、离线处理等重度DB和计算的任务,需与业务进程隔离,尽可能用只读数据源;
- 严格控制批量导入功能的开发;
- 对与高Hit Ratio的查询进行缓存处理。数据更新时,根据业务需求采用合适的缓存刷新策略;
- 全文搜索相关的使用ES进行支持;
- 没有WHERE的语句需要加上LIMIT;
质量
- 相当的可读性,可自解释,不可自解释的地方有相应的注释。外部接口有详细Java Doc,DB Schema有详细注释,并有相应的E-R图;
- 主要流程被Unit Test覆盖;
- 通过SonarLint检测没有严重Issue;
- DB业务关键字段加上NOT NULL Constraint;
标准
- HTTP Return Code
- 正常请求返回200
- 非法参数返回400
- 未登录或没有权限返回403
- 服务器内部错误返回500,并给出Error ID(Request ID),但隐藏Error细节
- Git Commit的Comment需带上禅道的Issue No,如: TASK-d+ *** 或者BUG-d+ ***