什么是SDL
SDL是由微软公司首先提出并实践应用的帮助开发人员构建更安全的软件和解决安全合规要求的同时降低开发成本的软件开发过程,旨在开发出安全的软件应用。今天我们要讲的是软件开发过程中针对【密码管理】、【会话安全】、【访问控制】、【日志规范】、【敏感信息】的安全规范处理方式。
密码管理:

- 禁止使用私有或者弱加密算法(比如禁止使用DES,SHA1等,推荐使用AES: 128位,RSA: 2048位,DSA: 2048位)。
- 采用基于哈希算法和加入盐值(salt)方式安全存储口令信息。
- 密码输入框,可设计为显示密码和隐藏密码切换功能。
- 密码重设和更改操作,需要进行二次合法身份验证。
- 密码重设时,应对注册手机号和邮箱进行有效验证,链接只能发送到预先注册的邮件地址或预先绑定的手机号。
- 临时密码和链接应设计一个短暂的有效期(比如5分钟),防止暴力破解。
- 当密码重新设置时,应短信通知用户是否是本人在操作,告知安全风险。
- 密码复杂度设置:建议8个字符以上,包含字母、数字及特殊字符等。
- 密码设置场景中应具有密码复杂度检查功能。
- 密码不能输出到日志和控制台。
- 数据库连接配置中的用户密码要以加密的形式存储。
- 建议设计密码定期修改提醒机制。
会话安全:
- 用户登出后应立即清理会话及其相关登录信息。
- 注销功能应当完全终止相关的会话或连接。
- 增加Cookie 安全性,添加“HttpOnly”和“secure”属性(当“secure”属性设置为true时表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在HTTPS 连接中被浏览器传递到服务器端进行会话验证,在 HTTP 连接中不会传递该信息,也就不会存在Cookie被窃取的问题;设置了"HttpOnly"属性,通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样也能减少XSS跨站脚本攻击风险)。
- 会话cookie应设计有效期,超时后立即失效。
- 当设计允许用户在多渠道终端同时登录时,建议应进行常用设备登录限制
- 为包含已验证的会话标识符的 cookie 设置域和路径,为站点设置一个恰当的限制值。默认cookie的域是当前域名,默认cookie的路径是当前页面的目录路径。如果想要跨域或者在其他的路径下访问cookie就必须要重新设置这两个属性,domain和path。
- 注销功能应当可用于所有受身份验证保护的网页。
- 在平衡风险和业务功能需求的基础上,设置一个尽量短的会话超时时间。通常情况下,应当不超过几个小时。
- 不要在URL、错误信息或日志中暴露会话标识符,会话标识符应当只出现在http头信息中,不要将会话标识符以 GET 参数进行传递。
- 定期生成一个新的会话标识符并周期性地使上一个会话标识符失效(这可以缓解那些原标识符被获得的特定会话劫持情况)。
- 在身份验证的时候,如果连接从 HTTP 变为 HTTPS,则会生成一个新的会话标识符。在应用程序中,推荐持续使用 HTTPS,不应在 HTTP 和 HTTPS 之间来回转换,有效避免切换过程会话被劫持篡改。
- 为服务器端的操作执行标准的安全会话管理,为每个会话执行合法的身份验证和权限控制,防止存在CSRF跨站点请求伪造漏洞。
访问控制:
- 将具有特权的逻辑从其他应用程序代码中隔离开。
- 限制只有授权的用户才能访问文件资源。
- 限制只有授权的用户才能访问受保护的URL。
- 限制只有授权的用户才能访问受保护的功能或服务。
- 建议只有授权的用户才能访问直接对象引用。
- 限制只有授权的用户才能访问受保护的应用程序数据。
- 限制只有授权的用户才能访问与安全相关的配置信息。
- 限制只有授权的外部应用程序或接口才能访问受保护的本地程序或资源。
- 服务器端执行的访问控制规则和前端实施的访问控制规则必须匹配。
- 服务器中创建文件时需指定合理的访问权限(读/写/可执行)。
- 当权限重新设置发生变更时,应记录好日志,并短信通知用户是否是本人在操作,告知可能存在的安全风险。
日志规范:
- 不要在日志中保存敏感信息,包括系统指纹信息、会话标识符、账号密码、证件、ID等。
- 确保日志记录包含了重要的日志事件数据。
- 记录所有失败和成功的输入验证。
- 记录所有失败和成功的身份验证记录。
- 记录所有失败和成功的访问和操作记录。
- 记录明显的修改事件,包括对于状态数据的修改。
- 记录连接无效或者已过期的会话令牌尝试。
- 记录所有的管理功能操作行为,包含但不限于安全配置设置的变更。
- 记录所有失败和成功的后端连接。
- 记录加密模块的错误信息。
敏感信息:

- 临时产生的敏感数据(写入内存或文件),应具有及时清除和释放机制。
- 不要在 HTTP GET 请求参数中包含敏感信息,如用户名、密码、卡号、ID等。
- 禁止表单中的自动填充功能,因为表单中可能包含敏感信息,包括身份验证信息。
- 不要在客户端上以明文形式保存密码或其他敏感信息。
- 为所有敏感信息采用SSL加密传输。
- 禁止将敏感信息(包含加密秘钥等)硬编码在程序中。
- 禁止明文存储用户的密码、身份证号、银行卡号、持卡人姓名等敏感信息。
- 不要在日志中保存敏感信息,包含但不限于系统详细信息、会话标识符、密码等。
- 禁止在异常中泄露应用服务器的指纹信息,如版本,路径,组件版本等。
- 禁止将源码或sql上传到开源平台或社区,如github、开源中国等。
- 请求中含有敏感参数(如订单号、ID等),应进行混淆方式处理,防止产生参数遍历获取信息风险。
- 敏感信息需要展示在web页面上时,应在后台进行敏感字段脱敏处理。
- 请求返回数据不应包含请求之外的业务数据,特别是敏感信息数据。