Лучшие практики безопасности PHP: подробное руководство 🔒🐘
- 1. Всегда фильтруйте и валидируйте входные данные
- 2. Используйте подготовленные выражения для работы с базой данных
- 3. Экранируйте вывод данных
- 4. Защита файлов и загрузок
- 5. Безопасная работа с сессиями
- 6. Пароли и аутентификация
- 7. Ограничение доступа к файлам и папкам
- 8. Защита от CSRF
- 9. Логи и мониторинг
- 10. Настройка сервера и PHP
- 11. Регулярные обновления
- 12. Дополнительные советы
- 13. Итог
PHP остаётся одной из самых популярных платформ для веб-разработки. И это значит, что сайты на PHP часто становятся целью атак. Но при правильной организации кода и применении проверенных практик можно существенно снизить риски.
В этой статье мы разберём лучшие практики безопасности PHP: от защиты входных данных до настройки сервера, чтобы ваш сайт оставался защищённым и устойчивым к атакам.
1. Всегда фильтруйте и валидируйте входные данные
Одна из главных причин уязвимостей — неконтролируемые данные от пользователей.
Как действовать
- Используйте
filter_var()
для email, URL и чисел:
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
-
Применяйте регулярные выражения для специфичных форматов.
-
Ограничивайте длину и типы данных:
strlen()
иctype_*
функции.
Пример
$name = $_POST['name'];
if (!ctype_alpha(str_replace(' ', '', $name))) {
die('Имя содержит недопустимые символы');
}
2. Используйте подготовленные выражения для работы с базой данных
SQL-инъекции остаются одной из самых опасных угроз.
MySQLi с подготовленными выражениями
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
PDO с подготовленными выражениями
$stmt = $pdo->prepare("INSERT INTO messages (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => $name, 'email' => $email]);
Почему это важно: пользовательские данные не внедряются напрямую в SQL-запрос.
3. Экранируйте вывод данных
Чтобы избежать XSS (внедрение скриптов), никогда не выводите данные пользователя напрямую:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
-
htmlspecialchars()
превращает<
,>
и кавычки в безопасные символы. -
Для HTML, JS и атрибутов применяйте соответствующие фильтры.
4. Защита файлов и загрузок
Загрузка файлов — частая уязвимость.
Правила:
-
Ограничивайте типы файлов:
mime_content_type()
илиfinfo_file()
. -
Сохраняйте файлы за пределами web-каталога.
-
Генерируйте уникальные имена для файлов.
-
Ограничивайте размер файлов.
Пример:
$allowed = ['image/jpeg', 'image/png'];
$mime = mime_content_type($_FILES['file']['tmp_name']);
if (!in_array($mime, $allowed)) {
die('Недопустимый тип файла');
}
5. Безопасная работа с сессиями
Сессии хранят данные пользователей, и их нужно защищать:
-
Используйте
session_start()
в начале каждого скрипта. -
Применяйте
session_regenerate_id(true)
после авторизации. -
Устанавливайте флаги:
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);
- Храните сессии вне общедоступной папки.
6. Пароли и аутентификация
- Всегда хэшируйте пароли:
$hash = password_hash($password, PASSWORD_DEFAULT);
- Проверка пароля:
if (password_verify($input, $hash)) {
// Успешный вход
}
-
Не храните пароли в открытом виде.
-
Используйте сложные, уникальные пароли для админки.
7. Ограничение доступа к файлам и папкам
-
Используйте
.htaccess
для защиты конфигурационных файлов. -
Не размещайте конфиденциальные файлы в папке, доступной через web.
-
Настройте права доступа:
chmod 644 config.php
chmod 755 /uploads
8. Защита от CSRF
Cross-Site Request Forgery позволяет злоумышленнику совершать действия от имени пользователя.
Пример токена:
// Генерация токена
$_SESSION['token'] = bin2hex(random_bytes(32));
// Проверка токена
if (!hash_equals($_SESSION['token'], $_POST['token'])) {
die('CSRF защита сработала');
}
- Вставляйте токен в каждую форму:
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
9. Логи и мониторинг
- Включайте логирование ошибок, но не показывайте их пользователю:
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_log('Ошибка: ...');
- Анализируйте логи для выявления подозрительной активности.
10. Настройка сервера и PHP
-
Используйте актуальную версию PHP.
-
Отключайте опасные функции:
disable_functions = exec,passthru,shell_exec,system
-
Включайте
open_basedir
, чтобы ограничить доступ PHP к файловой системе. -
Настройте HTTPS и HSTS для безопасного соединения.
11. Регулярные обновления
-
PHP, CMS, фреймворки и библиотеки должны быть актуальными.
-
Старые версии содержат известные уязвимости.
12. Дополнительные советы
-
Минимизируйте вывод ошибок на продакшене.
-
Используйте Content Security Policy (CSP).
-
Разделяйте права пользователей и администраторов.
-
Применяйте двухфакторную аутентификацию для админки.
13. Итог
Безопасность PHP зависит от правильной организации кода, защиты данных и настроек сервера.
Ключевые практики:
-
Валидируйте и фильтруйте все входные данные.
-
Используйте подготовленные выражения для работы с базой данных.
-
Экранируйте вывод пользователя (XSS).
-
Защищайте загрузку файлов.
-
Надёжно работайте с сессиями и паролями.
-
Ограничивайте доступ к файлам и папкам.
-
Защищайте формы от CSRF.
-
Настраивайте сервер и актуализируйте PHP и библиотеки.
-
Логируйте и мониторьте действия.
Следуя этим правилам, вы создадите устойчивый к атакам сайт на PHP, который безопасен для вас и ваших пользователей.