Автентифікація

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

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

Поширеною практикою є гешування даних щодо паролю перед його збереженням у БД. Це ускладнює пряму розвідку паролів, а також процедуру атаки на автентифікацію. Типовий запит автентифікації має вигляд:
SELECT * FROM users u WHERE u.login = '{$_GET['login']}' AND u.passw = MD5('{$_GET['passw']}')
де $_GET['login'] - переданий параметр з логіном, $_GET['passw'] - з паролем. У даному прикладі вживається гешування MD5 (128 біт). Передані дані стають частиною запиту, наприклад, при введені логіну "admin" та паролю "123" запит матиме вигляд
SELECT * FROM users u WHERE u.login = 'admin' AND u.passw = MD5('123')

Через наявність гешування атаки через вміст паролю не матимуть сенсу, а атаки через логін мають відключити другу частину запиту. Це здійснюється за допомогою наступної технології:

Введіть облікові дані:

Чому виникає уразливість?

У найширшому змісті це відбувається тому, що дані змішуються з кодом. Як результат - здійснюється виконання даних.

Як захиститись?

Розділити код і дані. Це можна реалізувати або вживанням підготовлених запитів, або збережених процедур автентифікації з боку СУБД. За відсутності таких можливостей принаймні екранувати спеціалізовані символи у введених даних.