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

4.6 KiB
Raw Blame 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:

// Старый код (небезопасный):
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:
php -r "require 'env_loader.php'; require 'sms-verify.php';"
  1. Проверьте отправку SMS:
curl -X POST "http://your-domain/sms-verify.php?action=send" \
  -d "phonenumber=79991234567"
  1. Проверьте проверку кода:
curl -X POST "http://your-domain/sms-verify.php?action=verify" \
  -d "phonenumber=79991234567&code=123456"