前言:
防止“刷票”不可能有一个完美的方式,也不可能有一个长久的方式。如何防止刷票关键在于如何“蒙蔽用户”,让他不知道你的限制规则,再加上合理增加投票的难度和成本开销,这样可以减少刷票的产生。多限制方案下手多管其下也许能达到比较好的效果。
我们防刷票的目标就是:让“刷票”的成本大于其获得的利益。
那么本篇文章就先介绍最原始,也是最简单的防刷票机制之一——基于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+";");
}
%>
Comments 1 条评论
博客作者 Jaime Grizzell
Together with almost everything which seems to be building throughout this particular subject matter, many of your opinions are rather refreshing. Even so, I am sorry, but I can not subscribe to your whole plan, all be it refreshing none the less. It seems to me that your remarks are not entirely justified and in actuality you are your self not even entirely convinced of your argument. In any case I did take pleasure in looking at it.