邪恶八进制信息安全团队技术讨论组's Archiver

verror 2007-5-3 13:46

[原创]也说投票系统的防范

文章作者: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]<%

&#39;**********************************************************
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=&#39;" & ip & "&#39;and DatePart(&#39;m&#39;,u_add_time)=DatePart(&#39;m&#39;,now()) and DatePart(&#39;d&#39;,u_add_time)=DatePart(&#39;d&#39;,now())"”

if rs.RecordCount>=20 then ~~~[/code]

[b]6、很容易被忽略的一点:[/b]

提示“投票成功”页面与投票页的分离,我就犯了这个错误。

所以,要记住在提示response.write("OK")的同时,一定要放在ok.html页,切记切记~~~

当然,如果服务器程序不安全,被人拿到权限,那就没得玩了~

就写这么多了,等俺记起来再说~~

verror 2007-5-3 16:15

谢谢eviloctal帮我重新编辑,补充一下,
这只是针对ASP的角本来说明的.
个人感觉要想把网上投票做到绝对的安全很困难.
COOKIES与IP很好绕过.无非也就是增加点投票难度罢了!
[s:269]

勇敢的风 2007-5-3 16:36

P一下,呵呵
1、禁止外部提交数据。(没用)
2、加验证码。(没用)
3、加验证码还得必须加上一句:强制刷新与禁止后退功能(没用)
4、限制IP功能(就靠这一个)
5、COOKIES法与数据库记录法(必用)
6、很容易被忽略的一点。(没用)

方法:
投票前随机生成一个cookies,并验证数据库中是否有该投票者的ip纪录,如有则不生成
投票时验证cookies,如验证失败则禁止接受数据
投票成功的同时清除cookies并将投标的ip加入数据库

至于代理服务器问题,有些好的代理服务器,用脚本是检测不到的。

verror 2007-5-3 16:43

楼上还有什么好的方法吗?

对,我就是用你所说的方法的.呵呵双重保险的COOKIES!

勇敢的风 2007-5-3 17:11

习惯在QQ中用ctrl+enter换行,结果没有说完就发出去了,只好修改了。
你看到的可能是没有发完的

(这条回复是用ctrl+enter提交的)

heroooooo 2007-5-3 17:14

2、加验证码。(没用)
___________
呵呵,这个不好说,一般情况下还是有用的.

毕竟这个还是个投票的系统,搞得太严格,如果是个小站,想下投票的人能有多少,代码写得最漂亮也没有用.用下一般的方法就好.
控制得越严格,代码势必就越长.

方法:
投票前随机生成一个cookies,并验证数据库中是否有该投票者的ip纪录,如有则不生成
投票时验证cookies,如验证失败则禁止接受数据
投票成功的同时清除cookies并将投标的ip加入数据库
_____________________________
一个好的生成cookies的算法是在所难免的了,不知道您能不能给个看看呢?谢谢!!

最后要补充的就是服务器自己的安全.服务器出问题什么都玩完,虽然可以通过查数据库删除一些假数据,不过一般时候都是没有 用的.
以往也刷过,不过后来发现刷得太狠了,和别的人的票数差距太大了,只好下载数据库删除一部分再上传,表面上在网络中投票是最多,但是一点用都没有 ,因为人家不看这个,票数第一,但是真正的结果也是第一,是倒数的。看了下获奖的人员,明白了,内部人嘛。什么都不说了..

勇敢的风 2007-5-3 17:29

cookies验证方法,随机生成4个字符,如abcd然后将abcd做一个不可逆的算法获得字符串如:12654
cookies的值便是"abcd|12654"
(晕死,又ctrl+enter了,下面继续)
验证则用同一个方法来验证abcd是否等于12654

至于写法,我很早就想把我写的发出来,考虑到可以生成多中格式时便想写一个可随机生成的小程序,前几天抽空把大致的内容写出来了,但生成的结果还不能随意设定,又有其他事情也暂时搁置了,回头有时间就完善一下发出来。

在这里先预告一下内容:
1、自定义字符串
2、自定义生成字符串的格式、长度,(可写成注册码,像MS的那样)
3、每次生成都能独立使用

勇敢的风 2007-5-3 17:43

补充:
很久之前写过一个抽奖的小程序
可随便填写
待到抽奖时Select Distnct一下就搞定了
投票的也可以这样,待到公布结果的时候也Select Distnct一下

虫虫 2007-5-8 09:31

我觉得加验证码还是相当有效果的。
可能是因为写的方法不是很好,所以导致了可以被绕过。其实好好得安排好验证码生成与验证顺序,验证结束后清除重新生成一次,是很难被绕过的。

勇敢的风 加Cookie的方式很有意思,学习了,赫赫。

混世魔王 2007-5-8 13:15

勇敢的风 说的方法,能不能丢个程序出来。
以前搞了个刷票的,我把刷票的投票数字,固定250票......

我_三少 2007-5-12 23:13

  我系新手  那些措施为什么没用  能说清楚一点吗

yuanze840603 2007-6-24 16:21

[s:266]

反其道貌似可以刷投票??

fhod 2007-6-26 08:27

上次帮一个朋友刷票
拿了两个第一回来
结果去领奖的时候别人只给一个..他们都是内定的..刷再多也是徒劳
不过那个投票系统太差了..完全没有任何限制
只要求输入用户名..身份证号码..电话
而这些又是没有字数限制的..随便输入就可以..写个程序..让他自动生成然后post搞定

页: [1]
© 1999-2008 EvilOctal Security Team