Захист сайту від CSRF атак

19

Від автора: приводом до запису даного уроку послужив питання на нашому форумі, який звучав наступним чином — як захистити сайт від CSRF -атак? Звичайно, ми відразу ж відповіли по даній темі і привели невеликий алгоритм реалізації механізму захисту. Але так як, швидше за все форум читають, далеко не всі наші читачі я вирішив записати окремий урок з вищезазначеного питання.

скачать урок

Відразу хотів би зазначити, що в поточному відео не буде приведено повноцінне готове рішення, яке можна впровадити на потрібний сайт. Бо у кожного з Вас є або ж буде сайт, з унікальною логічною структурою, тобто зовсім не схожий на інші, а отже неможливо створити готовий скрипт захисту, дотримуючись абсолютно всі можливі варіанти реалізації.

Та й це не потрібно, так як суть механізму захисту досить проста, і тому в поточному відео на прикладі тестового сайту, Ви побачите, як можна захиститися від вищевказаного типу атаки, а далі на основі отриманих знань Ви зробите аналогічні кроки на власному проекті. Отже, давайте приступати.

CSRF – це абревіатура утворена англійськими словами Cross-Site Request Forgery, що означає межсайтовая підробка запитів. Цей термін введений вже досить давно ще 2001 році Пітером Воткинсом, але говорити про можливі атаки подібного роду почали ще в далекому 1988 році. При цьому зауважте, пройшло вже достатньо часу, але все ж даній атаці піддається велика частина веб-сайтів інтернету. Відразу ж виникає питання – чому так? І відповідь досить проста і полягає в тому, що вразливість до CSRF атак — це не помилка коду програми, а наслідок цілком звичайної роботи браузера та веб-сервера.

Суть атаки полягає в тому, що зловмисник може виконати на незахищеному сайті різні дії від імені іншого зареєстрованого (авторизованого користувача. Іншими словами даний тип атаки передбачає відвідування користувачем сайту зловмисника, що в свою чергу призводить до того, що непомітно для нього виконуються деякі заздалегідь прописані дії на іншому сайті або сервісі, на якому цей користувач в даний момент авторизований.

При цьому, як правило, цілями CSRF-атак є різні інтерактивні Web-додатки, які виконують конкретні дії, наприклад, сервіси електронної пошти, різні форуми, платіжні системи і т. д. тобто, хакер може виконувати деякі дії від імені інших користувачів, відправляти повідомлення, додавати нові облікові записи, здійснювати фінансові операції і т. д.

Тепер давайте розглянемо дію зазначеної атаки на прикладі тестового сайту.

Защита сайта от CSRF атак

Припустимо, що є веб-сайт, завдання якого зводиться до відправлення електронного повідомлення за вказаною адресою від імені якогось авторизованого користувача. Тобто на головній сторінці ми бачимо форму, для надсилання повідомлення. Більш того тут же передбачений механізм відправки повідомлень, при передачі певних параметрів через GET запит (просто для прикладу). При цьому сторінка авторизації виглядає наступним чином.

Защита сайта от CSRF атак

Дана сторінка цілком звичайна, але в очі кидається чек-бокс «Member», який використовується для збереження даний авторизації в куках браузера. Власне цей механізм дуже зручний користувачам, так як спрощує повторний доступ до сторінки, але вкрай не бажаним з точки зору безпеки. Але все ж заради відвідувачів часто доводиться йти на певні поступки.

Код відправки повідомлень двома методами (GET і POST) виглядає приблизно наступним чином:

//Відправлення повідомлення
if($this->isGet() && !empty($_GET[’email’]) ) {
$body = «Hello this is message form — «.$this->user[‘name’];
$body .= ‘Content — from GET — ‘.$_GET[‘content’].’From — ‘.$_GET[’email’];
mail(‘[email protected]’,’New message’,$body);
}
if($this->isPost()) {
$body = «Hello this is message form — «.$this->user[‘name’];
$body .= ‘Content — FROM POST — ‘.$_POST[‘content’].’From — ‘.$_POST[’email’];
mail(‘[email protected]’,’New message’,$body);
}

Тепер, розглянемо ще один сайт – сайт хакера.

Защита сайта от CSRF атак

На якому він може розмістити, досить простий , але дуже ефективний код ,якщо необхідно провести атаку за запитом типу GET:

Захист сайту від CSRF атак

Тобто, по суті, ми бачимо тег img, в атрибуті src якого розташовується шлях до сайту, передбачуваного для атаки, з набором необхідних параметрів, для виконання конкретної дії. У нашому випадку це відправка повідомлення, а значить, тепер зловмисникові досить заманити користувача на поточний сайт і непомітно від нього, буде здійснено запит до потрібного сайту, так як браузер буде намагатися завантажити зображення, шлях до якого вказаний в атрибуті src. При цьому ми пам’ятаємо, що в куках браузера зберігаються дані для авторизації і, звичайно ж, програма відразу ж їх використовують і відповідно вищевказаний запит успішно буде оброблений сервером. А це означає, що буде надіслано повідомлення від імені користувача.

Якщо подивитися набір заголовків, які відправляються разом із запитом, то дійсно, ми зможемо побачити і куки, з даними для входу в обліковий запис, що само собою означає – як було сказано вище, що запит буде сприйнятий як вихідний від аутентифицированного користувача.

Защита сайта от CSRF атак

Точно така ж ситуація і з надсиланням запиту методом POST, єдино в цьому випадку зловмисник створить на своєму сайті форму, яка буде автоматично вирушати за допомогою JavaScript ,як тільки відвідувач зайде на цей сайт.

Таким чином захищатися від атак подібного роду потрібно обов’язково і єдиний найбільш ефективний спосіб захисту – це використання спеціальних токенів.

Захисний токен – це рядок, який генерується випадковим чином під конкретного користувача і передається в кожному запиті, який передбачає зміну даних. Крім цього токен ,так само зберігається і в сесії. Таким чином, суть захисту, зводиться до простої перевірки відповідності маркер, який передається в запиті та токена який зберігається в сесії. Якщо обидва токена ідентичні, значить, запит відправив авторизований користувач. Якщо токени не збігаються, або у запиті його взагалі немає – з великою впевненістю можна судити, що здійснюється атака, а значить, ніякі дії виконувати не можна.

Зауважте, що захищати потрібно абсолютно всі запити, які спрямовані на зміну або виконання певних дій.

Власне на даному етапі текстова частина уроку завершена і продовжимо говорити поданої теми ми вже у відео версії. При цьому ми розглянемо способи генерації токенів і практично реалізуємо алгоритм роботи захисту, який описаний вище. А зараз давайте прощатися. Вдалого кодування!!!