fix(security): timing attack, rate limiter за прокси, хардкод ID в скриптах (20.09.2026)

This commit is contained in:
2026-09-20 17:49:58 +00:00
parent 67709cb6d2
commit e15a228f80
4 changed files with 87 additions and 23 deletions
+39 -11
View File
@@ -3,29 +3,57 @@
Очищает ВСЕ данные по играм, урокам, чат-учителю, достижениям.
Не трогает: users (остаётся), tts_cache (аудио).
Запуск: python3 full_reset.py
Запуск: python3 full_reset.py <USER_ID>
🔧 ФИКС (20.09.2026): убран хардкод USER_ID — теперь через аргумент + подтверждение.
Раньше: USER_ID = 6694989403 (мог случайно снести прогресс на проде).
Теперь: python3 full_reset.py 123456789 → запросит подтверждение "YES".
"""
import asyncio
import sys
import asyncpg
from config import DB_CONFIG
USER_ID = 6694989403
# ============ Проверка аргументов ============
if len(sys.argv) < 2:
print("❌ Использование: python3 full_reset.py <USER_ID>")
print(" Пример: python3 full_reset.py 6694989403")
sys.exit(1)
try:
USER_ID = int(sys.argv[1])
except ValueError:
print(f"❌ USER_ID должен быть числом, получено: {sys.argv[1]}")
sys.exit(1)
confirm = input(
f"⚠️ Удалить ВСЕ данные пользователя {USER_ID}? Напиши YES для подтверждения: "
)
if confirm != "YES":
print("❌ Отменено.")
sys.exit(0)
# ============ Основная логика ============
async def main():
pool = await asyncpg.create_pool(**DB_CONFIG)
async with pool.acquire() as conn:
# Проверяем пользователя
user_exists = await conn.fetchval("""
SELECT 1 FROM users WHERE telegram_id = $1
""", USER_ID)
if not user_exists:
print(f"❌ Пользователь {USER_ID} не найден!")
await pool.close()
return
# Список таблиц для очистки (по user_id)
user_tables = [
"user_progress", # Филворды
@@ -46,9 +74,9 @@ async def main():
"daily_logins", # Входы
"ai_user_context", # AI-контекст
]
total_deleted = 0
for table in user_tables:
try:
result = await conn.execute(f"""
@@ -59,14 +87,14 @@ async def main():
print(f"🗑️ {table}: удалено {affected}")
except Exception as e:
print(f"⚠️ {table}: {str(e)}")
# Сбрасываем last_completed_level
await conn.execute("""
UPDATE users SET last_completed_level = 0, current_level = 'A1'
UPDATE users SET last_completed_level = 0, current_level = 'A1'
WHERE telegram_id = $1
""", USER_ID)
print("✅ last_completed_level = 0, current_level = A1")
# Очищаем архив ответов
try:
result = await conn.execute("""
@@ -75,7 +103,7 @@ async def main():
print(f"🗑️ user_learning_answers_archive: удалено {result.split()[-1]}")
except Exception as e:
print(f"⚠️ archive: {str(e)}")
await pool.close()
print(f"\n🎉 Готово! Удалено {total_deleted} записей.")
print("Можно начинать тестирование с чистого листа!")