Автоматизация аудита безопасности веб-приложений с помощью 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) и анализ бизнес-логики приложения. Однако они создают фундамент безопасности, оперативно выявляя грубые ошибки конфигурации и известные уязвимости, что значительно повышает общую устойчивость веб-проекта к атакам.