一种基于token认证的API防爆破解决方案

/ 0评 / 0

0x01 前言

最近一直忙于API开发,各种判断各种过滤,让人头都大了,恍悟后端并不比前端简单。同时又因为自己对web安全颇有兴趣,自然而然的就会从安全方面审视自己的代码,所以就有了这篇文章。

措施一:token认证

服务器定时生成token保存到数据库中,用户调用api的时候需要输入token,服务器再把用户输入的token和数据库中的进行比对,如果正确再进行下一步,否则就拒绝服务:

每次生成的token都是随机的,进行token认证的目的就是确保由服务器发起的API请求可以先查询数据库取出此刻可用的token进行正常查询,而恶意攻击者无法在短时间内重复使用一个数据包进行爆破。

随时只是个很简单的校验,但是其中还有几个关键问题要解决

服务器如何生成token:

token生成是随机字符的拼接,服务器访问一次就执行一次token的生成和数据库写入:

但是这个php网页只能由服务器访问,所以就需要把它放到一个目录下,并在Nginx中配置这个目录的访问控制:

这就绝对安全了吗?并不,因为Nginx的访问控制功能基于其自带的http_access_module模块,而该模块的局限性就在于它是基于HTTP头中的remote_addr变量来获得用户IP的,如果恶意的攻击者修改了http标头的remote_addr或者使用代理还是可以达到成功访问的目的。

所以就考虑全面一点,取得真实ip:

或者再严格一点:

最后将配置中的IP与得到的真实IP进行比对。

如何实现服务器定时访问:

可以使用宝塔面板的定时任务:


也可以使用crontab命令定时任务。

服务器进行token认证:

代码实现是使用SQL中的DESC LIMIT 1限定只查询表中的最后一行来取得服务器上的token,然后与用户输入的进行比对:

数据库中的token数量超过阈值时需要自动删除:

措施二 限制一次session内的搜索次数:

此图像的alt属性为空;文件名为image-42.png

查询次数写入session中,查询一次就+1,判断查询次数是否超过阈值。超过就报错:

此图像的alt属性为空;文件名为image-38.png

措施三 限制查询速率:

通过将两次访问获得的时间戳相减获得间隔,如果时间间隔过短就报错:

0x05 总结

假装有总结...(逃

发表评论

邮箱地址不会被公开。 必填项已用*标注