PHP: Как да накараме бот да ни счупи сайта?
Програмиране June 11th, 2009Днес видях нещо което ме изуми! Един обикновен идексиращ бот (на търсеща машина) затри съдържанието на цял сайт, докато се е опитвал да индексира админ панела, при това без да вижда какво има вътре тъй като има логин система за администраторите. И всичко това заради малък пропуск в php кода.
Ето и по-дългият вариант на историята.
Един клиент ми се обади и се оплака, че сайта му е хакнат. Аз гледам, няма нищо в базата данни от съдържанието на сайта. В лога на сървъра се вижда как един бот се е опитвал да влезе в админ панела, но е получавал 302 редирект към страницата за вход. Никой друг не се е опитвал да влезе.
Какво се е случило на този далечен сървър???
След кратко разсъждение стана ясно, че има двама виновници. Първият е програмиста който е писал системата, а вторият е собственика на сайта който просто е инсталирал toolbar на търсеща машина на браузера си.
Проблема в кода може би може да бъде срещнат в повечето сайтове написани на php. Ето го и въпросното бъгче:
header(“location:login.php”);
}
Тук голяма роля играе и настройката на сървъра, но тъй като това е известен проблем програмиста е трябвало да го съобрази.
Във въпросния код функцията header() казва на браузера да се пренасочи към страницата за вход, но не казва на сървъра да спре изпълнението на текущата страница. Т.е. ако аз нямам права да изтрия дадена статия (например), но имам адреса чрез който може да се изтрие, след като го посетя ще видя страницата искаща парола, но сървъра ще изпълни и изтриването. Гадно а?
А как бота е разбрал адресите които трябва да се посетят за изтриване на съдържание от сайта? Отговора е още по-смешен и от php кода. Администратора, който има инсталиран toolbar на търсещата машина, без да знае е дал тези адреси на бота, като е влезнал да администрира сайта си.
Това отново повдига в съзнанието ми въпроса колко лична информация събират големите търсачки за нас, без дори да се замислим, че сме им позволили.
Извода за програмиста (който вероятно няма и да разбере какво е направил) е, че трябва да окаже на съвръра да спре да изпълнява команди ако има пренасочване, ето така:
header(“location:login.php”);
exit(0);
}
Също така да се научи да използва robots.txt.
Извода за клиента е, че е по-добре да плати веднъж много пари за стабилен софтуер, отколкото да мине тънко и да го хакне тарсачка, преди да реши да даде много пари за отстраняването на проблема
June 11th, 2009 at 9:07 pm
Адски често срещана грешка, всеoбща заблуда е, че след веднъж използвано пренасочване страницата не зарежда понататък въпреки че във всяка документация и туториял в нета си го пише изрично.
Колкото до гугъл тоолбара. Мда… Все повече позволяваме на гугъла да се бърка в личното ни пространство с цел поридобиване на още информация за ненаситните краулери.
Най ми харесаха финалните ти изречения… Който наема “индийци” да му вършат работата, ще плаща после на нас за да я оправяме…
“Данъчните били напаст… Просто не са се сблъсквали с програмисти…”
June 22nd, 2009 at 10:28 am
Честно казано клиента ти с нищо не е виновен за инсталирания тулбар. Проблема е на програмиста, че явно не знае много що е php и проблема не е често срещан на сайтовете писани на php, а е често срещан при програмисти мислещи се само за такива
Без лоши чувства
June 22nd, 2009 at 10:41 am
Аз съм виждал много сайтове, писани от различни програмисти/фирми от различни държави и това го виждам често, обикновено в безобидна ситуация.
Вярно е, че обикновено фирмите взимат хора които не разбират много и ги обучават в процеса на работа и вероятно така се създават такива бъгове.
Така че моето наблюдение е, че се среща често.
March 5th, 2010 at 4:25 pm
Една от многото причини да се използва фреймуърк е точно тази. Дори програмиста да е знаел, че трябва да спре изпълнението на кода след header(), какво пречи просто да е изпуснал да го напише? В моята практита съм срещал точно такива случай. Нормално е като имаш да напишеш 100 страници protected content да не ги напишеш както трябва
Поздрави.
June 2nd, 2010 at 1:02 pm
Момчета не може ли да се сложи едно die(); и край на мача.
освето това е мн важно да е в най – началото на страницата.
if (!isset($_SESSION['Admin'])){
header(“location:login.php”);
die();
}