我是新来的后台,从来没有工作过。
我想添加到我的应用程序身份验证系统:客户端向服务器请求唯一ID,服务器生成大约5-6个符号的ID并将其返回给客户端。用户可以使用此ID,以便其他人可以通过它找到他的设备。经过一段延迟(如几个小时)后,服务器删除唯一ID,因此客户端必须请求另一个ID才能继续使用服务器服务。
对于我的应用程序来说,这应该是一种舒适的方式-没有任何oauth系统。但如果有人想改变客户端代码,让同一个客户端向服务器发送数千个请求,为它创建唯一的ID,那该怎么办?这听起来对服务器的数据库非常不安全,它可能会被同一个设备的假ID填充。
我的问题是-是否有可能使创建ID的请求更安全,就像服务器检查,如果正是这个用户已经要求ID之前拒绝这个请求?也许我可以检查像客户端IP / MAC地址或其他东西?什么是模拟问题的最佳实践?
更详细的内容,我用的是Spring,Android SDK,Retrofit。抱歉,我不是英语母语。
1条答案
按热度按时间htzpubme1#
基本上,您是在询问是否有一种方法可以让服务器以一种有效的方式(总是或大多数时候)识别客户端的计算机。
答:不,没有办法。
你能得到的最好的是你能从
Socket
对象、HTTPRequest
对象或其他对象中得到的(假定的)客户端IP地址。例如,如果客户端是通过代理或NAT服务器或Tor / Onion路由器连接的,那么IP地址将是它的IP地址。那么解决方案是什么呢?
没有什么能阻止所有形式的虐待,但这里有一些想法可能会有所帮助:
1.您可以简单地引入一个延迟;例如,在响应每个令牌请求之前等待(比如)5秒。这将限制单个客户机每分钟(比如)12个令牌,这应该会减少数据库条目的数量。(但这也有缺点,DDOSer可以利用这一点来获得优势。)
1.基于(观察到的)客户端IP地址的速率限制;例如,如果您在一分钟内看到10个令牌请求,则忽略来自该IP的所有进一步请求10分钟。
1.将数据库条目保留较短的时间。
1.只要使用一个更大的数据库。如果你有千兆字节的数据库存储空间,每秒数百或数千个令牌并不算多。特别是如果你正在删除旧条目。