业务安全开发
从输入验证到接口安全,把业务代码里那些容易被忽略的安全细节系统过一遍。每篇一个主题,配合代码示例,看完能建立一个基础的安全编码直觉。
-
1
00 我们为什么要注重安全?
你好,我是一笑(Maksim),接下来我们要来聊一聊如何在业务中如何开发出“安全”的代码。 首先来讲一讲为什么会写关于安全的文章,最近真的是被安全团队搞的晕头转向,在老代码中存在大量的安全问题,不断的修修补补,起初感觉有些烦躁,感觉有些接口没有必要这么严格,直到我被“安利”了一款应用,由于涉敏就不在文章中详细说明了。 …
-
2
01 业务安全的第一道防线输入验证
在我们日常的编码过程中,输入校验可以说是我们业务安全的第一道防线,我们需要对每一次的用户输入做一定的校验,也就是我们常说的,不要信任任何用户的输入。 对于用户的输入,我们需要做到如下的校验: 白名单 黑名单 规范化 合法性校验 防范 SQL 注入文件校验 访问控制 白名单 场景: 当可能输入的集合比较小的,可以选择使用…
-
3
02 输出编码: HTML 转码和信息脱敏
编码场景 场景:不可信数据输出到前后端页面时,需要考虑可能的代码注入情况。 说明:不可信数据输出到前后端页面时,根据输出场景对其进行相关编码,如HTML实体编码、URL编码。 净化场景 场景:输出到前后端页面时,如果包含敏感信息需要做脱敏等处理再输出。 说明:针对操作系统命令、SQL和LDAP查询,净化所有输出的敏感信…
-
4
03 身份验证:用户登录那些事
提交凭证 场景:用户通过PC或者APP进行登录时,需要保护用户凭证避免被泄露。 说明:用户凭证必须经过加密且以POST方式提交,建议用HTTPS协议来加密通道、认证服务器。 HTML示例:用户登录功能。 ■ 错误提示+异常处理 场景:用户通过PC或者APP进行登录时,登录失败提示信息避免泄露过多信息。同时能够防止撞库等…
-
5
04 短信验证码
■ 验证码生成/验证码限制/安全提示/凭证校验 场景:用户注册、密码重置、密码找回时。 说明:复杂度至少6位数字或字母,一次一用,建议有效期不超过180秒。前后端设置用户获取频率为60秒一次,建议每个用户每天获取的短信最多10条。增加安全提示:至少含本次操作的功能、验证码发送编号、是否是个人自己操作的风险等信息。禁止在…
-
6
05 图灵验证码
■ 验证码生成 场景:用户注册、密码重置、密码找回时。 说明:复杂度至少4位数字或字母,或者采用拼图等验证方式,一次一用,建议有效期不超过180秒。 Java示例:后端生成验证码。 PHP 示例:后端生成验证码。 html 用户登录页面增加验证码功能 验证码校验功能实现。
-
7
08: 访问控制
title = "" categories = "PHP" date = +++ ■ 控制方法 场景:需要进行授权访问的系统在进行访问时接入。 说明:将访问控制的逻辑代码与应用程序其他代码分开,服务端根据会话标识来进行访问控制管理。 PHP示例:根据用户组对用户权限进行独立的访问控制。 ■ 控制管理 场景:用户访问权限…
-
8
09: 老生常谈的注入攻击
■ SQL注入 场景:SQL注入发生在任何有用户可控输入并且会和数据库进行交互操作的功能处,比如:用户登录验证、查询、搜索、更新信息等。 说明:通过预编译实现参数化查询,将用户的输入数据和后台的SQL代码分离,正确的使用预编译来实现参数化查询,可以有效地防止SQL注入。 PHP 示例:使用PDO处理用户输入 PHP 示…
-
9
06 更加安全的密码管理
■ 密码设置 场景:用户注册、密码重置、密码找回时。 说明:密码设置时,应该满足8位及以上长度,含大小写字母、数字及特殊字符等的要求。用户密码设置必须经过后端校验,不允许设置不满足复杂度要求的密码。 PHP示例:后端验证密码复杂度。 ■ 密码存储 场景:用户提交的密码在服务器端保存时,需要做转换避免明文存储后泄露。 说…
-
10
07 会话安全
■ 防止会话劫持 场景: 系统登录入口。 说明: 在应用程序进行身份验证时,建议持续使用HTTPS连接,认证站点使用HTTPS协议。如果连接是从HTTP跳转到HTTPS,需要重新生成会话标识符。禁止在HTTP和HTTPS之间来回转换,这可能会导致会话被劫持。 Nginx 强制使用 https ■ 会话标识符安全 场景:…
-
11
13:接口安全
■ 网络限制 场景:内外部调用的接口,如果可以属于内部系统间或第三方合作的资源调用情况。 说明:调用方网络限制,比如通过防火墙、主机host 和Nginx deny等技术措施进行校验。 配置示例:使用网络防火墙配置IP白名单。 在生产环境不建议使用 iptables 的方式进行限制,因为这样会增加服务器的维护成本,在迁…