一个接口,浏览器每请求 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 破解
9012 次点击
所在节点    程序员
89 条回复
zmqking
2019-12-27 14:11:44 +08:00
Fingerprint.js 了解下。
mconvert
2019-12-27 14:11:53 +08:00
首先理解不了为啥会撑爆,第二就算存数据库不行,redis 存总也可以吧,key 是 ip,value 是 count
no1xsyzy
2019-12-27 14:12:27 +08:00
@optional 我刚想说有办法,结果发现是我看错 “不存任何东西” 看成了 “不存在任何东西”(尴尬
janxin
2019-12-27 14:16:41 +08:00
好奇你有多少 ip 访问,还能撑爆
sessionreckon
2019-12-27 14:18:25 +08:00
@Sunyanzi +1
Cookie 里存下 counter + 时间戳 + 校验码就好了,类似 JWT 的验证流程
Server 校验正确,每次操作增加 counter...
这种方式不用 server 的缓存支持.减小出错可能性
binux
2019-12-27 14:23:50 +08:00
@Sunyanzi #31 不能挨重放,全靠客户端自律,和裸奔没区别。
nonce 有不依赖服务器存储的实现方法?
crab
2019-12-27 14:25:13 +08:00
把 IP 时间次数记录到 url 请求参数里面,加密签名。
wangyzj
2019-12-27 14:26:15 +08:00
Sunyanzi
2019-12-27 14:28:51 +08:00
@binux 「不严谨要求不能挨重放」 ... 双重否定 ... 可能是我措辞的问题比较容易看错 ...

如果严谨要求不能挨重放的话只能服务端存 nonce ... 然后定期清理 ...
yuansc
2019-12-27 14:32:35 +08:00
多大数据量呀,,,DB 存不了,LRU Cache + 过期时间呗
outerws
2019-12-27 14:33:10 +08:00
百度之类的防这种也不过是 cookie 带验证并借每几分钟更换一次 cookie 验证码防止跑接口?
zsdroid
2019-12-27 14:39:23 +08:00
binux
2019-12-27 14:39:32 +08:00
@Sunyanzi #47 「不严谨要求不能挨重放」 我的理解是「不严谨要求」下「不能挨重放」是可选项。
而且如果存 nonce 我不觉得会比存 IP 少啊。。
Sunyanzi
2019-12-27 14:56:05 +08:00
@binux 我描述的「不严谨要求不能挨重放」含义全等于「可以在有限范围内挨一些重放」 ...

在这种情况下 ... nonce 不必需 ... 只要有 timestamp 控制 TTL 就好 ...

如果要做请求唯一必须有 nonce 这个跑不了 ... 以及存 nonce 和存 IP 最核心的区别是含义不同 ...

在存储层面 ... IP 是持久化存储 ... 除非有其他规则指定 IP 访问次数的清空规则 ... 否则就是增长慢总量大 ...

nonce 是瞬时存储 ... 存 nonce 产生的数据会远超存 IP 的量 ... 但超时一般很短 ... 最多一小时就全清空了 ...
lscho
2019-12-27 15:00:41 +08:00
数据库会爆?全中国所有人都来访问你的接口,数据库也爆不了。。。。
stevenkang
2019-12-27 15:06:16 +08:00
如果通过服务器端记录客户端对应 ip 的请求次数,数据库会撑爆的
>>>
全球所有的 IPv4 加起来 42 亿个,全球总人口 70 多亿。

到底是 70 多亿用户都来访问导致数据库跟不上呢,还是拥有 70 多亿用户的平台还搭建不出来支持 42 亿条记录的数据库?
binux
2019-12-27 15:13:19 +08:00
@Sunyanzi #52 LZ 问题是,每请求 100 次,弹出一次验证码。并没有时间限制,所以 once 也要一直存着。
如果有时间限制,那一小时清一次 IP 也没问题啊。
所以我说存哪个都差不多。
maichael
2019-12-27 15:19:40 +08:00
@zmqking #40 fingerprint 也需要记下来,其实本质上和记 ip 没区别。
zmqking
2019-12-27 15:23:50 +08:00
@maichael 楼主已经说明是 IP 了,可能是出于安全问题还是怎么的。但这个不记录 IP。只是一个类似 token 的东西!理论上比判断 IP 更加准确,是从多个维度来计算得出的一个值!
zhttty
2019-12-27 15:33:52 +08:00
哪有那么麻烦:
1、客户端存加密 cookie ;
2、cookie 包含验证字段、UTC 时间戳、浏览次数、浏览器的一些识别信息、IP 信息(可选)等等;
3、没有 cookie、cookie 无效、次数超标都弹验证码。

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

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

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

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

© 2021 V2EX