- 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
119 lines
4.6 KiB
Markdown
119 lines
4.6 KiB
Markdown
# Безопасная 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"
|
||
```
|