安全编码
本章节介绍编码的安全要求。
输入校验
不能依赖客户端校验,必须使用服务端代码对输入数据进行最终校验。对于在客户端已经做了输入校验,在服务器端再次以相同的规则进行校验时,一旦数据不合法,必须使会话失效,并记录告警日志。
必须假定所有用户产生的输入都是不可信的,并对它们进行合法性校验和值域校验,一旦数据不合法,应该告知用户输入非法并建议用户纠正输入。
- 如果输入为数字参数,必须进行数字型判断。
- 如果输入只允许包含某些特定的字符或字符的组合,使用白名单(推荐使用正则表达式)进行输入校验。
- 如果输入为字符串参数,必须进行字符型合法性判断。
- 如果明确输入数据的长度限制,必须校验输入数据的长度。
- 如果输入数据为数值且明确范围,必须检验数据的范围。
- 禁止通过字符串串联,直接使用用户输入构造可执行SQL语句,降低SQL注入攻击的风险。
- 用于重定向的输入参数不能包含回车和换行字符,以防止HTTP响应拆分攻击。
“回车”字符有多种表示方式(CR = %0d = \r ),“换行”字符有多种表示方式(LF = %0a= \n)。
上传下载
会话及权限管理
对于每一个授权访问的接口内,都必须核实用户的会话标识是否合法、用户是否被授权执行这个操作。授权和用户角色数据必须存放在服务器端,不能存放在客户端,鉴权处理也必须在服务器端完成。
敏感数据保护
敏感数据包括但不限于口令、密钥、证书、会话标识、License、隐私数据(如短消息的内容)、授权凭据和个人数据(如姓名、住址、电话等)等。在程序文件、配置文件、日志文件、备份文件及数据库中,都有可能包含敏感数据。
- 禁止在代码和日志中,存储敏感数据。
- 禁止密钥或账号的口令,以明文形式存储在数据库或文件中。
- 禁止使用自己开发的加密算法,必须使用公开、安全的标准加密算法。