一.投票网站使用的技术
1.验证码技术
投票网站使用了数字和字符组成的图片验证码,如下图所示。该注册码使用简单的位移和噪点技术,来降低程序的自动识别率。笔者的解决思路主要是使用AspriseOCR.dll的第三方控件进行自动识别。
为了提高识别率,笔者主要从以下几个步骤进行处理
(1)将图像灰度化,灰度化算法来自网上,具体见源代码。
(2)对图像进行降噪处理,并将图像进行二值化。效果见图示,算法见源代码。
(3)由于图像只在垂直方向进行了平移,为了进一步提高识别了,程序将图像进行随便切割,以期待提高识别率。效果如图所示,算法见源代码。
(4)原本考虑使用去除空白区域,查找图片边缘,以提高识别率,但是由于时间关系,本次程序中未使用该方法。
在本程序中,曾经也使用过TesseractOCR解析验证码,但是Tesseract OCR是一个基于训练的系统,并且它貌似能够识别中英文等多种语言,所以放这里有些大材小用,反而识别率不高!注:没有仔细研究该工具,所以可能是没有掌握正确的使用方法。
2.IP限制技术
投票网站使用了IP限制,规定一个IP地址一天只能投N票。在突破该类限制时,一般都使用一下几种方法。
(1)通过在投票请求中伪造X-FORWARDED-FOR头来欺骗服务器检查用户IP地址。
要使用该方法,前提是服务器在读取客户端IP地址时,为了防止用户使用代理服务器投票,会检查代理服务器后的真实主机的IP地址,而放弃检查代理服务器低IP地址。而我们正式利用了该操作,直接把本机地址伪造称代理服务器,并在代理服务器后虚构一个主机,让网站检测。主要代码:request.Headers.Add("X-FORWARDED-FOR", randip());本程序就是使用了该技术投票。
(2)如果网站不检测代理服务器后的IP,那么我们一般使用代理服务器投票。但是代理服务器的效率较低,所以投票效率也很低。本程序未使用该技术。
(3)如果网站每个IP地址投票限制数较宽松,如每个IP能够投票10票以上,我们可以可虑使用程序自动拨号能够。每当投10票后,程序自动断开ADSL链路,并等待一段时间(如果不等待,很多ISP会提供同一个IP地址),再次拨号。本程序未使用该技术。
二、如何提高效率
(1)多线程/多进程技术的使用
如果对服务器的限制措施突破的比较理想,我们可以使用多线程技术提高程序的执行效率。
(2)程序漏洞的使用
很多网站在接收到了客户机的验证码后,不论验证码是否正确,都会将验证码清空,以防止客户机用同一个验证码反复投票。但问题在于如果只是简单的清空,我们可以使用新的空白验证码继续反复投票。本程序就使用了该技术。