问题描述
这是JQ代码:$(function(){$('#btn_vote').click(function(){varradios=$('input:radio[name="id"]:checked').val();if(radios==null){alert("请选择一个");returnfalse;}else{//alert(radios);$.post("Ajax/LoginHandler.ashx",{"action":"vote","radio":$('input:radio[name="id"]:checked').val()},function(data,status){if(status!="success"){return;}elseif(data=="success"){alert("投票成功");}})}});});
复制代码这个是处理的代码,如何判断一天只能投票一次呢?比如说IP+cookies只要能实现投票了没有做过任何设置再投的话能实现就可以了,不管安全不安全if(action=="vote"){stringvoteitems=context.Request["radio"].ToString();using(vardb=newmyExpressDataContext()){context.Response.Write("success");SurveyTablesu=newSurveyTable();if(voteitems=="25"){su.SurveyContent="非常好";su.SurveryTime=DateTime.Now;db.SurveyTable.InsertOnSubmit(su);db.SubmitChanges();}elseif(voteitems=="26"){su.SurveyContent="比较好";su.SurveryTime=DateTime.Now;db.SurveyTable.InsertOnSubmit(su);db.SubmitChanges();}elseif(voteitems=="27"){su.SurveyContent="一般般";su.SurveryTime=DateTime.Now;db.SurveyTable.InsertOnSubmit(su);db.SubmitChanges();}elseif(voteitems=="28"){su.SurveyContent="较差";su.SurveryTime=DateTime.Now;db.SurveyTable.InsertOnSubmit(su);db.SubmitChanges();}}}
复制代码
解决方案
解决方案二:
验证码+判断IP。
解决方案三:
你记录投票者的ip加投票时间,并且在浏览器客户端上记录cookie,每次有投票者进行投票的时候都进行判断检测
解决方案四:
验证码然后COOKIE最严格的:记IP
解决方案五:
说cookie和IP的,对你们表示无语,cookie随便都能禁掉,ip随便都能换掉。
解决方案六:
引用4楼xishuiyue的回复:
说cookie和IP的,对你们表示无语,cookie随便都能禁掉,ip随便都能换掉。
按照你这样说那什么都不能防止了....就算不让登陆系统我还可以入侵数数据库执行update呢这么玩有意思么....
解决方案七:
记录硬盘序列号+CPU号
解决方案八:
难道不是发短信验证码么?
解决方案九:
网上看到了一个说法,不知道灵不灵,楼主可以过去看看,据说是获取对方的mac地址的
解决方案十:
引用6楼nacheng的回复:
记录硬盘序列号+CPU号
什么黑科技这么厉害,还能取到网页用户的硬件信息,火星的吗,发来分享下
解决方案十一:
引用8楼showyusy的回复:
网上看到了一个说法,不知道灵不灵,楼主可以过去看看,据说是获取对方的mac地址的
代码虽然没看但是我知道一定不行..那玩意只针对局域网有效...http就算你是tcp/ip都不能获取client的mac的...
解决方案十二:
最基本的做法就是使用cookie记录之前的登录等等信息,然后有了这个信息只后才能投票。有人说“用户可以禁用cookie”。但是禁用它,有几个网站还会让用户能继续投票呢?
解决方案十三:
引用7楼Mockqi的回复:
难道不是发短信验证码么?
呵呵,那还不如直接发个短信“您投给谁?回复A投刘德华,回复B偷葛优”,直接用短信投票。
解决方案十四:
关于“ip随便都能换掉”的说法,这个也相当可疑。这说法是指互联网公网IP吗?你不会是说局域网IP吧?公网IP改变起来其实比较麻烦。就算你使用联通之类路由器的不断重新拨号,你用的IP也不会总是新的IP。局域网IP跟人家网站检测的IP没有什么关系,你随便怎么换,你的公网IP也不一定就能改变。
解决方案十五:
引用13楼sp1234的回复:
关于“ip随便都能换掉”的说法,这个也相当可疑。这说法是指互联网公网IP吗?你不会是说局域网IP吧?公网IP改变起来其实比较麻烦。就算你使用联通之类路由器的不断重新拨号,你用的IP也不会总是新的IP。局域网IP跟人家网站检测的IP没有什么关系,你随便怎么换,你的公网IP也不一定就能改变。
自动更换IP投票软件现成的
解决方案:
html5有个叫做storage的东西~
解决方案:
我不推销什么软件,不发软文。针对lz的问题说“自动更换IP”的问题。有人听说“放高利贷的公司很赚钱啊”,于是就说“所有的学生都可以放高利贷”,这肯定不现实。同样地,如果你现在想推销一个确实做得到一个号称“每秒30个IP,连续7天都不带重复”的所谓“自动更换IP软件”,而不是骗人的或者木马病毒,那么也不是我要跟lz讨论的范围。因为如果以这个东西来给csdn上的技术人员做为通用的规范做法的参考,就是抬杠了。
解决方案:
引用15楼zjgdtl的回复:
html5有个叫做storage的东西~
基本上,对于这个帖子的问题,我们可以用cookie来代替它。虽然不是同一个东西,但是在这里(的逻辑设计上)其实是同一类。
解决方案:
引用4楼xishuiyue的回复:
说cookie和IP的,对你们表示无语,cookie随便都能禁掉,ip随便都能换掉。
禁掉cookie,不能投票。随便换掉ip,不是你想像的那么随便。
解决方案:
引用18楼sp1234的回复:
Quote: 引用4楼xishuiyue的回复:
说cookie和IP的,对你们表示无语,cookie随便都能禁掉,ip随便都能换掉。禁掉cookie,不能投票。随便换掉ip,不是你想像的那么随便。
cookie的话貌似可以用post的方式,先在网站上面截获cookie内容,然后自己去post一个一样的不就可以了么
解决方案:
验证码+ip
解决方案:
引用19楼zjgdtl的回复:
Quote: 引用18楼sp1234的回复:
Quote: 引用4楼xishuiyue的回复:
说cookie和IP的,对你们表示无语,cookie随便都能禁掉,ip随便都能换掉。禁掉cookie,不能投票。随便换掉ip,不是你想像的那么随便。
cookie的话貌似可以用post的方式,先在网站上面截获cookie内容,然后自己去post一个一样的不就可以了么
如果是一样的,已经投票过了,就不能再次投票除非你是去抢夺人家还没有投票过的电脑的投票权
解决方案:
复杂的高难度的验证码,防止机器识别
解决方案:
其实最简单也最可靠的办法是必须用用户名登录才能投票,每个用户只能投票一次然后注册用户的地方做限制,比如绑定邮箱,绑定手机号等等当然是要邮箱或短信验证的,不能瞎填也允许注册
解决方案:
使用ip。在服务器那边把客户端的ip记录下来放到数据库里每晚12点自动清理数据库的ip投票表。当然面对代理这个办法还是有点不好。但是使用cookie我还是不认可。主要cookie是具体怎么做的?HttpWebRequest完全可以模拟请求。
解决方案:
如何防止重复投票示例//从txt文件中读取投票数量//<paramname="P_str_path">要读取的txt文件的路径及名称</param>//<returns>返回一个int类型的值,用来记录投票数量</returns>publicstaticintreadCount(stringP_str_path){intP_int_count=0;StreamReaderstreamread;streamread=File.OpenText(P_str_path);while(streamread.Peek()!=-1){P_int_count=int.Parse(streamread.ReadLine());}streamread.Close();returnP_int_count;}//codego.net/tags/11/1///写入投票数量//<paramname="P_str_path">要操作的txt文件的路径及名称</param>publicstaticvoidaddCount(stringP_str_path){intP_int_count=readCount(P_str_path);P_int_count+=1;//将数据记录写入文件StreamWriterstreamwriter=newStreamWriter(P_str_path,false);streamwriter.WriteLine(P_int_count);streamwriter.Close();}//投票事件按钮进行投票protectedvoidImageButton1_Click(objectsender,ImageClickEventArgse){stringP_str_IP=Request.UserHostAddress.ToString();HttpCookieoldCookie=Request.Cookies["userIP"];if(oldCookie==null){intflag=RadioButtonList1.SelectedIndex;switch(flag){case0:addCount(Server.MapPath("result1.txt"));break;case1:addCount(Server.MapPath("result2.txt"));break;case2:addCount(Server.MapPath("result3.txt"));break;}ClientScript.RegisterStartupScript(this.GetType(),"","alert('投票成功,谢谢您的参与!');",true);HttpCookienewCookie=newHttpCookie("userIP");//定义新的Cookie对象newCookie.Expires=DateTime.MaxValue;//添加新的Cookie变量IPaddress,值为P_str_IPnewCookie.Values.Add("IPaddress",P_str_IP);Response.AppendCookie(newCookie);//将变量写入Cookie文件中}else{stringP_str_oldIP=oldCookie.Values["IPaddress"];if(P_str_IP.Trim()==P_str_oldIP.Trim()){ClientScript.RegisterStartupScript(this.GetType(),"","alert('一个IP地址只能投一次票,谢谢您的参与!');",true);}else{HttpCookienewCookie=newHttpCookie("userIP");newCookie.Values.Add("IPaddress",P_str_IP);newCookie.Expires=DateTime.MaxValue;Response.AppendCookie(newCookie);intrflag=RadioButtonList1.SelectedIndex;switch(rflag){case0:addCount("result1.txt");break;case1:addCount("result2.txt");break;case2:addCount("result3.txt");break;}ClientScript.RegisterStartupScript(this.GetType(),"","alert('投票成功,谢谢您的参与!');",true);}}}//记录投票%比protectedstringM_str_rate1;protectedstringM_str_rate2;protectedstringM_str_rate3;protectedintP_int_count1;protectedintP_int_count2;protectedintP_int_count3;//加载投票显示总投票数protectedvoidPage_Load(objectsender,EventArgse){P_int_count1=readCount(Server.MapPath("result1.txt"));P_int_count2=readCount(Server.MapPath("result2.txt"));P_int_count3=readCount(Server.MapPath("result3.txt"));intP_int_count=P_int_count1+P_int_count2+P_int_count3;if(P_int_count==0){Response.Write("<script>alert('还没有人投过票!')</script>");lblresult.Text="共有0人参与投票";}else{M_str_rate1=(Convert.ToDouble(P_int_count1)*100/Convert.ToDouble(P_int_count)).ToString("0.00")+"%";M_str_rate2=(Convert.ToDouble(P_int_count2)*100/Convert.ToDouble(P_int_count)).ToString("0.00")+"%";M_str_rate3=(Convert.ToDouble(P_int_count3)*100/Convert.ToDouble(P_int_count)).ToString("0.00")+"%";lblresult.Text="共有"+P_int_count.ToString()+"人参与投票";}}
解决方案:
引用24楼qzyf1992的回复:
但是使用cookie我还是不认可。主要cookie是具体怎么做的?HttpWebRequest完全可以模拟请求。
只有登录到网站上的用户,并且经过了几个导航页面浏览才进入投票网页,才能投票。否则就没有投票资格。
解决方案:
引用19楼zjgdtl的回复:
cookie的话貌似可以用post的方式,先在网站上面截获cookie内容,然后自己去post一个一样的不就可以了么
既然已经投过了,还怎么重复投票啊?
解决方案:
既然是虚幻的互联网,原则上没有什么“绝对可防止的”事情。更何况现在还有好多冒充自己是独一无二的黑客团伙来卖软件的,有些人甚至说自己的技术是军方都很想得到的先进技术。有些投票软件程序员可能直接制造10万个“假票”。但是一般来说,我们讨论应用程序普遍认可的技术,其实也就那么很简单的事情。