【寻找自己】关于接口安全

做服务端开发也有7年的时间了,从开发-高级开发-技术经理-高级开发-?。重新做回程序员,尽管心里上难免有些不甘心,但是按照欲进先退的理念,我确定我的下一个方向是架构师。

今天谈谈对接口安全的浅略认识:

接口安全从两个方面分析下:

  • 性能安全
  • 数据安全

古人教导我们未雨绸缪,居安思危。做服务端开发更是如此,在以前传统的开发领域我们可能只会关心数据安全,不会考虑性能问题。但是在目前分布式、soa、微服务、高并发等互联网思维下,我们开始对我们的服务进行拆!拆!拆!拆的原因有很多:

  1. 共享服务:和共享代码一个道理,提高使用效率
  2. 服务解耦:各个团队负责自己的业务,使用者自己决定使用哪些服务,针对不同的服务可以有不同的技术方案
  3. ....

总体来说,就是高内聚,低耦合。

但是服务拆分后会产生一系列的问题等待解决,比如分布式事务问题。

性能安全:

出于各种原因,你的服务可能遇到性能问题,异常的网络攻击,人为的接口盗链、广告灌水,批量刷注册用户等!

所以从性能安全上可以有以下考虑:

  1. https:安全的网络协议,让内容不再明文线上。ios平台未来会强制使用https
  2. 接口签名:做基于privatekey的对称加密,可以把时间戳加进去参与签名,控制接口有效时间
  3. 基于网络层的屏蔽:1和2的思路还是不要让人去破解你的接口规则,防止通过参数篡改内容,但是如果是对于算法已经被破解,或者接口在有效期内的请求,我们应该做频率限制,目前可以用nginx+lua+redis自己写规则,也可以用nginx通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数
  4. 接口的幂等性:这个属于数据安全范畴,无论是客户端httpclient重试、dubbo rpc重试、还是分布式事务中业务自己需要重试,都会造成统一服务的多次调用。因为超时所以重试,然而超时不代表业务失败,A调用B的超时时间是10ms,但是B执行了11ms,对于A来说业务失败,而实际上B是成功执行的。所以B服务的实现需要是幂等的。那么问题来了:

什么是幂等性:我理解就是进行多次调用/执行,不影响结果的正确性。

那是不是所有的接口都要考虑幂等性,听起来好像和麻烦很可怕,那我们具体分析下:

  查询类服务:不用考虑幂等性,因为查询本身就是幂等的

  删除类服务:不用考虑幂等性,因为多次删除的结果一样

  更新累服务:update a="xxx"不需要,update a = a+1需要

  增加累服务:多次add要考虑幂等性

  组合操作服务:一个服务需要删除+增加,需要考虑

如何避免不幂等带来的问题?

  • add update 等操作不要设置重试(客户端不要重试,dubbo服务也可以设置是failfast的,...)
  • 分情况考虑:完全避免重试不可能,比如客户端提交注册信息,结果请求超时,但是最终还是插入到数据库了。但是对于客户端来说,应该提示用户进行重新提交。SO看情况了:必须保证幂等(数据唯一索引避免重复,其它业务逻辑);不考虑幂等(多次评论就多次评论吧,谁让你接口慢呢。服务端客户端开始互相撕逼了)
时间: 2024-10-15 21:36:16

【寻找自己】关于接口安全的相关文章

spring中一些aware接口

Spring中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.ServletContextAware等等,实现这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实现BeanFactoryAware的Bean在初始后,Spring容器将会注入BeanFactory的实例,而实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入 A

delphi 接口Interface

学习 delphi 接口 一切都是纸老虎!!! 第四章          接口 前不久,有位搞软件的朋友给我出了个谜语.谜面是“相亲”,让我猜一软件术语.我大约想了一分钟,猜 出谜底是“面向对象”.我觉得挺有趣,灵机一动想了一个谜语回敬他.谜面是“吻”,也让他猜一软件术 语.一分钟之后,他风趣地说:“你在面向你美丽的对象时,当然忍不住要和她接口!”.我们同时哈哈大 笑起来.谈笑间,似乎我们与自己的程序之间的感情又深了一层.对我们来说,软件就是生活. 第一节  接口的概念 “接口”一词的含义太广泛

无接口.NET代码的单元测试

最近工作上的活就是研究一下如何为一个历史代码工程添加单元测试,已经做完了,就想抛砖引玉和大家分享一下结果,听听大家的反馈. 该工程目前还是VS2010下的C#代码,虽然大量使用了继承,封装和多态,但对接口的应用非常少,所以基本上没办法用常见的Mock框架(如Moq, Rhino Mock,等)来写单元测试. 考虑下来,解决方案无非两种:一是重构现有代码,通过接口(interface)来实现依赖注入(Dependency Injection, DI);二是寻找无需通过接口直接支持虚拟实体类的Moc

delphi 接口

第四章          接口 前不久,有位搞软件的朋友给我出了个谜语.谜面是“相亲”,让我猜一软件术语.我大约想了一分钟,猜 出谜底是“面向对象”.我觉得挺有趣,灵机一动想了一个谜语回敬他.谜面是“吻”,也让他猜一软件术 语.一分钟之后,他风趣地说:“你在面向你美丽的对象时,当然忍不住要和她接口!”.我们同时哈哈大 笑起来.谈笑间,似乎我们与自己的程序之间的感情又深了一层.对我们来说,软件就是生活. 第一节  接口的概念 “接口”一词的含义太广泛,容易引起误解.我们在这里所说的接口,不是讨论程

(转)Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置MapperFactoryBean来生成Mapper接口的代理. 例如 <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInte

Python天气预报数据获取脚本

近来公司大屏幕的天气接口老是出问题,之前用的是webservice的http://www.webxml.com.cn/WebServices/WeatherWebService.asmx这个接口,坑的是每个月的25号该服务暂停维护,因此不得不寻找新的接口替换... 然后我在网站上找了很多接口(大都是过期的或者非免费的!)...类似 国家气象局提供的天气预报接口http://www.weather.com.cn/data/sk/101010100.html 2014年6月最新更新的http://w

MyBatis SpringMVC映射配置注意

applicationContext.xml中要配置 <!-- MyBatis 的 sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <pro

java static块详解

1. java static块执行时机 java static块在类被初始化的时候被执行. 参考<深入Java虚拟机>中的描述,一个java class的生命周期: 装载 通过类的全限定名,产生一个代表该类型的二进制数据流: 解析这个二进制数据流为方法区内的数据结构: 创建一个表示该类型的java.lang.Class的实例. 如果一个类装载器在预先装载的时遇到缺失或错误的class文件,它需要等到程序首次主动使用该类时才报告错误. 连接 验证,确认类型符合Java语言的语义,检查各个类之间的

Java类的装载过程和静态代码块

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.连接和初始化,其中连接又可以分成校验.准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:1.装载2.连接3.初始化 一.装载阶段 装载阶段由三个基本动作组成1.通过类型的完全限定名,产生一个代表该类型的二进制数据流2.解析这个二进制数据流为方法区内的内部数据结3.构创建一个表示该类型的java.lang.Class类的实例 另外如果一个类装载器在预先装载的时遇到缺失或错误的class文

Java类加载器ClassLoader总结

JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显式加载需要的类 类加载的动态性体现: 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是