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

Автор: Разработчик