remove blacklist logout feature
parent
e4c68b2894
commit
dc1d65ac15
|
|
@ -491,11 +491,6 @@ Untuk mencegah penebakan token secara massal, terutama pada jaringan WiFi sekola
|
||||||
- **Rate Limiting**: Endpoint `/api/login` dibatasi maksimal **50 request per menit per IP**. Angka ini diatur untuk mengakomodasi satu kelas (50 siswa) yang login bersamaan tanpa saling memblokir.
|
- **Rate Limiting**: Endpoint `/api/login` dibatasi maksimal **50 request per menit per IP**. Angka ini diatur untuk mengakomodasi satu kelas (50 siswa) yang login bersamaan tanpa saling memblokir.
|
||||||
- **Tarpitting (Login Delay)**: Setiap percobaan login yang **gagal** akan ditahan selama **1.5 detik** sebelum server memberikan respons. Ini melumpuhkan efektivitas alat brute-force otomatis tanpa mengganggu pengalaman siswa asli yang hanya sesekali salah ketik.
|
- **Tarpitting (Login Delay)**: Setiap percobaan login yang **gagal** akan ditahan selama **1.5 detik** sebelum server memberikan respons. Ini melumpuhkan efektivitas alat brute-force otomatis tanpa mengganggu pengalaman siswa asli yang hanya sesekali salah ketik.
|
||||||
|
|
||||||
### 3. Session Invalidation (Token Blacklist)
|
|
||||||
Mekanisme logout server-side untuk memastikan token tidak bisa digunakan kembali setelah sesi berakhir.
|
|
||||||
- **Mekanisme**: Menggunakan `LOGOUT_BLACKLIST` (in-memory set) di Flask backend.
|
|
||||||
- **Flow**: Saat user klik logout, token ditambahkan ke blacklist. Semua request berikutnya dengan token tersebut akan ditolak oleh `validate_token()`.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Touch Crosshair System (CircuitJS)
|
## Touch Crosshair System (CircuitJS)
|
||||||
|
|
@ -602,7 +597,7 @@ Redo (Ctrl+Shift+Z / toolbar button)
|
||||||
- [x] Velxio integration di Elemes (bridge, parsing, UI, evaluasi)
|
- [x] Velxio integration di Elemes (bridge, parsing, UI, evaluasi)
|
||||||
- [x] Mobile wiring UX (pinch-zoom preserve wire, crosshair alignment)
|
- [x] Mobile wiring UX (pinch-zoom preserve wire, crosshair alignment)
|
||||||
- [x] Wire undo/redo (snapshot-based, Ctrl+Z/Ctrl+Shift+Z, toolbar button, mobile-friendly)
|
- [x] Wire undo/redo (snapshot-based, Ctrl+Z/Ctrl+Shift+Z, toolbar button, mobile-friendly)
|
||||||
- [x] Security Review & Hardening (Cookie security, Rate limiting, Tarpitting, Blacklisting)
|
- [x] Security Review & Hardening (Cookie security, Rate limiting, Tarpitting)
|
||||||
- [x] Contoh lesson Arduino (LED Blink)
|
- [x] Contoh lesson Arduino (LED Blink)
|
||||||
- [ ] PWA (service worker, offline caching)
|
- [ ] PWA (service worker, offline caching)
|
||||||
- [ ] Contoh lesson Arduino tambahan (2-3 lagi)
|
- [ ] Contoh lesson Arduino tambahan (2-3 lagi)
|
||||||
|
|
|
||||||
|
|
@ -127,10 +127,11 @@ response.set_cookie('student_token', token, httponly=True, secure=False, samesit
|
||||||
- **Insider Threat**: Guru yang sudah tidak aktif masih bisa akses jika tokennya tidak dihapus dari CSV.
|
- **Insider Threat**: Guru yang sudah tidak aktif masih bisa akses jika tokennya tidak dihapus dari CSV.
|
||||||
|
|
||||||
**Task Perbaikan**:
|
**Task Perbaikan**:
|
||||||
- [x] **Token Blacklist**: Implementasikan in-memory blacklist untuk token yang sudah logout.
|
- [ ] **Token Blacklist**: (Sempat diimplementasi, namun dihapus agar user/guru tidak terkunci saat pengujian token).
|
||||||
- [ ] **Token Versioning**: Tambahkan timestamp/version di token, invalidate jika mismatch dengan database.
|
- [ ] **Token Versioning**: Tambahkan timestamp/version di token, invalidate jika mismatch dengan database.
|
||||||
- [ ] **Force Logout API**: Endpoint untuk guru force logout semua session siswa (useful saat ujian).
|
- [ ] **Force Logout API**: Endpoint untuk guru force logout semua session siswa (useful saat ujian).
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 🟠 7. HTTP Security Headers (MEDIUM-HIGH RISK)
|
### 🟠 7. HTTP Security Headers (MEDIUM-HIGH RISK)
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import time
|
||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
|
|
||||||
from extensions import limiter
|
from extensions import limiter
|
||||||
from services.token_service import validate_token, blacklist_token
|
from services.token_service import validate_token
|
||||||
|
|
||||||
auth_bp = Blueprint('auth', __name__)
|
auth_bp = Blueprint('auth', __name__)
|
||||||
|
|
||||||
|
|
@ -53,10 +53,6 @@ def login():
|
||||||
def logout():
|
def logout():
|
||||||
"""Handle student logout."""
|
"""Handle student logout."""
|
||||||
try:
|
try:
|
||||||
token = request.cookies.get('student_token')
|
|
||||||
if token:
|
|
||||||
blacklist_token(token)
|
|
||||||
|
|
||||||
response = jsonify({'success': True, 'message': 'Logout successful'})
|
response = jsonify({'success': True, 'message': 'Logout successful'})
|
||||||
response.set_cookie('student_token', '', expires=0)
|
response.set_cookie('student_token', '', expires=0)
|
||||||
return response
|
return response
|
||||||
|
|
|
||||||
|
|
@ -8,15 +8,6 @@ import os
|
||||||
|
|
||||||
from config import TOKENS_FILE
|
from config import TOKENS_FILE
|
||||||
|
|
||||||
# In-memory blacklist for tokens that have logged out
|
|
||||||
LOGOUT_BLACKLIST = set()
|
|
||||||
|
|
||||||
|
|
||||||
def blacklist_token(token):
|
|
||||||
"""Add a token to the logout blacklist."""
|
|
||||||
if token:
|
|
||||||
LOGOUT_BLACKLIST.add(token)
|
|
||||||
|
|
||||||
|
|
||||||
def get_teacher_token():
|
def get_teacher_token():
|
||||||
"""Return the teacher token (first data row in CSV)."""
|
"""Return the teacher token (first data row in CSV)."""
|
||||||
|
|
@ -38,9 +29,6 @@ def is_teacher_token(token):
|
||||||
|
|
||||||
def validate_token(token):
|
def validate_token(token):
|
||||||
"""Validate if a token exists in the CSV file and return student info."""
|
"""Validate if a token exists in the CSV file and return student info."""
|
||||||
if not token or token in LOGOUT_BLACKLIST:
|
|
||||||
return None
|
|
||||||
|
|
||||||
if not os.path.exists(TOKENS_FILE):
|
if not os.path.exists(TOKENS_FILE):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue