- Added Predis library for Redis connection (no PHP extension required) - Server-side SMS code generation and storage in Redis - Rate limiting and brute-force protection - Integration with n8n webhook for SMS sending - Environment variables moved to .env file - Fixed policy verification endpoint - Added file-based fallback if Redis unavailable
4.6 KiB
4.6 KiB
Безопасная SMS верификация
Что было исправлено
Проблемы безопасности (исправлены):
- ✅ Код генерируется на сервере (раньше на клиенте в JavaScript)
- ✅ Код хранится в Redis (раньше в переменной JavaScript)
- ✅ Проверка кода на сервере (раньше только на клиенте)
- ✅ Креды вынесены в .env (раньше хардкод в коде)
- ✅ Rate limiting - ограничение на количество отправок SMS (5 в час)
- ✅ Защита от брутфорса - блокировка после 10 неудачных попыток (15 минут)
Новые файлы
env_loader.php
Утилита для загрузки переменных из .env файла.
sms-verify.php
Новый безопасный API для SMS верификации с тремя endpoints:
-
POST /sms-verify.php?action=send- Отправка SMS кода- Параметры:
phonenumber - Возвращает:
{success: true, message: "..."}
- Параметры:
-
POST /sms-verify.php?action=verify- Проверка кода- Параметры:
phonenumber,code - Возвращает:
{success: true, token: "..."}- токен для последующей проверки
- Параметры:
-
POST /sms-verify.php?action=check_verified- Проверка статуса верификации- Параметры:
phonenumber,token - Возвращает:
{success: true, verified: true/false}
- Параметры:
Изменения в существующих файлах
js/common.js
- Функция
send_sms()теперь отправляет запрос на сервер - Проверка кода теперь выполняется на сервере через AJAX
- Добавлен обработчик для повторной отправки SMS из модального окна
.env
Используются следующие переменные:
SMS_API_URL- URL API SigmaSMSSMS_LOGIN- Логин для SigmaSMSSMS_PASSWORD- Пароль для SigmaSMSSMS_TOKEN- Токен (опционально, если есть)SMS_SENDER- Имя отправителяREDIS_HOST- Хост RedisREDIS_PORT- Порт RedisREDIS_PASSWORD- Пароль Redis
Логирование
Все операции логируются в файл:
logs/sms_verify.log
Безопасность
Rate Limiting
- Максимум 5 отправок SMS на номер в час
- Максимум 10 попыток проверки кода за 15 минут
Хранение кодов
- Коды хранятся в Redis с TTL 10 минут
- После успешной проверки код удаляется из Redis
- Токен верификации действует 1 час
Защита от брутфорса
- После 10 неудачных попыток номер блокируется на 15 минут
- Счетчик попыток сбрасывается после успешной проверки
Миграция со старого API
Старый файл sms-test.php оставлен для обратной совместимости, но рекомендуется использовать новый sms-verify.php.
Изменения в JavaScript:
// Старый код (небезопасный):
var sended_code = Math.floor(Math.random()*(999999-100000+1)+100000);
if($('.sms-checking input[type="text"]').val() == sended_code) {
// проверка на клиенте
}
// Новый код (безопасный):
$.ajax({
url: 'sms-verify.php?action=send',
// отправка на сервер
});
$.ajax({
url: 'sms-verify.php?action=verify',
// проверка на сервере
});
Требования
- PHP с расширением Redis
- Доступ к Redis серверу
- Настроенные креды в
.envфайле
Тестирование
- Проверьте подключение к Redis:
php -r "require 'env_loader.php'; require 'sms-verify.php';"
- Проверьте отправку SMS:
curl -X POST "http://your-domain/sms-verify.php?action=send" \
-d "phonenumber=79991234567"
- Проверьте проверку кода:
curl -X POST "http://your-domain/sms-verify.php?action=verify" \
-d "phonenumber=79991234567&code=123456"