Представям на вашето внимание 2 скрипта, които са с много малки модификации взети от сайта на php.net
2та скрипта в комбинация с домейн с MX пренасочване, пощенски сървър postfix с настроен за maildir пращат много гласове към сайта на междучасие в ползва на даден участник. При желание - голям списък с случайно генерирани имена на пощи, добре избрано име на домейн и доста хора с различни ipта и доставчици би направило косата на разработчика на сайта голямото междучасие бяла. Идеята да си пишете мейла и после да потвърждавате линк от него е крайно остаряла. Видяхме как голямо число групи изведнъж дръпнаха с по няколко хиляди гласа, които сякаш са паднали от небето.
1. Сървъра: моя сървър, той по принцип си е настроен за web и мейл сървър с maildir поддръжка. Съответно директорията с новите писма на потребителя става /home/потребител/maildir/new като файловете вътре имат формат: [unix timestamp].[some hash or something].[mx hostname] (без квадратните скоби). Файловете са с права 0600 (-rw-------).
2. Домейн от хост.бг, контролният панел за домейни при тях май е най-удобен измежду тези на българските хостинг компании.
3. Скрипта, който попълва формата за гласуване. Погледнете ръководството на php за fsockopen() и примера на следният линк:
http://bg.php.net/fsockopen#function.fsockopen.examplesЕто го скрипта:
<?php
set_time_limit(0);
$start=1;
if(file_exists("counter.txt")) $start=file_get_contents("counter.txt");
for($i=$start;$i<=6000;$i++)
{
$sleep=rand(0,1);
echo "\n\n$i. {sleep($sleep)}\n\n";
$host="***********.******.info";
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$ua=array();
$ua[]="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10";
$ua[]="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
$ua[]="Opera/9.64 (Windows NT 5.1; U; en) Presto/2.1.1";
$content="id_g=ID&email=PREFIX".$i."SUFIX%40DOMAIN.TLD&x=".rand(0,94)."&y=".rand(0,35);
$len=strlen($content);
$out = "POST /vote HTTP/1.1\r
Host: $host\r
User-Agent: ".$ua[rand(0,2)]."\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r
Accept-Language: en-us,en;q=0.5\r
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r
Keep-Alive: 300\r
Connection: keep-alive\r
Referer: http://***********.******.info/lista\r
Content-Type: application/x-www-form-urlencoded\r
Content-Length: $len\r
\r
$content";
//echo $out;
fwrite($fp, $out);
while (!feof($fp)) {
$str=fgets($fp, 128);
// echo $str;
}
fclose($fp);
}
file_put_contents("counter.txt",$i+1);
sleep($sleep);
}
?>
Мисля, че не са нужни обяснения.
4. Скрипта, който потвъждава писмата. Почти същия като предния. Слага се в home директорията на получателя на писмата и се изпълнява от получателя, тъй като, както вече споменах, други потребители нямат право да четата писмата (права на файл - 0600)
<?php
set_time_limit(0);
function confirm($link)
{
$host="***********.******.info";
//$host="127.0.0.1";
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$ua=array();
$ua[]="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10";
$ua[]="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
$ua[]="Opera/9.64 (Windows NT 5.1; U; en) Presto/2.1.1";
$out = "GET $link HTTP/1.1\r
Host: $host\r
User-Agent: ".$ua[rand(0,2)]."\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r
Accept-Language: en-us,en;q=0.5\r
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r
Keep-Alive: 300\r
Connection: keep-alive\r
\r
";
//echo $out;
fwrite($fp, $out);
$str='';
while (!feof($fp))
$str.=fgets($fp, 128);
//echo $str;
$t="<div id=\"message\"><center>";
$str=substr($str,strpos($str,$t)+strlen($t));
$str=substr($str,0,strpos($str,"<"));
echo $str."\n";
fclose($fp);
}
}
$dir="./maildir/new/";
$jnk_dir="./other_maildir/";
$d=opendir($dir);
$i=0;
if(file_exists("counter.txt")) $i=file_get_contents("counter.txt");
while($r=readdir($d))
{
if($r!='.' && $r!='..')
{
$regex="/(\.info\/vоtе\-[0-9a-zA-Z]{32})/";
$string=file_get_contents($dir.$r);
echo date("H:i:s",substr($r,0,strpos($r,'.')))."\n";
if(preg_match($regex,$string,$a))
{
if(isset($a[1]))
{
echo $a[1]." <br />\n";
echo $i."\n";
$sleep=floor(rand(0,6)*0.5);
confirm($a[1]);
echo $a[1]."\n";
if(@unlink($dir.$r)) echo "delete ok\n";
else echo "delete fail: ".$r."\n";
$cntw=file_put_contents("counter.txt",$i+1);
echo "Saved counter: ".($cntw===FALSE ? 'FALSE' : $cntw." bytes")."\n";
echo "{sleep($sleep)}\n\n";
sleep($sleep);
$i=$i+1;
}
else
{
rename($dir.$r,$jnk_dir.$r);
$regex="/Subject\:\ ([a-zA-Z\*\[\]\ \.0-9])\r?\n?\r?/";
if(preg_match($regex,$string,$a))
{
if(isset($a[1])) echo '!'.$a."\n";
else echo '!!'.$r."\n";
}
else echo '!!!'.$r."\n";
}
}
else
{
echo "~! link not found !~\n";
/* $link=substr($string,strpos($string,'<a'));
$link=substr($link,0,strrpos($link,'"'));
$link=substr($link,-32-8);
$link=substr($link,strpos($link,'-'));
echo $link." <br />\n";;
echo $i."\n";
$sleep=floor(rand(0,6)*0.5);
confirm('/vote'.$link);
if(@unlink($dir.$r)) echo "delete ok\n";
else echo "delete fail: ".$r."\n";
$cntw=file_put_contents("counter.txt",$i+1);
echo "Saved counter: ".($cntw===FALSE ? 'FALSE' : $cntw." bytes")."\n";
echo "{sleep($sleep)}\n\n";
sleep($sleep);
$i=$i+1;*/
}
}
}
closedir($d);
echo $i;
?>
Скрипта сканира папката с писмата, след което изчита писмото, проверява чрез регулярен израз за линка и ако го открие - трие писмото и потвърждава гласа подобно на действието на първият скрипт. Ако не открие линка, мести писмото в друга директория, за да не мине през него отново при сканирането.
Надявам се конструктора на сайта да сложи
captcha за да няма подобни изцепки догодина.