关于防止微信投票刷票行为的一些思考


背景介绍


微信投票在这几年一直很热门,只要是个活动往往都做一个投票的功能。刷票已形成了一个庞大的产业链但如何防止刷票行为就很让人头疼了。首先要清楚微信的刷票行为,微信投票是根据openid来判断一个用户是否已投过票。

openid是加密后的微信号,每个用户对每个公众号的openid是唯一的。

这个判断依据有较大的漏洞,就是只能判断openid是否重复,但无法校验openid是不是真实的。而且就算openid是真实的,刷票软件也有批量的正确openid。刷票软件就是通过使用HttpClient等类似客户端发包,把openid和投票信息post至服务器。由于刷票软件动态伪装ip,拥有大量openid,很容易就在没有完善防刷的应用投大量的票。


几种防止刷票的方法


1、只有关注了公众号才能投票


在服务调用获取用户基础信息的API

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

access_token是全局调用凭证

接口会返回以下数据

{
    "subscribe": 1,        // 1为关注  0为未关注
    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 
    "nickname": "Band", 
    "sex": 1, 
    "language": "zh_CN", 
    "city": "广州", 
    "province": "广东", 
    "country": "中国", 
    "headimgurl": , 
   "subscribe_time": 1382694957,
   "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
   "remark": "",
   "groupid": 0
}

当用户投票且未关注时,我们可根据subscribe是0还是1判断有没有关注,若没有关注则转至公众号的二维码页面并提示用户先长按二维码关注公众号。此方法的缺点就是每次投票都要与微信服务器进行交互。


2、判断refer和User-Agent


以下为一个request header的部分参数示例:

Host:
localhost:8080
Origin:
http://localhost:8080
Pragma:
no-cache
Referer:
http://www.example.com/vote.jsp
User-Agent:
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) 
Mobile/13A452 MicroMessenger/6.2.3 NetType/WIFI Language/zh_CN
X-Requested-With:
XMLHttpRequest

Referer为上一个访问的页面,所以refer必须要为投票的页面地址。
User-Agent里面必须有关键词MicroMessenger


3、限制客户端投票次数


    用ip当成同一个ip投票次数受限制,由于很多时候使用nginx或apache之类的代理服务器,因此直接使用HttpServletRequest的getRemoteAddr()很多时候取得的是代理服务器的ip,而我们要取得的是真实的ip址。

下面是一个获取真实ip的示例代码

 public String getIpAddr() {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("CLIENTIP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

很多刷票软件都使用ip代理池,所以ip限制只能一部分刷票行为。


4、当投票量大于阅读量时就是刷票行为


存储页面阅读量,投票完成后,计算票数若投票量大于阅读量时就是刷票行为。


5、在提交表单数据的地方使用校验码


服务端返回一个校验码,在dom初始化的时候页面使用js加密这个校验码,commit的时候提交这个加密的校验码,服务端再判断这个加密码的校验码是否正确。校验码设置使用N次后就作废。
以下为伪代码:

  • jsp页面
<%=request.setAttribute("_check_code_", UUID.randomUUID())%>;
var _check_code_salt_  = "gx=**&^%%$$###@#$---eeax221";
$(function(){
    var _check_code = '<%=request.getAttribute("_check_code_")%>';
});
$.ajax({
    url: "http://www.example.com/vote.do",
    params: { checkCode:  md5(_check_code + _check_code_salt_ ), openid: OPENID },
    type:"post",
    success:function() {

    }
});
  • 服务端处理
String checkCodeSalt = "gx=**&^%%$$###@#$---eeax221";
String serverCode = MD5.get((String) request.getAttribute("_check_code_") + checkCodeSalt);
String pageCode = (String) request.getAttribute("checkCode");
if (serverCode.equals(pageCode)) {
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json; charset=utf-8");
    PrintWriter out = null;
    out = response.getWriter();
    out.append("{errorCode:'1'}");
    return;
} else {
    doSomething();
}

注:加一个加密的过程是为了让使用HttpClient的模拟访问行为变的更困难


以上的方法可结合项目的实际情况组合使用,五项组合起来使用基本上能杜绝大部分的刷票行为。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
支持pc版、触屏版,自动、被动、无感知登录!!电脑版、触屏版同步登录 支持三方平台的多网页授权域名,一个公众号为多域名授权,一个公众号给多个网站使用。 可任意选两种流程:流程1:自动注册登录;流程2:注册时可以修改用户名、选择是否绑定。 微信秒登!支持电脑、手机触屏版微信登录网站。 无需绑定URL和Token,可以和任何DZ插件、模版兼容使用! 如站长没有认证服务号,请购买后与我们索取配置文档。 QQ秒登!免去完善信息的步骤。QQ登录网站,无需绑定已有账号!自动注册并登录。(此功能需要先开启QQ互联才可以) 可与其他pc模版、手机模版兼容一起使用。可替换手机版登录页面。 支持pc端自动/手动绑定,手机端自动/手动绑定。 无需申请QQ平台接入,零门槛。 QQ登录后可以自动获得:用户名、头像、生日、性别。微信登录可以得到微信名,头像等。 手机版登录页面:支持背景图(可随机),背景色,圆角,按钮颜色、文字,注册链接颜色、文字,透明度等。自动判断所处环境,展示不同的登录按钮。 本插件无需开通微社区。 预览地址:【西瓜】微信登录预览 小云APP打通版说明: 如未使用安米app/小云app请安装普通版本。 支持一个微信号登录电脑板、触屏版、小云app版,仅生成一个帐号,微信登录后是同一个帐号!完全互通。 在小云app使用微信登录的用户,用同样的微信号登录pc,触屏版,可以直接登录,不会生成新帐号。 在pc、触屏版使用微信登录的用户,用同样的微信号登录小云app,可以直接登录,不会生成新帐号。 精品应用推荐 【西瓜】积分充值 微信支付、支付宝支付 【西瓜】微信登录 微信登录、QQ登录 【西瓜】收费看贴 收费查看帖子,支持微信支付和支付宝,为论坛变现! 【西瓜】打赏商户版 站长可以拿提成的微信支付打赏 【西瓜】微信打赏 无需开通支付也可以现金打赏 【西瓜】微信版式 让手机版变成公众号的样子 【西瓜】积分商城 竞猜、竞拍、兑换、抽奖、任意购 【西瓜】微信投票 支持服务号、订阅号 【西瓜】发帖选板块 多样式选板块发帖 【西瓜】引导关注 引导关注、引导登录、引导下载APP 【西瓜】微社区认证 申请、展示认证 【西瓜】微社区活动 自动登录发布活动报名微活动 【西瓜】微社区 114 商家114加V创收利器 【西瓜】微社区门户 卡片式制作无限页面微社区门户 【西瓜】微社区文章 漂亮的文章页面,强大的分享、评论、页面展现 【西瓜】微社区美化 微社区必备美化 【西瓜】微首页聚合 微社区首页显示所有版块帖子 【西瓜】微社区导航 微社区33+6风格导航 【西瓜】微社区搜索 微社区搜索 【西瓜】微社区气泡 微社区发帖气泡 【西瓜】微社区会员 微社区修改用户名,资料 【西瓜】微社区广告 微社区10广告位利器 【西瓜】微社区签到 微社区动感签到 【西瓜】微社区 N格 微社区15栏目N格 【西瓜】微社区表态 微社区6风格表态 【西瓜】微社区版块 微社区清新版块|公告|热版 【西瓜】微社区分享 微社区社会化分享 【西瓜】微社区翻页 微社区6风格翻页上下篇内容美化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值