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