一个接口,浏览器每请求 100 次,弹出一次验证码,要求服务器端不记录浏览器对应 ip 的请求次数,该怎么实现?

2019-12-27 09:11:19 +08:00
 kisshere

如果通过服务器端记录客户端对应 ip 的请求次数,数据库会撑爆的,如何从验证客户端浏览器提供的数据下手,让这个接口,浏览器每请求 100 次,就弹出一次验证码?

$_COOKIE['requestCount']=$_COOKIE['requestCount']+1;
if($_COOKIE['requestCount']>100){show_captcha();}//这种逻辑就算了哈,小学生都能修改 cookie 破解
8784 次点击
所在节点    程序员
89 条回复
nianyu
2019-12-27 09:16:02 +08:00
你 又想安全 又要完全从客户端入手.办不到啊
fancy111
2019-12-27 09:17:07 +08:00
你都说了验证客户端浏览器,那就 cookie 计数加密一下咯。
或者 localStorage 什么的,反正存客户端嘛。
但是有什么用?客户端随时可以清空的,你的计数不可能完全保存在客户端。
kisshere
2019-12-27 09:19:21 +08:00
@fancy111 第一次请求就显示验证码,这个也可以接受,即用户清空 cookie,就显示验证码
sagaxu
2019-12-27 09:19:47 +08:00
random
lhx2008
2019-12-27 09:20:20 +08:00
数据库会存爆?每天清就行了,你想存爆挺难的。
qinxg
2019-12-27 09:21:08 +08:00
放内存里啊
phpdever
2019-12-27 09:21:14 +08:00
你的目的是防止客户端对接口滥用,解决思路应该是从后端角度处理

怕数据库撑爆,可以用 Redis,简单点的,用计数器法就可以实现限流
cominghome
2019-12-27 09:21:16 +08:00
如果通过服务器端记录客户端对应 ip 的请求次数,数据库会撑爆的

1. 这个数据量,其实没你想的大
2. 为什么要放数据库? memcached 不好用还是 redis 不香?
kisshere
2019-12-27 09:23:27 +08:00
@cominghome
@phpdever
@lhx2008 用户用代理池来爬接口,数据库很可能冒烟
annielong
2019-12-27 09:25:37 +08:00
服务端返回数据的时候加一个 100 递减的参数,客户端请求数据时候必须带这个参数,
virusdefender
2019-12-27 09:28:37 +08:00
cookie 加密一下,虽然也不能根本性的解决这个问题
zhenhuaYang
2019-12-27 09:29:55 +08:00
redis 的 incr 命令不香吗?
lower
2019-12-27 09:30:21 +08:00
感觉你的 100 次限制,可能设置成在某个时间段里的限制,会不会好处理一些,比如是每天或者每个小时。
服务端随便记录,时间一到,缓存自动失效或者定时清数据库。
kisshere
2019-12-27 09:30:55 +08:00
@virusdefender cookie 可逆式加密也不能解决问题,用户每次携带同样的加密 cookie 给服务器端,服务器端每次都判断请求次数<100 而放行通过
kisshere
2019-12-27 09:32:57 +08:00
@lower 我目前也是这么想的,只能通过失效时间上解决问题,而不能在请求次数上做文章,所以看看有没有 V 站大佬能通过客户端请求次数想个好办法
lhx2008
2019-12-27 09:36:18 +08:00
@kisshere 我说的数据库是内存数据库,冒不了烟,TPS 随便都是几万的,你如果不把 IP ban 掉,网站还早挂了
zzzmh
2019-12-27 09:36:36 +08:00
要么前端解决要么后端解决
前端解决肯定不是绝对 100%安全,只能说相对来说压缩加密的 js 不容易调试和被改。推荐你了解一下 Fingerprintjs2
后端用 nginx + lua 貌似可以,但我没写过类似的,只在论坛见过
wwcxjun
2019-12-27 09:44:41 +08:00
Redis + 1,最简单的是使用 IP 作为 key,值就是请求次数, 判断值到一百就弹验证码,验证完了清空值就好了. Redis 不用考虑会撑爆了吧... 还是怕的话 可以加个失效时间
chendy
2019-12-27 09:53:56 +08:00
这种需求一定是服务端做,别人真想搞你的话客户端就是给人看接口的,不想搞你客户端做一堆防护也没用
另外如果有必要的话就直接在业务上做限制,比如未登录用户只能看一点数据,登陆了可以看多一些,充值了随便看之类的
alphatoad
2019-12-27 09:56:51 +08:00
这个问题可以近似为弹出验证码的几率是 1%
然后就不用说了吧(狗头

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX