[原创]也说投票系统的防范
文章作者:eteek信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
[b]注意:文章首发[url=http://hi.baidu.com/eteek/blog/item/b4b893ef5be5b5eece1b3ea9.html]eteek的blog[/url],后由原创作者友情提交到邪恶八进制信息安全团队技术论坛。转载请注明原始出处。[/b]
PS:eteek就是verror,只因为论坛注册必须要6位。
因为工作需要,需要制作一个投票程序。因为各种原因,只有很短的时间去做这个程序,因为以前没有做过此类程序,因此此程序一直在查找漏洞中运行。个人认为此类程序很能考验一些新手(本人就是)的事务处理能力。
其实这个问题我在邪八发过帖讨论过。
分析与总结如下:
[b]1、禁止外部提交数据。[/b]
这一个是非常重要,这个代码很好找,网上就有。
基本就是如下:
[code]server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write "禁止外部提交数据"
response.end
else
~~~~~~
end if[/code]
[b]2、加验证码[/b]
关于加这个功能有很多争议,并且验证码很容易被绕过。放在里面还是不错的,以往我都是放在投票页的,今天看到一个强人噢,他让你一点,就弹出一个页面,让你输入,这针对某些注册机还是非常有效的。
[b]3、加验证码还得必须加上一句:强制刷新与禁止后退功能[/b]
强制刷新可以防止验证码问题
禁止后退可以防止那种点“后退”按钮进行操作的方法,不过可能用户使用不方便。
[b]4、限制IP功能[/b]
因为某些使用代理来投票。放一个取真实IP的FUNCTION,也是网上,不知道是哪位兄弟写的,先谢过了~
[code]<%
'**********************************************************
Function getIP()
Dim strIPAddr
If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then
strIPAddr = Request.ServerVariables("REMOTE_ADDR")
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1,InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1)
ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then
strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1,InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1)
Else
strIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
End If
getIP = Trim(Mid(strIPAddr, 1, 30))
End Function%>[/code]
[b]5、COOKIES法与数据库记录法[/b]
我采用COOKIES采集与数据库采集同时使用的方法,在判断COOKIES的同时,还要判断数据库中的IP记录,比如说同一天内这个IP的个数,如果超过20也CUT,
给个SQL语句
[code]"sql="select * from fy_user where u_ip='" & ip & "'and DatePart('m',u_add_time)=DatePart('m',now()) and DatePart('d',u_add_time)=DatePart('d',now())"”
if rs.RecordCount>=20 then ~~~[/code]
[b]6、很容易被忽略的一点:[/b]
提示“投票成功”页面与投票页的分离,我就犯了这个错误。
所以,要记住在提示response.write("OK")的同时,一定要放在ok.html页,切记切记~~~
当然,如果服务器程序不安全,被人拿到权限,那就没得玩了~
就写这么多了,等俺记起来再说~~ 谢谢eviloctal帮我重新编辑,补充一下,
这只是针对ASP的角本来说明的.
个人感觉要想把网上投票做到绝对的安全很困难.
COOKIES与IP很好绕过.无非也就是增加点投票难度罢了!
[s:269] P一下,呵呵
1、禁止外部提交数据。(没用)
2、加验证码。(没用)
3、加验证码还得必须加上一句:强制刷新与禁止后退功能(没用)
4、限制IP功能(就靠这一个)
5、COOKIES法与数据库记录法(必用)
6、很容易被忽略的一点。(没用)
方法:
投票前随机生成一个cookies,并验证数据库中是否有该投票者的ip纪录,如有则不生成
投票时验证cookies,如验证失败则禁止接受数据
投票成功的同时清除cookies并将投标的ip加入数据库
至于代理服务器问题,有些好的代理服务器,用脚本是检测不到的。 楼上还有什么好的方法吗?
对,我就是用你所说的方法的.呵呵双重保险的COOKIES! 习惯在QQ中用ctrl+enter换行,结果没有说完就发出去了,只好修改了。
你看到的可能是没有发完的
(这条回复是用ctrl+enter提交的) 2、加验证码。(没用)
___________
呵呵,这个不好说,一般情况下还是有用的.
毕竟这个还是个投票的系统,搞得太严格,如果是个小站,想下投票的人能有多少,代码写得最漂亮也没有用.用下一般的方法就好.
控制得越严格,代码势必就越长.
方法:
投票前随机生成一个cookies,并验证数据库中是否有该投票者的ip纪录,如有则不生成
投票时验证cookies,如验证失败则禁止接受数据
投票成功的同时清除cookies并将投标的ip加入数据库
_____________________________
一个好的生成cookies的算法是在所难免的了,不知道您能不能给个看看呢?谢谢!!
最后要补充的就是服务器自己的安全.服务器出问题什么都玩完,虽然可以通过查数据库删除一些假数据,不过一般时候都是没有 用的.
以往也刷过,不过后来发现刷得太狠了,和别的人的票数差距太大了,只好下载数据库删除一部分再上传,表面上在网络中投票是最多,但是一点用都没有 ,因为人家不看这个,票数第一,但是真正的结果也是第一,是倒数的。看了下获奖的人员,明白了,内部人嘛。什么都不说了.. cookies验证方法,随机生成4个字符,如abcd然后将abcd做一个不可逆的算法获得字符串如:12654
cookies的值便是"abcd|12654"
(晕死,又ctrl+enter了,下面继续)
验证则用同一个方法来验证abcd是否等于12654
至于写法,我很早就想把我写的发出来,考虑到可以生成多中格式时便想写一个可随机生成的小程序,前几天抽空把大致的内容写出来了,但生成的结果还不能随意设定,又有其他事情也暂时搁置了,回头有时间就完善一下发出来。
在这里先预告一下内容:
1、自定义字符串
2、自定义生成字符串的格式、长度,(可写成注册码,像MS的那样)
3、每次生成都能独立使用 补充:
很久之前写过一个抽奖的小程序
可随便填写
待到抽奖时Select Distnct一下就搞定了
投票的也可以这样,待到公布结果的时候也Select Distnct一下 我觉得加验证码还是相当有效果的。
可能是因为写的方法不是很好,所以导致了可以被绕过。其实好好得安排好验证码生成与验证顺序,验证结束后清除重新生成一次,是很难被绕过的。
勇敢的风 加Cookie的方式很有意思,学习了,赫赫。 勇敢的风 说的方法,能不能丢个程序出来。
以前搞了个刷票的,我把刷票的投票数字,固定250票...... 我系新手 那些措施为什么没用 能说清楚一点吗 [s:266]
反其道貌似可以刷投票?? 上次帮一个朋友刷票
拿了两个第一回来
结果去领奖的时候别人只给一个..他们都是内定的..刷再多也是徒劳
不过那个投票系统太差了..完全没有任何限制
只要求输入用户名..身份证号码..电话
而这些又是没有字数限制的..随便输入就可以..写个程序..让他自动生成然后post搞定
页:
[1]