网站的在线聊天功能,如何实现频繁发布数据显示验证码功能?

2016-01-27 08:51:52 +08:00
 evakiss
一个类似于 WebQQ 的在线聊天工具,因为数据传输接口通过抓包很容易被发现,担心别有用心的人找到数据传输的接口了后,不停 post 信息,我初步构想是,用户在 1 分钟内发布了 30 条信息,则弹出验证码,但是苦思冥想很久不知道这种应该怎么实现,用 cookie 保存用户发信息的时间戳然后后端计算平均值?这方法很容易被破解,用 MySQL 保存发信时间?这个数据库会很庞大,求 V 友有没有好点解决方案?不胜感激
3066 次点击
所在节点    程序员
9 条回复
DT27
2016-01-27 09:01:55 +08:00
很奇怪在线聊天工具不记录发信时间。。。
JulyXing
2016-01-27 09:15:16 +08:00
我的思路是在数据表中通过发信时间来比较前后时间,如果防止别人恶意请求接口可以在服务器设置。
virusdefender
2016-01-27 09:31:45 +08:00
sherlocktheplant
2016-01-27 09:38:51 +08:00
根据 IP 和用户 ID 分别记录每次发送消息的时间
收到发送消息的请求时计算 1 分钟内发消息的次数 如果 IP 或者用户 id 任意一个键对应的次数超过 30 就返回发送失败 并要求验证码

然后同样的前端也做套频率限制 到了 30 就去取验证码
odirus
2016-01-27 09:45:14 +08:00
选择正确的工具,推荐 redis+lua 脚本实现, redis 中 expire + incr 都是现成的, lua 使用正确的话能够保证原子性操作。
sherlocktheplant
2016-01-27 09:47:18 +08:00
@odirus 对 这个用 redis 做很方便
不过如果服务规模不大 单台服务器的话 自己用个线程安全的 hashmap 也可以 部署比较省事
g5tf87
2016-01-27 10:21:28 +08:00
3 楼正解, 令牌桶算法是网络限流的经典算法,RFC 推荐.
vuuv
2016-01-27 20:33:58 +08:00
确保每秒钟只能发送一条消息即可。还可以简化数据库里的时间粒度。
firefox12
2016-01-27 23:07:34 +08:00
服务器端不保留用户信息吗?

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

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

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

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

© 2021 V2EX