• 请不要在回答技术问题时复制粘贴 AI 生成的内容
caserest
V2EX  ›  程序员

怎么实现每天每个 ip 有且只能投一票的功能

  •  
  •   caserest · May 9, 2015 · 11172 views
    This topic created in 4198 days ago, the information mentioned may be changed or developed.

    我一朋友这么想 就是把每个投票的ip放到数据库中然后每天清理一下数据库实现每天只能投一票的功能。但是如何每天清理数据库呢?我觉得不靠谱,但是又想不到有什么其他好办法。

    75 replies  •  2016-06-30 17:15:15 +08:00
    hjc4869
    hjc4869
    May 9, 2015
    1
    将投票IP 投票时间存入数据库,投票的时候检查在投票当天是否有该IP的投票记录。
    imlonghao
    imlonghao
    May 9, 2015 via Android
    2
    您就不能存多一个时间的column么?
    liboyue
    liboyue
    May 9, 2015 via Android
    3
    不靠谱,用路由器的不得跪了
    shiny
    shiny
    PRO
    May 9, 2015
    4
    redis 设置过期时间
    giuem
    giuem
    May 9, 2015 via Android
    5
    移动宽带全省就几个ip。。
    ssacpklnm
    ssacpklnm
    May 9, 2015 via Android
    6
    @giuem 这个2333
    ob
    ob
    May 9, 2015 via Android
    7
    加验证码妥妥的
    zeyexe
    zeyexe
    May 9, 2015
    8
    设置cookies可能好一点,大部分人应该不知道cookies是什么
    hjc4869
    hjc4869
    May 9, 2015
    9
    @ob 验证码可以找几个大妈帮忙刷票,一个小时刷几千票没啥问题。。
    iyaozhen
    iyaozhen
    May 9, 2015 via Android
    10
    配个定时任务清呗
    cvmax
    cvmax
    May 9, 2015
    11
    @zeyexe 非得补一刀。挺好。
    billlee
    billlee
    May 9, 2015
    12
    配个 cron 任务就可以实现每天清理数据库
    leofml
    leofml
    May 9, 2015
    13
    redis ttl
    rtyurtyu
    rtyurtyu
    May 9, 2015
    14
    开一个4G的数组i,i[ip]==1;
    到点了就delete []i再开好了
    wolong
    wolong
    May 9, 2015
    15
    @zeyexe 碰到懂的人,写个程序挂机投,网速好不限制访问的话5秒一个应该不成问题。然后把程序多分给几个人挂。
    gdtv
    gdtv
    May 9, 2015
    16
    最靠谱的还是绑定微信,在微信里投票,一个微信号只能投一票
    shootsoft
    shootsoft
    May 9, 2015
    17
    强烈建议这种业务用redis处理。

    redis的key设置直接用 ip 就行,如果ip存在,就表示存在了。

    如果要限制每个IP/每天只能投一次,就每天凌晨用crontab的job清理一次redis。如果要限制每个IP,没24小时只能投放一次,就给redis的key设置一个过期时间为24小时。
    loveyu
    loveyu
    May 9, 2015
    18
    有个问题就是部分地区IP很少,类似移动之类的,很多人直接投不了
    em70
    em70
    May 9, 2015 via Android
    19
    首先不能纯IP限制,还要加上cookie,然后cookie值和IP,时间一起存到数据库。每次投票,在数据库查找12小时内的cookie值和IP记录是否与提交的信息有重复的,任一个重复都返回错误。

    如果非要在24点限制,就每次投票查找今天0点到现在时间内的IP或者cookie是否重复即可。

    不用考虑清空数据库,留下原始数据,还能人工K掉恶意投票。
    jarlyyn
    jarlyyn
    May 9, 2015
    20
    记录一下每个人最后一次投票时间。
    xiaozhizhu1997
    xiaozhizhu1997
    May 9, 2015
    21
    现在NAT盛行...采用cookies似乎更合适。
    ys0290
    ys0290
    May 9, 2015 via iPhone
    22
    cookie过滤一遍,剩下的放服务器过滤
    xjdrew
    xjdrew
    May 9, 2015 via Android
    23
    @shootsoft 思路正确。不过不需要crontab清理。redis自带expire,用来做这种定期cookie的
    laoyuan
    laoyuan
    May 9, 2015
    24
    md5(ip.date(Ymd, time())
    kslr
    kslr
    May 9, 2015 via Android
    25
    话说那些自动失效的,加个投票时间戳不就行了
    reeco
    reeco
    May 9, 2015 via iPhone
    26
    大多数数据库支持事件的,不需要cron
    issues
    issues
    May 9, 2015❤️1
    27
    ip 不行 拨号用户可以重新拨号获取新ip, 当然cookie也不行,本地cookie可以删除。mac地址,当然要想真想搞刷票, mac也貌似也可以伪造。
    issues
    issues
    May 9, 2015
    28
    想要真正实现这样的不能刷票是很难的, 只有提升这种刷票的难度。难度大了,自然会放弃。
    luw2007
    luw2007
    May 9, 2015
    29
    每个登录用户只能投一票。
    可以使用openauth接入qq,weibo的账户
    wusuopuBUPT
    wusuopuBUPT
    May 9, 2015
    30
    zyue
    zyue
    May 9, 2015
    31
    redis 妥妥的
    gladuo
    gladuo
    May 9, 2015
    32
    面向普通人就cookies~

    程序员投票还是微信吧~
    xiaowangge
    xiaowangge
    May 9, 2015 via Android
    33
    腾讯CMem 设置过期时间。
    lwch
    lwch
    May 9, 2015
    34
    redis有条命令叫setex

    http://cxx.party就是这么实现的。。
    hello2t
    hello2t
    May 10, 2015
    35
    redis存,key value 就好了,定时清理
    zonghua
    zonghua
    May 10, 2015 via iPhone
    36
    实名认证的登录
    flowerwrong
    flowerwrong
    May 10, 2015 via Android
    37
    @gdtv 淘宝分分钟刷哭你。
    flowerwrong
    flowerwrong
    May 10, 2015 via Android
    38
    TTL靠谱,最好配合cookie
    Septembers
    Septembers
    May 10, 2015 via Android
    39
    @em70
    跟QQ OAuth绑到一起会更靠谱一些
    一个QQ有效票数只能一次之类的
    毕竟大规模注册QQ刷票是比较不现实的
    如果基于IP的话去阿里云开1000个最低配的VPS一小时加高匿代理 不就一下刷起来了
    crab
    crab
    May 10, 2015❤️1
    40
    还是得靠验证码。
    另外票数可以不公开,结束后才公开。想刷票的也没调试环境。
    mornlight
    mornlight
    May 10, 2015
    41
    @issues MAC地址不行,服务器拿不到的。
    sing1ee
    sing1ee
    May 10, 2015
    42
    只考虑问题本身,一圈儿看下来,redis的方案最靠谱儿。
    issues
    issues
    May 10, 2015
    43
    @mornlight 这个是通过js获取,作为参数传入是可以的
    yaoyuan1072
    yaoyuan1072
    May 10, 2015 via Android
    44
    前几天正在研究这个问题,如何获得内网的IP呢?因为有时候一个公司几百号人就一个IP。。。
    gamexg
    gamexg
    May 10, 2015
    45
    @yaoyuan1072 获得内网IP
    /t/167354
    zhicheng
    zhicheng
    May 10, 2015 via Android
    46
    @issues 我真的特别有兴趣知道,你是如何用 JS 获取 Mac 地址的。还是你只是瞎说的。
    can
    can
    May 10, 2015
    47
    基本就是楼上回复的这些了,微信绑定,IP,cookie,验证码。想防刷票的关键是看你代码怎么写了,写的好的话就能挡得住。建议楼主乌云搜索刷票,我还是想说句来回这点事,关键看你代码怎么写了。
    issues
    issues
    May 10, 2015
    48
    @zhicheng
    ActivieX实现的。
    当然这个肯定有局限性的,只对windows系统ie浏览器。
    要想跨平台,就用Applet。
    solu
    solu
    May 10, 2015
    49
    @issues 同楼上,对JS获取MAC地址很感兴趣,求教!
    solu
    solu
    May 10, 2015
    50
    @issues 囧,没刷新,现在才看到你的方法。ActiveX局限性太大了。
    flynaj
    flynaj
    May 10, 2015
    51
    这样都没用.要防止作弊就是一个用户只能投一次!
    flowerwrong
    flowerwrong
    May 10, 2015 via Android
    52
    @flynaj 这样也没用,可以刷单。
    s51431980
    s51431980
    May 10, 2015
    53
    只要在客户端,就有作弊的可能,cookie、验证码最终都敌不过廉价的人力成本
    caserest
    caserest
    OP
    May 10, 2015 via Android
    54
    谢谢各位大神
    handleyan
    handleyan
    May 10, 2015
    55
    1、要想识别一台机器的话,可以尝试使用一下cavas,即通过画cavas然后md5来唯一标识一台机器,据说能保证唯一性,我没试过,楼主试过如果有效了可以分享一下
    2、在有了唯一标识之后,要想限制一天一次,如果非要用数据库,可以用乐观锁,一条update语句就行了,不过如何暴露地使用数据库在并发比较大情况下是不建议的,除非你准备搞个分布式数据库,这样成功也大了。最好是使用上面很多人提到memcached、reids等分布式内存式的存储工具,这些工具一般也都有乐观锁的实现。
    quix
    quix
    May 10, 2015❤️1
    56
    @handleyan 主意拼写哈。。一段里错了好多个。。 有拼写强迫症的看不下去了
    handleyan
    handleyan
    May 10, 2015 via iPhone
    57
    @quix 现在的英文听说读写只剩读还行了…以后发帖前一定用拼写软件看看,丢不起这人呐…
    powergx
    powergx
    May 10, 2015
    58
    加验证码,要么用第三方账号
    世界上有代理服务器,还有肉鸡,刷票是挡不住的
    frankzeng
    frankzeng
    May 10, 2015
    59
    用微信关注吧,关注了拿openid去查一下,应该能确保真实
    flowerwrong
    flowerwrong
    May 11, 2015 via Android
    60
    @powergx 我也觉得挡不住,正为微信刷票而烦恼。
    flowerwrong
    flowerwrong
    May 11, 2015 via Android
    61
    @frankzeng nonono,淘宝一下,一堆商家
    ryd994
    ryd994
    May 11, 2015 via Android
    62
    @handleyan 不需要上锁,多一票少一票不怕的
    jakehu
    jakehu
    May 11, 2015
    63
    我以前做的是写入数据库,每次写入前都清楚一个小时之前的
    FastMem
    FastMem
    May 11, 2015
    64
    数据表
    id,ip_address,date
    1,123,123,123,123,time
    然后每次投票检查日期呗。。
    ryd994
    ryd994
    May 11, 2015 via Android
    65
    @FastMem IP直接转换成32位整数,性能还更好
    FastMem
    FastMem
    May 11, 2015
    66
    @ryd994 soga。受教
    donghouhe
    donghouhe
    May 11, 2015
    67
    看到说用cookie区分的,哎呀,太贴心了,代理都不用挂了!刷票代码写起来太方便了!
    millken
    millken
    May 11, 2015
    68
    sun019
    sun019
    May 11, 2015 via Android
    69
    只有注册用户才能投!!!其他的都是浮云,被投票搞翻过几次服务器的路过!
    shepherd
    shepherd
    May 11, 2015
    70
    搞个手机验证码?或者直接用手机投票
    miao1007
    miao1007
    May 11, 2015
    71
    用微信,妥妥的。
    yanze0613
    yanze0613
    May 11, 2015
    72
    每天重建一张表,投票的时候记录ip丢进去,第二天换个表
    数据库自动方便可以用作业或者shell
    66beta
    66beta
    May 11, 2015
    73
    注册登录吧,不管是自己做,还是接入第三方
    roychan
    roychan
    May 22, 2015
    74
    如果面对的客户大部分是小白的话,完全可以在 Session 里加一个 waterproof 给个值为1,每次收到请求判断 session 里有没有这个 key。然后 24 小时过期就行了,很节省资源。
    Wichna
    Wichna
    Jun 30, 2016
    75
    @millken 这个换一个浏览器就不一样了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2236 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 115ms · UTC 16:11 · PVG 00:11 · LAX 08:11 · JFK 11:11
    ♥ Do have faith in what you're doing.