← Назад к вопросам

На что нужно обращать внимание чтобы приложение было защищено?

1.7 Middle🔥 192 комментариев
#Безопасность

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

🔒 Основные аспекты защиты PHP Backend-приложения

Защита backend-приложения — это комплексный процесс, охватывающий все уровни приложения: от кода до инфраструктуры. Я сосредоточусь на ключевых областях, требующих особого внимания при разработке на PHP.


1. Валидация и санация входных данных

Все данные извне считаются недоверенными. Это правило номер один.

  • Валидация на стороне сервера: Никогда не полагайтесь на фронтенд. Проверяйте тип, длину, формат и допустимые значения. Для этого используйте фильтры PHP или библиотеки (например, respect/validation или встроенные в ваш фреймворк).
  • Санация (очистка): Преобразуйте данные в безопасный формат перед использованием. Например, для вывода в HTML используйте htmlspecialchars(), для SQL-запросов — подготовленные выражения.
// ПЛОХО: Уязвимость для SQL-инъекции
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];

// ХОРОШО: Подготовленное выражение с PDO
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $_GET['id']]);

2. Защита от аутентификации и авторизации

  • Хранение паролей: Всегда используйте современные хеш-функции, такие как password_hash() с алгоритмом PASSWORD_ARGON2ID или PASSWORD_BCRYPT. Никогда не храните пароли в открытом виде или с устаревшими алгоритмами (md5, sha1).
  • Сессии: Генерируйте новые ID сессии после успешного входа (session_regenerate_id(true)). Устанавливайте корректные параметры cookie (HttpOnly, Secure, SameSite) для защиты от XSS и перехвата сессии.
  • Ограничение попыток входа: Реализуйте механизм блокировки после N неудачных попыток для предотвращения брутфорса.
  • Принцип наименьших привилегий: Пользователь и каждая часть системы должны иметь доступ только к тем ресурсам, которые необходимы для их работы.

3. Защита от уязвимостей OWASP Top 10

  • Инъекции (SQL, NoSQL, командные): Используйте подготовленные выражения (Prepared Statements) или Query Builder. Никогда не интерполируйте переменные напрямую в строки запроса.
  • Межсайтовый скриптинг (XSS): Все данные, выводимые в HTML, JS или CSS, должны быть экранированы. Используйте контекстно-зависимое экранирование. Рассмотрите возможность использования шаблонизаторов (Twig, Blade), которые делают это по умолчанию.
  • Межсайтовая подделка запроса (CSRF): Защищайте все state-changing операции (POST, PUT, DELETE) с помощью CSRF-токенов. Фреймворки (Laravel, Symfony) предоставляют встроенные механизмы.
  • Небезопасные десериализации: Избегайте десериализации данных, поступающих от пользователя. Если это необходимо, используйте строгую проверку типов и сигнатур, рассматривайте альтернативы (например, JSON).
  • Использование компонентов с известными уязвимостями: Регулярно обновляйте зависимости (Composer) и отслеживайте уязвимости с помощью инструментов вроде roave/security-advisories или GitHub Dependabot.

4. Безопасная конфигурация и инфраструктура

  • Ошибки и логирование: На продакшене отключайте вывод ошибок (display_errors = Off). Настройте журналирование в безопасное место, но не записывайте в логи конфиденциальные данные (пароли, токены, персональные данные).
  • Заголовки HTTP: Используйте security-заголовки для повышения безопасности браузера:
    // Пример в .htaccess или через PHP header()
    Header set X-Content-Type-Options "nosniff"
    Header set X-Frame-Options "DENY"
    Header set Content-Security-Policy "default-src 'self';"
    Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    
  • Файловая система: Ограничивайте права доступа к файлам. Папки с загружаемыми пользователем файлами должны быть доступны только на чтение для веб-сервера и располагаться вне корневой веб-директории.
  • HTTPS: Обязательно используйте TLS/SSL на всех страницах, особенно при передаче аутентификационных данных.

5. Работа с файлами и загрузками

  • Валидация: Проверяйте MIME-тип, расширение, размер файла. Не доверяйте данным $_FILES['file']['type'], проверяйте реальный тип (например, с помощью finfo_file()).
  • Переименование: Сохраняйте файлы под сгенерированными именами (например, UUID) и с безопасными расширениями.
  • Обработка: Если это изображения, пересоздавайте их с помощью GD или Imagick, чтобы удалить возможные вредоносные вложения.
// Пример безопасной проверки загружаемого изображения
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['upload']['tmp_name']);
$allowed = ['image/jpeg', 'image/png'];

if (!in_array($mime, $allowed)) {
    throw new InvalidArgumentException('Invalid file type.');
}

6. Безопасность кода и зависимостей

  • Минимизация кодовой базы: Удаляйте неиспользуемый код, файлы (например, phpinfo.php, старые скрипты установки).
  • Композер: Используйте composer install --no-dev на продакшене. Регулярно обновляйте пакеты (composer update).
  • PHP-конфигурация: Используйте актуальную версию PHP (минимум 8.1+). Отключайте опасные функции в php.ini (например, exec, system, eval, shell_exec).

Практический подход:

Безопасность — это не функция, а процесс. Внедрите:

  • Статический анализ кода (SAST) — PHPStan, Psalm, SonarQube.
  • Периодический аудит безопасности.
  • План обновлений для PHP и всех зависимостей.
  • Обучение команды основам безопасной разработки (Security Champions).

Начинайте с малого: внедрите подготовленные выражения, хеширование паролей и CSRF-токены. Затем, итеративно, закрывайте другие векторы атак, следуя принципу глубокой эшелонированной защиты (Defense in Depth).