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
This commit is contained in:
118
SMS_VERIFICATION_README.md
Normal file
118
SMS_VERIFICATION_README.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# Безопасная 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"
|
||||
```
|
||||
Reference in New Issue
Block a user