关于接口的安全设计一直是业界比较关心的一个问题,对于公共类的接口还好一些,一般很少去校验数据的真伪和用户是否是真实的。对于公共类的接口一般需要考虑多人、高频调用时服务器的承载能力。菠菜园也在博客中开放了一些简单的数据接口来方便其他人来使用而无需关心这些接口背后的程序逻辑。
当然菠菜园只是一个个人小站,所以对于大流量的攻击明显是无法应对的。所以也希望朋友们在使用免费接口的时候按需调用,如果频次过高造成服务器无法承载的时候,那波波就只好关闭这些为大家提供方便的接口了。
今天想谈的内容除了接口对于大流量、高频次的调用场景应对外,主要还是讲下如何防止私有数据接口被恶意调用的解决方案。其中大家在网上问的较多的一个问题就是如何防止短信接口被恶意调用。我们知道短信接口不仅关系着用户业务场景的使用,也关系着项目的运营成本,如果被恶意利用,那么不仅会给企业造成一定的经济损失,也会给企业带来名誉上的损失。
短信接口的业务场景模型图:
上图波波画除了一般互联网项目的模型图,如果业务一就是我们设计的短信接口,那么如何在业务二、业务三......业务N上方便而安全的使用呢?
第一种解决方法:将短信发送业务根据不同的业务场景进行二次封装,放在公共模块中,在其他业务场景需要时,再在相应的业务场景中验证用户后再调用短信的发送方法。这是一种很多人都在用的,相对来讲这种方法不属于公共接口设计,安全性则根据每一个业务层的判断逻辑决定。
第二种解决方法:将短信发送做成通用接口,然后其他业务层则不需要关心安全问题,只需要在使用短信的时候调用接口进行,方便平台的扩展,易用性很高。这也是波波本篇的重点。
将系统内用户进行归类。大体上可已划分为注册用户和未注册用户。那么在未注册用户的界面如果需要调用短信接口,那么我们只要求调用短信时除了提交发送短信的手机号,业务场景,发送内容(可有可无,我之前做项目中一般都是验证码,所以发送的内容全部集成到短信接口中自动生成而不需要具体的业务层提交发送的验证码内容),最重要的是ip地址。
在业务层首先要获取用户的IP地址,然后判断基于IP地址的Session信息是否存在,如果存在则在业务层无需任何操作,如果不存在则将此次IP的会话时间、ip地址、短信接口调用次数(一般为0)等你需要的信息写入Session中。然后在短信接口那里根据业务场景编码,找到提交IP对应的Session信息。然后决定是否执行短信的发送操作。
这样做的好处是用户每次调用该场景下的短信发送接口时,需要建立会话。可以在很大程度上避免简单的接口POST数据提交。
那么对于已注册的用户相对来讲接口的安全性会好做很多,因为这种业务场景下一般都能拿到用户的数据,那么可以控制用户短信的发送频率和最高条数限制。为了接口易用,一般只需要用户提交token和手机号码即可。
当然了如果采用token验证的做法来校验是否是真实用户操作的话,那么token的安全也是至关重要的,尤其是要保证token不被恶意利用。我通常的做法是让这种场景下业务调用接口时上传一个用户的ID,一个经过加密的token,然后在接口中对加密过的token进行二次认证来确保用户信息的安全。
当然任何加密都有被解密的可能,所以一种业务场景下的加密数据尽可能在保障用户良好体验的同时尽快的失效,这个时候即使被破解了,也已经是过期的token了。
如果为了更好的安全体验,波波也建议大家将网站或系统数据通过SSL加密传输,来防止中间人攻击。以上只是波波在项目中关于接口安全的一些思考和实践,可能并不见得高明,如果您有更好的方式来提升接口的安全性,也欢迎在文章下方留言讨论。