08 ноември, 2009, 15:21 - SEO Оптимизация
Както бяхме обещали в поста ипотпал спам състезание и в няколко форума, пускаме малко информация относно това как регистрирахме близо 800 участника за томболата за лаптопа във SEO състезанието ипотпал.
Защо го направихме? Ами правилата го позволяваха, а след като правилата го позволяват и можеше да бъде сравнително лесно експлоитнато, защо да не го направим? Показахме, че можем и ни беше забавно докато го правихме.
Какво беше необходимо да се направи? Формата за регистрация е проста, по-голямата част от полетата можеха да бъдат твърдо кодирани (например името, потребителя и паролата), но други беше необходимо да са уникални: e-mail и URL. За целта имахме нужда от много URL-и и e-mail-и.
Проблема със URL-a беше лесен: един DNS A запис *.nolimitdir.com към 85.187.35.150 + малко mod_rewrite и бяхме готови. Проблема със e-mail-ите беше малко по-сложен, но и той беше бързо решен. Пуснахме един CATCH ALL на e-mail-ите на nolimitdir.com, което дефакто представляваше един e-mail alias * (at) nolimitdir.com към точно един определен e-mail.
Проблема със линковете и съдържанието на страниците: Събрахме всички линкове които се пускат и ги добавихме, а страничката която сложихме представлява нещо подобно на това:
$seed = crc32($_SERVER['HTTP_HOST']);
$txt = file_get_contents('utf_dumi.txt');
$txt_ex= explode(' ',$txt);
srand($seed);
shuffle($txt_ex);
$num = rand()%100 + 100;
for($i = 0; $i < $num ; $i ++)
{
echo $txt_ex[$i] . ' ';
}
След подготовката за регистрациите остана само един проблем - самите регистрации, и понеже сме доста мързеливи, някак си нямахме особено голямо желание да ги правим на ръка. Заради това реализирахме набързо една система за автоматични регистрации. За целта избрахме C#, понеже там кода за работа със http излизаше под 50 реда (има си готов компонент). Набързо спретнахме GET-а:
HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create("http://www.myvideo-box.com/contest/index.php");
myWebRequest.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)";
WebResponse myWebResponse = myWebRequest.GetResponse();
Stream ReceiveStream = myWebResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(ReceiveStream, encode);
и POST-а на формата:
string postValues = "name=Dinko%20Sotirov" +
"&username=MacTep" +
"&pass=123456789" +
"&email=ipotpal" + num + "@nolimitdir.com" +
"&url=http%3A%2F%2Fipotpal" + num + ".nolimitdir.com%2F" +
"&skype=" +
"&icq=" +
"&is_registered_user=" +
"&agree=on" +
"&captcha=" + Convert.ToString(ResultCode) +
"&result=" + Result +
"&code=" + Code +
"&submit=%D0%97%D0%B0%D0%BF%D0%B8%D1%88%D0%B8%20%D0%BC%D0%B5";
seoReg.ContentLength = postValues.Length;
// Write the request
StreamWriter stOut = new StreamWriter(seoReg.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(postValues);
stOut.Close();
// Do the request to get the response
StreamReader stIn = new StreamReader(seoReg.GetResponse().GetResponseStream());
strResponse = stIn.ReadToEnd();
stIn.Close();
Остана само един проблем - имаше CAPTCHA. Първата ни мисъл беше: "Лесна е за OCR", ще я разбием сравнително лесно. Е да, ама не! Защо да се мъчим като ни даваха резултата директно, а именно:
Regex regResult = new Regex("(?<=<input type=\"hidden\" name=\"result\" value=\")([0-9]*)(?=\">)");
Regex regCode = new Regex("(?<=<input type=\"hidden\" name=\"code\" value=\")(.*)(?=\">)");
string Result = regResult.Match(strResponse).Value;
int ResultCode = Convert.ToInt32(Result);
string Code = regCode.Match(strResponse).Value;
И с приблизително този код бяхме готови да пуснем първата версия на бота. Пробвахме я работеше, остана само да пуснем кода да се вика автоматично. Решихме че няма смисъл да товарим излишно сървърите на организаторите и за целта пуснахме един прост таймер:
timer1.Interval = rand.Next(30000,75000);
Пуснахме бота, работеше чудесно... в продължение на малко повече от 1 час...
Първа промяна на CAPTCHA-та: умножиха резултата който показват във формата по едно число. Време за реакция от наша страна - 5 минути и бота отново работеше.
Следващата промяна беше по сложна, хешираха очаквания резултат и вече не можехме еднозначно от полето което ни даваха да определим какъв трябва да бъде резултата... Тогава решихме да пробваме какво ще стане ако всеки път подаваме един и същ код? Ами стана, номера мина! Така в продължение на няколко часа бота успяваше непрекъснато да прави регистрации. Бяха добавяни нови полета към формата за регистрация, старите бяха променяни, но винаги номера с един и същ код минаваше.
Тогава около 450-500 регистрация банаха IP-то, на което беше пуснат бота. Сайтове със проксита много... Първо прокси - втори бан, второ прокси - трети бан... Регистрациите станах над 700... взе да ни става скучно, всяко прокси което слагахме беше баннвано буквално след по-малко от 10-15 регистрации. Тогава се отказахме решихме малко да поизчакаме организаторите да решат да заспят, но... Сложиха ReCaptcha... А това ако успеем да го разбием, няма да се занимаваме с регистрациите точно тук.
| Ако този пост ти харесва можеш да го споделиш в: | |||
|
|||

Последни коментари
