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内的搜索次数:
查询次数写入session中,查询一次就+1,判断查询次数是否超过阈值。超过就报错:
措施三 限制查询速率:
通过将两次访问获得的时间戳相减获得间隔,如果时间间隔过短就报错:
0x05 总结
假装有总结...(逃