1.接口安全设计
1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。
说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信
内容、修改他人的订单。
2. 【强制】用户敏感数据禁止直接展示,必须对展示数据进行脱敏。
说明:查看个人手机号码会显示成:158****9119,隐藏中间 4 位,防止隐私泄露。
3. 【强制】用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,
禁止字符串拼接 SQL 访问数据库。
4. 【强制】用户请求传入的任何参数必须做有效性验证。
说明:忽略参数校验可能导致:
- page size 过大导致内存溢出
- 恶意 order by 导致数据库慢查询
- 任意重定向
- SQL 注入
- 反序列化注入
- 正则输入源串拒绝服务 ReDoS
说明:Java 代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题,
但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。
5. 【强制】禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
6. 【强制】表单、AJAX 提交必须执行 CSRF 安全过滤。
说明:CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在
CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL,只要受害者用户一访问,后台便在用户
不知情情况下对数据库中用户参数进行相应修改。
7. 【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制
如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。
说明:如注册时发送验证码到手机,如果没有限制次数和频率,那么可以利用此功能骚扰到其
它用户,并造成短信平台资源浪费。
8. 【推荐】发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过滤等风控策略。
9.常用的接口鉴权方式
1.常用auth2
2.非对称加密参数,指定公钥私钥rsa,aes
3.md5参数加密验证
4.常用鉴权方式:鉴权常用字段noce(随机数),timestamp(时间戳),接口权限要明确控制防止串号越权情况.
10.出入参敏感数据处理:
1)基于整个数据加密 2)单个参数加密 3)回显数据脱敏处理
11.出入参要满足最少原则.
按需求封装数据,原则上不允许将数据库实体类对象放回到前端.例如用户密码,身份证等,用户需要什么数据才返回什么数据,减少带宽.不允许使用自增主键传递到前端
12.接口幂等性
对于用户重复点击,重复操作要保证数据的幂等性.不允许重复操作的接口要增加防重复处理和请求间隔控制
13.接口限流和防攻击设计
常用的限流有令牌桶算法和漏同算法,防攻击的方面有防止跨域请求攻击,黑白名单控制,请求失效控制
14.接口单一职责原则:
接口要满足单一职责原则,原则上不允许一个controller处理多种不同模块不同业务的方法
15.接口隔离型设计:
消费者端和管理端的接口要分离和权限控制,不要在代码上保留着只有管理端才有权限的接口,原则上一些不允许修改,删除功能的接口,控制层和服务层不允许包含这些操作的功能接口或方法
16.负载均衡和故障转移
常见的有nignx负载均衡和spring cloud中ribbon和feign的负载均衡策略,熔断机制
2.敏感数据处理
1.传输加密,脱敏处理
2.数据库数据加密
3.配置文件的加密
3.并发场景和漏洞考虑
1.线程安全问题
spring 默认bean的作用域为单例模式,要考虑全局变量的线程安全问题,静态类单例模式的安全问题
2.缓存雪崩和缓存穿透
空值控制和双检锁的解决方案
3.SQL防攻击
4.分布式锁和分布式事务
5.分库分表,读写分离
6.数据序列化问题
7.引用第三方工具类和jar包的漏洞和风险考虑,例如阿里巴巴fastJson远程执行代码漏洞问题
8.异常的抛出,要处理返回值,避免暴露tomcat的版本,异常的代码行数,SQL错误的语句等信息给前端,防止被黑客攻击
4.代码bug的避免
1.异常的考虑
尤其是引用类型的空指针异常问题,例如取对象中的值,条件比较重的取值和判断顺序问题
2.死锁和死循环的场景
注意循环条件的变化情况,注意锁竞争互斥锁等情况
3.边界值的检查
注意循环中最大值和最小值的测试,避免逻辑偏差(idea 断点处右键,可以设置条件的debug,例如i==0或i==最大值,只有满足条件,断点才生效)
4.单元测试
接口方法测试,mock请求测试,断言检查
5.白盒子测试
注意代码执行流程中的条件覆盖和语句覆盖(idea调试模式,ALT+F8打开调试窗口,可以通过执行代码修改变量等来检查逻辑)
6.隐性异常的考虑
例如请求第三方接口,请求超时等,调用方法中没有显性的异常抛出让调用方捕获处理的情况
7.接口响应时间控制
避免出现请求超时响应时间过慢的问题,能拆分接口就拆分,加缓存,调整设计等
5.数据库查询安全设计
1.数据库查询注意使用like模糊查询时,关键字携带_(下划线)造成的越权攻击.
例如部门权限控制,查询部门权限通过组织树的ID来查询,例如1.4.44来模糊匹配,如果ID允许用户输入,用户输入带下划线,则匹配就会匹配到其他权限的结果,例如1.4._4,就会匹配1.4.44,1.54等结果