Безопасность и валидация данных
Localzet Server включает множество механизмов безопасности для защиты от атак и обеспечения целостности данных.
Принципы безопасности
1. Изоляция процессов
Каждый worker процесс работает изолированно:
- Отказоустойчивость: Сбой одного процесса не влияет на другие
- Память: Полная изоляция памяти между процессами
- Привилегии: Возможность запуска от непривилегированного пользователя
2. Принцип наименьших привилегий
Запуск от непривилегированного пользователя:
$server->user = 'www-data';
$server->group = 'www-data';
// После привязки к порту процессы переключаются на этого пользователя
Преимущества:
- Минимальные привилегии процесса
- Ограничение доступа к системным ресурсам
- Снижение риска при компрометации
3. Валидация входных данных
Все входящие данные валидируются на нескольких уровнях.
Валидация на уровне протокола
HTTP протокол
1. Валидация методов:
// Проверка поддерживаемых HTTP методов
const SUPPORTED_METHODS = [
'GET', 'POST', 'OPTIONS',
'HEAD', 'DELETE', 'PUT', 'PATCH'
];
foreach (SUPPORTED_METHODS as $method) {
if (str_starts_with($header, $method . ' ')) {
$methodValid = true;
break;
}
}
if (!$methodValid) {
$connection->close(format_http_response(400));
return 0;
}
2. Ограничение размера заголовков:
const MAX_HEADER_SIZE = 16384; // 16KB
if (strlen($buffer) >= MAX_HEADER_SIZE) {
$connection->close(format_http_response(413, 'Request Header Too Large'));
return 0;
}
3. Валидация Content-Length:
if (preg_match('/Content-Length:\s*(\d+)/is', $header, $matches)) {
$contentLength = (int)$matches[1];
// Проверка на отрицательные значения
if ($contentLength < 0) {
$connection->close(format_http_response(400));
return 0;
}
// Проверка максимального размера
if ($length > $connection->maxPackageSize) {
$connection->close(format_http_response(413));
return 0;
}
}
WebSocket протокол
1. Валидация рукопожатия:
// Проверка обязательных заголовков
if (!preg_match("/Sec-WebSocket-Key:\s*(.*?)\r\n/i", $header)) {
return false; // Не WebSocket запрос
}
// Валидация Origin (если требуется)
$origin = $request->header('origin');
if (!isAllowedOrigin($origin)) {
$connection->close(new Response(403));
return 0;
}
2. Защита от фрагментированных атак:
// Ограничение размера фрейма
if ($frameLength > MAX_FRAME_SIZE) {
$connection->close();
return false;
}
// Ограничение количества фрагментов
if ($fragmentCount > MAX_FRAGMENTS) {
$connection->close();
return false;
}
Защита от переполнения буферов
Ограничение размеров
Буфер отправки:
public int $maxSendBufferSize = 1048576; // 1MB по умолчанию
// Проверка перед добавлением
if (strlen($this->sendBuffer) + strlen($data) > $this->maxSendBufferSize) {
// Буфер переполнен
if ($this->onBufferFull) {
($this->onBufferFull)($this);
}
return false;
}
Размер пакета:
public int $maxPackageSize = 10485760; // 10MB по умолчанию
// Валидация в протоколе
if ($packageLength > $connection->maxPackageSize) {
$connection->close(format_http_response(413));
return false;
}
Backpressure механизм
При переполнении буфера:
- Вызывается
onBufferFullcallback - Приостанавливается прием данных (
pauseRecv()) - Когда буфер освобождается (
onBufferDrain) - Возобновляется прием данных (
resumeRecv())
Это предотвращает неконтролируемое использование памяти.
Защита от атак
1. Защита от DoS
Ограничение соединений:
// Ограничение количества соединений на процесс
if (count($server->connections) > MAX_CONNECTIONS_PER_PROCESS) {
$newConnection->close();
return;
}
Rate limiting:
// Подсчет запросов от IP
$ip = $connection->getRemoteIp();
$requests[$ip] = ($requests[$ip] ?? 0) + 1;
if ($requests[$ip] > MAX_REQUESTS_PER_SECOND) {
$connection->close();
return;
}
// Сброс счетчика через таймер
Timer::delay(1.0, function() use ($ip) {
unset($requests[$ip]);
});
2. Защита от инъекций
Валидация заголовков HTTP:
// Проверка на опасные заголовки
$dangerousHeaders = [
'Content-Length' => function($value) {
return is_numeric($value) && $value >= 0;
},
'Host' => function($value) {
return filter_var($value, FILTER_VALIDATE_DOMAIN) !== false;
}
];
foreach ($request->header() as $name => $value) {
if (isset($dangerousHeaders[$name])) {
if (!$dangerousHeaders[$name]($value)) {
$connection->close(new Response(400));
return;
}
}
}
3. Защита от Path Traversal
Валидация путей файлов:
public static function encodeFileResponse($response, $connection) {
$file = $data->file['file'];
// Нормализация пути
$file = realpath($file);
// Проверка на выход за пределы разрешенной директории
$allowedPath = realpath('/var/www/uploads');
if (strpos($file, $allowedPath) !== 0) {
$connection->close(new Response(403));
return '';
}
// Остальная логика...
}
Безопасная обработка данных
Устранение небезопасных практик
1. Избежание extract():
// НЕБЕЗОПАСНО:
extract($data); // Может перезаписать переменные
// БЕЗОПАСНО:
$server = $data['server'] ?? null;
$status = $data['status'] ?? 0;
$pid = $data['pid'] ?? 0;
2. Валидация типов:
// Всегда проверяйте типы перед использованием
if (!is_string($file) || !is_file($file)) {
throw new InvalidArgumentException('Invalid file');
}
// Проверка массивов
if (!is_array($data->file)) {
return; // Игнорируем неверный формат
}
3. Обработка граничных случаев:
// Проверка на null и пустые строки
$bodyLen = ($body !== null && $body !== '')
? strlen($body)
: null;
// Валидация диапазонов
if ($offset < 0 || $offset >= $fileSize || $bodyLen <= 0) {
$connection->close(new Response(416));
return '';
}
SSL/TLS безопасность
Настройка безопасного SSL
Рекомендуемые параметры:
$context = [
'ssl' => [
'local_cert' => '/path/to/cert.pem',
'local_pk' => '/path/to/key.pem',
// Безопасность
'verify_peer' => true,
'verify_peer_name' => true,
'allow_self_signed' => false,
// Минимальная версия TLS
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
// Отключение слабых шифров
'ciphers' => 'HIGH:!aNULL:!MD5',
// SNI поддержка
'SNI_enabled' => true,
// Отключение сжатия (защита от CRIME)
'disable_compression' => true,
]
];
$server = new Server('ssl://0.0.0.0:443', $context);
Валидация сертификатов
// Проверка сертификата клиента
if ($connection->transport === 'ssl') {
$cert = stream_context_get_params($socket)['options']['ssl']['peer_certificate'];
// Валидация сертификата
if (!validateCertificate($cert)) {
$connection->close();
return;
}
}
Безопасность сессий
Управление сессиями
Безопасные настройки:
// HTTP-only cookies (защита от XSS)
$response->cookie('session_id', $sessionId, [
'httponly' => true,
'secure' => true, // Только HTTPS
'samesite' => 'Strict'
]);
// Валидация session ID
function validateSessionId($sessionId) {
// Проверка формата
if (!preg_match('/^[a-zA-Z0-9]{32,128}$/', $sessionId)) {
return false;
}
// Проверка существования
return sessionExists($sessionId);
}
Защита от Session Fixation
// Регенерация session ID при аутентификации
if ($authenticated) {
$oldSessionId = session_id();
session_regenerate_id(true);
// Удаление старой сессии
deleteSession($oldSessionId);
}
Логирование и мониторинг безопасности
Логирование подозрительной активности
// Логирование подозрительных запросов
function logSuspiciousActivity($connection, $reason) {
$log = sprintf(
"[%s] Suspicious activity from %s: %s",
date('Y-m-d H:i:s'),
$connection->getRemoteAddress(),
$reason
);
file_put_contents('/var/log/security.log', $log . "\n", FILE_APPEND);
}
// Использование
if ($requestSize > MAX_REASONABLE_SIZE) {
logSuspiciousActivity($connection, 'Oversized request');
$connection->close(new Response(413));
}
Мониторинг атак
// Подсчет атак от IP
static $attackCounts = [];
function detectAttack($connection, $attackType) {
$ip = $connection->getRemoteIp();
$attackCounts[$ip][$attackType] = ($attackCounts[$ip][$attackType] ?? 0) + 1;
// Блокировка при превышении порога
if ($attackCounts[$ip][$attackType] > ATTACK_THRESHOLD) {
blockIP($ip);
$connection->close();
}
}
Рекомендации по безопасности
1. Регулярные обновления
- Обновляйте Localzet Server до последней версии
- Следите за security advisories
- Применяйте патчи безопасности своевременно
2. Минимальная конфигурация
- Отключайте неиспользуемые протоколы
- Ограничивайте доступ по IP где возможно
- Используйте firewall для дополнительной защиты
3. Мониторинг
- Логируйте все подозрительные действия
- Настройте алерты на аномалии
- Регулярно анализируйте логи
4. Тестирование безопасности
- Проводите penetration testing
- Используйте инструменты сканирования уязвимостей
- Тестируйте на перегрузку (stress testing)
Соответствие стандартам
OWASP Top 10
Localzet Server помогает защититься от:
- Injection - Валидация всех входных данных
- Broken Authentication - Безопасные сессии
- Sensitive Data Exposure - Поддержка SSL/TLS
- XML External Entities - Валидация парсинга
- Broken Access Control - Изоляция процессов
- Security Misconfiguration - Безопасные настройки по умолчанию
- XSS - Санитизация вывода
- Insecure Deserialization - Валидация данных
- Using Components with Known Vulnerabilities - Регулярные обновления
- Insufficient Logging & Monitoring - Встроенное логирование
Подробную информацию по использованию API можно найти в разделе API документации, где описаны все доступные методы и возможности сервера.

