Files
erv-ticket-dev/SMS_VERIFICATION_README.md
Fedor 2c516362df feat: Secure SMS verification with Redis (Predis)
- 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
2026-01-15 15:40:13 +03:00

119 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Безопасная SMS верификация
## Что было исправлено
### Проблемы безопасности (исправлены):
1.**Код генерируется на сервере** (раньше на клиенте в JavaScript)
2.**Код хранится в Redis** (раньше в переменной JavaScript)
3.**Проверка кода на сервере** (раньше только на клиенте)
4.**Креды вынесены в .env** (раньше хардкод в коде)
5.**Rate limiting** - ограничение на количество отправок SMS (5 в час)
6.**Защита от брутфорса** - блокировка после 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 SigmaSMS
- `SMS_LOGIN` - Логин для SigmaSMS
- `SMS_PASSWORD` - Пароль для SigmaSMS
- `SMS_TOKEN` - Токен (опционально, если есть)
- `SMS_SENDER` - Имя отправителя
- `REDIS_HOST` - Хост Redis
- `REDIS_PORT` - Порт Redis
- `REDIS_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:
```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` файле
## Тестирование
1. Проверьте подключение к Redis:
```bash
php -r "require 'env_loader.php'; require 'sms-verify.php';"
```
2. Проверьте отправку SMS:
```bash
curl -X POST "http://your-domain/sms-verify.php?action=send" \
-d "phonenumber=79991234567"
```
3. Проверьте проверку кода:
```bash
curl -X POST "http://your-domain/sms-verify.php?action=verify" \
-d "phonenumber=79991234567&code=123456"
```