V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
evakiss
V2EX  ›  程序员

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

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

    然后同样的前端也做套频率限制 到了 30 就去取验证码
    odirus
        5
    odirus  
       2016-01-27 09:45:14 +08:00
    选择正确的工具,推荐 redis+lua 脚本实现, redis 中 expire + incr 都是现成的, lua 使用正确的话能够保证原子性操作。
    sherlocktheplant
        6
    sherlocktheplant  
       2016-01-27 09:47:18 +08:00
    @odirus 对 这个用 redis 做很方便
    不过如果服务规模不大 单台服务器的话 自己用个线程安全的 hashmap 也可以 部署比较省事
    g5tf87
        7
    g5tf87  
       2016-01-27 10:21:28 +08:00
    3 楼正解, 令牌桶算法是网络限流的经典算法,RFC 推荐.
    vuuv
        8
    vuuv  
       2016-01-27 20:33:58 +08:00 via Android
    确保每秒钟只能发送一条消息即可。还可以简化数据库里的时间粒度。
    firefox12
        9
    firefox12  
       2016-01-27 23:07:34 +08:00 via iPhone
    服务器端不保留用户信息吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2863 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:56 · PVG 22:56 · LAX 06:56 · JFK 09:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.