現在網站常常會舉辦一些投票活動來吸引人氣,如果這些投票網頁沒寫好的話,往往就可以用程式來灌票。

常見的投票網頁有幾種防止灌票的作法:
一、限制會員
投票網頁規定只有會員才能投,這種限制是最嚴格的,通常會員投下票時就會把投票記錄寫入資料庫,想用同一個帳號同一天內重複投票幾乎是不太可能。
二、檢查IP
檢查該IP是否同一天內重複投票,這種檢查方法可以輕易的在程式中設定proxy來避開,當然程式必須準備一些可用的proxy來切換,否則想大量灌票也很難。
三、檢查cookie資料
當上網投票時,投票網頁通常會在個人電腦上留下資料,這些資料稱為cookie,當我們想在投第二次票時,投票網頁就會來檢查這些資料,看看你是否已經投過票了,這種檢查方法只能騙一些初學者,只要執行IE的「工具」「網際網路選項」「一般」「刪除cookie」就能將這些資料刪除。

上面只是大略的說一下避免重複投票的方法,當然投票網頁也可以同時檢查好幾項資料,例如同時檢查IP和cookie資料。目前網頁為了避免機器人太過氾濫,往往都會在送出資料到伺服端時要求輸入認証碼,這是個預防機器人很好的方法,因為這些灌票程式通常都是以scirpt語言寫成的,要用script語言來做到圖形辨識(image recognition)似乎有點困難,當然應該還是有其他方法可以遶過圖形辨識的認証方法而直接送資料到伺服端,不過整體而言要求輸入認証碼再加上IP、cookie等檢查,是比較好的檢查方法。

下面示範怎麼對一個完全沒防護的網頁灌票,用perl語言來寫再簡單也不過
use LWP::UserAgent;
my $ua=LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)');
my $url='http://xxx.xxx.xxx.xxx/vote.php';
while(1){
 my $res=$ua->post(
  $url,
  ['postdata1'=> $postdata,'postdata1'=> $postdata],
  'Accept'=>'*/*',
  'Accept-Language'=>'zh-tw',
  'Cookie'=>'',
 );
}

$url為投票的網址
['postdata1'=> $postdata, 'postdata1'=> $postdata]為投票的INPUT欄位及資料
再下來的一長串為投票時要送出的header,這部份有時是可以省略的,我們把Cookie設為空白,即清除cookie的意思。
這是個很簡單的投票程式,也是投票程式的基本架構,複雜的程式可以用這個基本架構繼續擴張。

接下來我們幫程式加上proxy,這樣可以逃過IP的檢查
use LWP::UserAgent;
my $ua=LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)');
my $url='http://xxx.xxx.xxx.xxx/vote.php';
while(1){
 $ua->proxy('http', 'http://proxy.hinet.net');
 my $res=$ua->post(
  $url,
  ['postdata1'=> $postdata,'postdata1'=> $postdata],
  'Accept'=>'*/*',
  'Accept-Language'=>'zh-tw',
  'Cookie'=>'',
 );
}
上面的程式只加了一行$ua->proxy('http', 'http://proxy.hinet.net');,設定的proxy server的網址。當然如果想要大量灌票的話,一個proxy是絕對不夠的,因此我們要找一堆免費的proxy server,這就要靠google搜尋啦。

無論是IP檢查或是cookie檢查都能很容易的避過,只是驗証碼的檢查我還沒想出什麼好方法,有參考資料的網友們,也請不吝分享:)

相關資料:
自動投票程式
台鐵網路訂票

    全站熱搜

    jck11 發表在 痞客邦 留言(29) 人氣()