Автоматизация аудита безопасности веб-приложений с помощью PHP-скриптов
Ручная проверка безопасности сайта — трудоемкий и подверженный ошибкам процесс. Вместо этого можно создать набор PHP-скриптов, которые будут выполнять рутинные проверки автоматически. Это особенно полезно для разработчиков, поддерживающих несколько проектов, или для включения в CI/CD-пайплайны. Рассмотрим практические примеры таких скриптов.
Зачем автоматизировать аудит безопасности?
Регулярный аудит помогает выявить уязвимости до того, как ими воспользуются злоумышленники. Автоматизация решает несколько ключевых задач: обеспечивает постоянство проверок, экономит время и позволяет отслеживать изменения в уровне безопасности проекта после внесения правок в код или конфигурацию.
Базовые проверки HTTP-заголовков безопасности
Многие уязвимости, такие как межсайтовый скриптинг (XSS) или кликджекинг, предотвращаются корректной настройкой HTTP-заголовков. Напишем скрипт для их анализа.
'Защита от кликджекинга', 'X-Content-Type-Options' => 'Блокировка MIME-sniffing', 'Strict-Transport-Security' => 'Принудительное использование HTTPS', 'Content-Security-Policy' => 'Политика безопасности контента', ]; $report = []; foreach ($criticalHeaders as $header => $description) { if (isset($headers[$header])) { $report[] = "✅ $header: {$headers[$header]} ($description)"; } else { $report[] = "❌ $header: ОТСУТСТВУЕТ ($description)"; } } return $report;}// Использование$report = checkSecurityHeaders('https://ваш-сайт.ru');file_put_contents('security_headers.log', implode("n", $report));?>Проверка конфигурации PHP на наличие опасных настроек
Некорректные настройки php.ini могут ослабить защиту приложения. Следующий скрипт анализирует ключевые директивы.
Ключевые директивы для проверки
- allow_url_fopen и allow_url_include: Включение этих опций может привести к удаленному выполнению кода (RFI).
- display_errors: Вывод ошибок в продакшене раскрывает чувствительную информацию.
- session.cookie_httponly и session.cookie_secure: Защита cookies от доступа через JavaScript и передача только по HTTPS.
['expected' => false, 'risk' => 'RFI'], 'allow_url_include' => ['expected' => false, 'risk' => 'RFI'], 'display_errors' => ['expected' => false, 'risk' => 'Информационная утечка'], 'session.cookie_httponly' => ['expected' => true, 'risk' => 'XSS-атаки'], 'session.cookie_secure' => ['expected' => true, 'risk' => 'Перехват сессии'], ]; $report = ["Аудит конфигурации PHP:n"]; foreach ($checks as $directive => $data) { $current = ini_get($directive); $currentBool = filter_var($current, FILTER_VALIDATE_BOOLEAN); $status = ($currentBool === $data['expected']) ? '✅' : '❌'; $report[] = sprintf("%s %s = %s (Ожидалось: %s). Риск: %s", $status, $directive, $current, $data['expected'] ? 'On' : 'Off', $data['risk'] ); } return implode("n", $report);}echo auditPhpConfiguration();?>Сканирование директорий на наличие подозрительных файлов
Взломанные сайты часто содержат скрипты-бэкдоры или шеллы, загруженные в файловую систему. Простое сканирование по сигнатурам может помочь их обнаружить.
isFile()) { $filename = $file->getFilename(); $path = $file->getPathname(); // Проверка по имени файла foreach ($signatures as $sig) { if (stripos($filename, $sig) !== false) { $found[] = "ПО ИМЕНИ: $path (сигнатура: '$sig')"; continue 2; } } // Проверка по содержимому (для текстовых файлов) $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); if (in_array($ext, ['php', 'txt', 'js', 'html', 'phtml'])) { $content = file_get_contents($path); foreach ($signatures as $sig) { if (stripos($content, $sig) !== false) { $found[] = "ПО СОДЕРЖИМОМУ: $path (сигнатура: '$sig')"; break; } } } } } return $found;}// Использование (с большой осторожностью!)// $results = scanForSuspiciousFiles('/var/www/');?>Интеграция в процесс разработки
Эти скрипты можно не запускать вручную, а встроить в автоматизированный процесс. Например, создать задачу в планировщике Cron для ежедневного запуска аудита и отправки отчета на email. Или добавить выполнение базовых проверок в хуки Git (pre-commit или pre-push) для анализа кода перед отправкой в репозиторий.
Пример отправки отчета по электронной почте
Важно понимать, что такие скрипты — лишь первый этап аудита. Они не заменяют глубокое тестирование на проникновение (pentest) и анализ бизнес-логики приложения. Однако они создают фундамент безопасности, оперативно выявляя грубые ошибки конфигурации и известные уязвимости, что значительно повышает общую устойчивость веб-проекта к атакам.