Статья

Лучшие практики безопасности PHP: подробное руководство 🔒🐘

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 зависит от правильной организации кода, защиты данных и настроек сервера.

Ключевые практики:

  1. Валидируйте и фильтруйте все входные данные.

  2. Используйте подготовленные выражения для работы с базой данных.

  3. Экранируйте вывод пользователя (XSS).

  4. Защищайте загрузку файлов.

  5. Надёжно работайте с сессиями и паролями.

  6. Ограничивайте доступ к файлам и папкам.

  7. Защищайте формы от CSRF.

  8. Настраивайте сервер и актуализируйте PHP и библиотеки.

  9. Логируйте и мониторьте действия.

Следуя этим правилам, вы создадите устойчивый к атакам сайт на PHP, который безопасен для вас и ваших пользователей.

Для ответа вы можете авторизоваться