Коротко: «PHP на вход на сайт» — это система авторизации: форма входа, проверка логина и пароля на сервере, создание сессии и защита от подделки. В PHP пароли хранят не в открытом виде, а через password_hash(), проверяют password_verify(), а доступ выдают через $_SESSION. Запросы к базе делают подготовленными выражениями (PDO).
Этапы авторизации
| Этап | Что делает |
|---|---|
| Форма | принимает логин и пароль |
| Проверка | сверяет с базой |
| Сессия | запоминает, что пользователь вошёл |
| Защита | CSRF-токен, ограничение попыток |
| Выход | уничтожает сессию |
Вкладки: код по шагам
<form method="post" action="login.php">
<input type="hidden" name="csrf" value="<?= $csrf ?>">
<input type="text" name="login" required>
<input type="password" name="password" required>
<button type="submit">Войти</button>
</form>Форма отправляет данные методом POST. Скрытое поле csrf защищает от подделки запроса с чужого сайта.
// при регистрации сохраняем хеш
$hash = password_hash($password, PASSWORD_DEFAULT);
// при входе получаем пользователя
$stmt = $pdo->prepare('SELECT id, password FROM users WHERE login = ?');
$stmt->execute([$login]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
// пароль верный
}Пароли сравнивают только через password_verify(). Подготовленные выражения защищают от SQL-инъекций — не подставляйте переменные в SQL напрямую.
session_start();
$_SESSION['user_id'] = $user['id'];
header('Location: /cabinet.php');
exit;
// проверка на защищённой странице
session_start();
if (empty($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}session_start() должен вызываться до любого вывода. Выход — session_destroy() и очистка массива сессии.
password_hash()— никогда не храните пароли в открытом виде;- PDO с подготовленными выражениями — против инъекций;
- CSRF-токен в форме;
- ограничение попыток входа и задержка;
- HTTPS обязательно;
- параметры cookie:
HttpOnly,Secure,SameSite; - регенерация ID сессии после входа (
session_regenerate_id(true)).
password_hash/password_verify — они используют безопасные алгоритмы и сами добавляют соль.Практика: безопасный вход
- Сделайте таблицу пользователей с полем
passwordдля хеша. - При регистрации сохраняйте
password_hash(). - При входе ищите пользователя подготовленным запросом.
- Сверяйте пароль через
password_verify(). - Создавайте сессию и регенерируйте её ID.
- Ставьте CSRF-токен и лимит попыток.
Частые ошибки: причина → решение
| Ошибка | Последствие | Решение |
|---|---|---|
| Пароль в открытом виде | утечка при взломе базы | password_hash() |
| SQL-конкатенация | SQL-инъекция | PDO-параметры |
| Нет CSRF-токена | подделка формы | добавить токен |
| session_start после вывода | ошибка «headers already sent» | вызывать до вывода |
| Без HTTPS | пароль можно перехватить | включить SSL |
Проверьте себя
Вопросы и ответы
md5 быстрый и без соли — легко подбирается по словарю. password_hash использует медленный алгоритм со сгенерированной солью.
Да. Очистите сессию (session_destroy()) и перенаправьте на страницу входа — иначе сессия останется активной.
Считайте неудачные попытки в базе по IP и логину и блокируйте на время после N ошибок. Это сильно усложняет подбор.
Да, в WordPress это wp_signon() и родные функции — они уже безопасны. Своя авторизация нужна редко, когда требуется особая логика.
Итоги
- Пароли — только хеш через
password_hash()/password_verify(). - Запросы к базе — подготовленные (PDO).
- Сессия —
$_SESSION, с регенерацией ID после входа. - CSRF-токен, HTTPS, параметры cookie и лимит попыток — обязательны.
Комментарии
Пока комментариев нет — будьте первым, кто поделится мнением.