本帖主要记录安全编码需要注意的一些东西,后续可能补充一些案例
一、注意项
1. 设计相关
1.1. 系统设计
1. 服务开放
- 所有新增服务需要考虑按需开放,如果没有使用或者配置没有开启,就不要让服务运行,并且把端口用防火墙关闭
- 所有端口封锁,仅需要开的端口才打开
- ssh连接不要一直开放,最好设置某些规则后才能连接
- 不要相信客户端,最好有一个ssl双向认证的机制,在某个可信的连接将证书下发,后续连接校验此证书
2. 命令执行
- 权限尽可能收缩,给代码加钩子只允许代码执行系统极个别命令
其他
- 看情况在后台留一个后门,用于上报各种信息给服务器,服务器根据信息判断是否被攻击或者篡改等(对于安全要求高的客户),同时可以做一个全量统计
1.2. 模块设计
1. 外部接口考虑暴力破解或者枚举
- 外部调用的请求之类的接口,要注意鉴权方式。考虑有没有可能通过枚举暴力破解的方式,扫描出一些敏感信息。
- 正常和异常不要有明显的处理时间的不一致,会导致根据返回时间判断是否是正确的用户名等
2. 用户名权限等篡改
接口设计如果有外部输入用户名权限等信息,如果鉴权不够强,可能导致修改绑定的用户名,从而导致数据泄露和权限泄漏
3. 精细化授权
- 管理员需要分级的对每一个模块有读或者读写授权,接口单独分为读接口和写接口,角色创建可以选择不同接口的读写权限
- 授权判断需要走统一入口,防止绕过
4. 密码管理
- 秘钥密码等在数据库储存不能明文,需要原文的可逆加密,不需要的不可逆加密
- 禁止将密码原文存放到磁盘
- 一种解决方案: 使用一个随机文本作为加解密的二进制,使用二进制加密密码,将密文存放磁盘,代码中进行解密使用
2. 编码相关
- 外部输入需要考虑大小问题,是否可能越界
- 外部输入是否可能存在特殊字符
- sql注入
- xml注入
- 编译型二进制必须strip,脚本型能混淆尽量混淆
二、威胁应对参考设计方案
1. 枚举暴力破解
接口校验参数格式固定,有可能被暴力循环扫描来枚举出信息,可参考以下方案解决
- 必须在线用户可发请求到接口,session机制
- 数据整体使用特殊算法生成一个hashid,服务端校验hashid对上才处理数据
- ip防爆破检测
- 前端加ddos防攻击设备
2. 用户名权限等篡改
接口有外部输入用户名权限等数据时,可能出现被篡改数据,可参考以下方案解决
- 用户名除了登录时需要外部输入进行校验,其余放入在线信息中,外部通过session关联链接,从其中获取用户名和权限,不从外部输入
- 内部接口则限制ip仅为
127.0.0.1
三、主动防御方案
1. 资源诱饵欺骗
- 在内网设置蜜罐,发布一些假资源,暴露假的账号密码。登陆时抓到攻击者