Files
erv-ticket-dev/SMS_VERIFICATION_README.md

119 lines
4.6 KiB
Markdown
Raw Permalink Normal View History

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