前言:

防止“刷票”不可能有一个完美的方式,也不可能有一个长久的方式。如何防止刷票关键在于如何“蒙蔽用户”,让他不知道你的限制规则,再加上合理增加投票的难度和成本开销,这样可以减少刷票的产生。多限制方案下手多管其下也许能达到比较好的效果。

我们防刷票的目标就是:让“刷票”的成本大于其获得的利益

那么本篇文章就先介绍最原始,也是最简单的防刷票机制之一——基于session/Cookie的防刷票机制。

原理:

对用户的每次投票进行Cookie的记录,当下次投票时进行检测发现Cookie中已经存在了此投票记录则禁止此次投票。

弊端:

此方式对于大多数网民已经失去作用,只需要清掉Cookie或重启浏览器,Cookie/session就会销毁,限制就会解除。

实现:

在这里就以我前段时间写的EasyPolls v2.5中的写法为例。

<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
//首次访问本站点的识别+防止刷票
if(session.getAttribute("flag")==null){
    session.setAttribute("flag", 0);
    Map temp_map = new HashMap();
    session.setAttribute("map", temp_map);
}
Map temp_map = (Map)session.getAttribute("map");
if(temp_map.get(id) == "Y")
    response.sendRedirect("result.jsp?id="+id);
%>

如上,在投票jsp中加入以上代码即可。

另外,可在投票成功(数据库写入jsp)页面加入以下代码,来防止利用URL进行刷票:

<% 
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");

//防止刷票
Map temp_map = (Map)session.getAttribute("map");
Boolean flag = temp_map.get(id) == "Y";
if(!flag) {
    temp_map.put(id, "Y");
    session.setAttribute("map", temp_map);
}
//数据库写入前进行判断
if(!flag)
    if(yn.equals("1"))
    stmt.executeUpdate("UPDATE polls SET "+op+"="+op+"+1 WHERE id = "+id+";");
    else
        for(int i=0;i<ops.length;i++){
        stmt.executeUpdate("UPDATE polls SET "+ops[i]+"="+ops[i]+"+1 WHERE id = "+id+";");
    }
%>


A Student on the way to full stack of Web3.