各位大虾!
我在做一个投票网页的时候遇到了这样的问题,用户投票都不需要注册的!本来想限制IP来着,但是这样以来同一个局域网的用户就没办法投了!索性想降低一下标准,就是只限制给一个人只能投一次,例如给A投票后就不能再投了,但是还可以继续给B投票,以此类推。但是我现在做的头都大了也没有实现,不知道大家有什么好的方法吗??
能用Session的方法实现吗?应该怎么去做呢??现在头都转了!!!!!
我在做一个投票网页的时候遇到了这样的问题,用户投票都不需要注册的!本来想限制IP来着,但是这样以来同一个局域网的用户就没办法投了!索性想降低一下标准,就是只限制给一个人只能投一次,例如给A投票后就不能再投了,但是还可以继续给B投票,以此类推。但是我现在做的头都大了也没有实现,不知道大家有什么好的方法吗??
能用Session的方法实现吗?应该怎么去做呢??现在头都转了!!!!!
同时还配合IP投票记数
import java.io.*;public class Test1 {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("ipconfig /all");
InputStreamReader ir = new InputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line;
while ((line = input.readLine()) != null)
if (line.indexOf("Physical Address") > 0) {
String MACAddr = line.substring(line.indexOf("-") - 2);
System.out.println("MAC address = [" + MACAddr + "]");
}
} catch (java.io.IOException e) {
System.err.println("IOException " + e.getMessage());
}
}
}
这个MACAddr就是本机的MAC地址
----------
我找了一下,用js实现的,不过不对,还有楼上用java代码实现的,在客户端是不可能运行的
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);
//document.formbar.submit();
</SCRIPT>
<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
{
if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
MACAddr = objObject.MACAddress;
if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
IPAddr = objObject.IPAddress(0);
if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
sDNSName = objObject.DNSHostName;
}
</SCRIPT>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language=JScript>
var service = locator.ConnectServer();
var MACAddr ;
var IPAddr ;
var DomainAddr;
var sDNSName;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>
<FORM id=formfoo name=formbar action=NICPost.asp method=post><INPUT value=00:05:5D:0E:C7:FA name=txtMACAddr> <INPUT value=192.168.0.2 name=txtIPAddr> <INPUT value=typ name=txtDNSName> </FORM></BODY></HTML>
这是取客户端的MAC,你说不存入数据库,那你的投票结果也不要存入数据库吗,如果存入数据库的话,就把投票人的MAC也存入投票结果的这个记录中,那么当用户再投票时就把他的MAC和数据库中前10分钟投票的MAC进行比较(假定10分钟之内不能重投),有相同的就不能投,没有相同就投票成功
在表单提交的时候加上一个写一个session并设置标记为false
提交之后检测标记如果是false则同意提交并设为true。
不过防止投票作弊几乎是不可能的
假如用户是firefox,就不能正常取到值
1。ip
如果是共享ip,容易禁错人
2。cookie
如果用户禁用了,或删除本地文件也就失效了3.mac
没用过,好像要取到也比较麻烦
====================
要钱的别来这里起哄,真他妈财迷
如果服务器和客户端都在局域网里,才可以用MAC,否则不可能
可否把你的回帖转载到www.88doc.com上呢?
谢谢
用js记录客户端的MAC 是个非常不错主意
除非你自己些个ACTIVEX控件!没办法做到真正的防作弊,只有尽可能加大作弊的难度。设置为注册用户才可以投票;
增加IP限制;
增加验证码机制;
增加当天投票对比;好运!
我采用的上大家上述的方法,我建立了一个临时表temp,这张表记录ip地址,你要投票的人的id和你的上次投票时间.
每次取得客户ip,id,取查询表中有没有上次投票的时间,没有就投,若有则与当前时间比较大于30分钟则可以投,否则不容许.
而且为了防止这张表的数据条数不断的增加,就限定数据条数,大于一个值就将最早的一部分数据删除.呵呵.是不是很麻烦阿!本来想取mac来着,用java好像很困难,取的都是服务器的mac.用js时网页老提示要不要执行activeX,如果不执行也取不到,所以就降低标准了.再次谢谢大家阿!散分先!!!
String pip = request.getParameter("pip");//取客户ip
String tt = request.getParameter("dd");
int dd = new Integer(tt).intValue();//取客户当前时间
String id = request.getParameter("userid");//取人物idboolean commitflg = false;
try
{
this.conn = DBConnectionDAO.getConnection();
conn.setAutoCommit(false);
VoteSQL check = new VoteSQL(conn);
//查询上次投票时间
int mnt = new Integer(check.FindMac(id,pip)).intValue();
if(mnt!=0)
{
//有记录
session.setAttribute("ERRORMSG", "请您不要重复投票,谢谢!!");
response.sendRedirect("site/voteerr.jsp");
}
else
{
//没有记录,添加记录
check.AddVote(id);
int count = 0;
//查询数据条数
count = check.AddMac(id, pip, tt);
//System.out.println("The syscount is "+count);
if (count>200)
{
//删除数据库一部分记录
check.DelTemp(count);
}
//System.out.println("SSSSSSSSSSSSSSSSSSSSS");
conn.commit();
session.setAttribute("userid", id);
session.setAttribute("allvote",check.FindAllVote());
response.sendRedirect("site/allvote.jsp");
}
}
页面代码:
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %><%
PageBean pageusers = (PageBean) session.getAttribute("pageusers");
//System.out.println("list is "+pageusers.getUserList());
String pip = request.getRemoteAddr();
Date dt = new Date();
int dd = dt.getMinutes();
//System.out.println("The page time is "+dd);
%>多谢大家支持帮助!
参考例子:http://60.191.62.5:86/MagicYellow.html
而如果每次每个人都是同样的cookies,那就等于是只用ip判断了。
其实防止重复投票的方法就是要找出一个“唯一识别证”,在服务器端获得这个“唯一识别证”,类似于你一登录网站就注册了,下次登录还是这个用户名。