Di artikel ini, kita akan membahas Security Best Practices & Hardening untuk aplikasi Flask secara menyeluruh dan praktis.
1. Prinsip Dasar Keamanan
Berikut prinsip yang harus dipegang:
| Prinsip | Penjelasan |
|---|---|
| Defense in Depth | Jangan hanya mengandalkan satu lapisan keamanan |
| Least Privilege | Berikan hak akses seminimal mungkin |
| Fail Securely | Sistem harus gagal dalam keadaan aman |
| Input Validation | Jangan pernah percaya input dari user |
| Secure by Default | Konfigurasi default harus sudah aman |
2. Input Validation & Sanitization
Jangan Percaya Input User
Selalu validasi dan sanitasi semua input yang masuk.
from marshmallow import Schema, fields, validate
class UserSchema(Schema): username = fields.Str(required=True, validate=validate.Length(min=3, max=64)) email = fields.Email(required=True)Gunakan Marshmallow atau Pydantic untuk validasi yang kuat.
3. Proteksi CSRF (Cross-Site Request Forgery)
Flask-WTF sudah menyediakan proteksi CSRF secara default.
Aktifkan CSRF Protection
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)Pastikan semua form menggunakan {{ form.csrf_token }}.
Untuk REST API, Anda bisa menonaktifkan CSRF pada endpoint API tertentu.
4. Mencegah XSS (Cross-Site Scripting)
Escape Output
Jinja2 secara default sudah melakukan escaping. Namun tetap waspadai:
{# Aman #}<p>{{ user_input }}</p>
{# Berbahaya jika tidak diperlukan #}<p>{{ user_input | safe }}</p>Content Security Policy (CSP)
Gunakan Flask-Talisman untuk menambahkan security headers.
pip install flask-talismanfrom flask_talisman import Talisman
Talisman(app, content_security_policy={ 'default-src': "'self'", 'script-src': "'self' 'unsafe-inline'",})5. Mencegah SQL Injection
SQLAlchemy sudah sangat aman terhadap SQL Injection jika digunakan dengan benar.
Praktik yang Aman
# Amanuser = User.query.filter_by(email=email).first()
# Berbahaya (raw SQL tanpa parameter)db.engine.execute(f"SELECT * FROM users WHERE email = '{email}'")Jangan pernah menggunakan string formatting untuk query SQL.
6. Authentication & Session Security
Password Hashing
Selalu gunakan werkzeug.security:
from werkzeug.security import generate_password_hash, check_password_hash
user.password_hash = generate_password_hash(password)Session Security
app.config['SESSION_COOKIE_SECURE'] = True # Hanya dikirim via HTTPSapp.config['SESSION_COOKIE_HTTPONLY'] = True # Tidak bisa diakses via JavaScriptapp.config['SESSION_COOKIE_SAMESITE'] = 'Lax' # Proteksi CSRF tambahanapp.config['PERMANENT_SESSION_LIFETIME'] = 3600 # 1 jamGunakan JWT dengan Hati-hati
Jika menggunakan JWT:
- Gunakan algoritma yang kuat (
HS256atauRS256) - Simpan secret key dengan aman
- Implementasikan token expiration & refresh token
7. Enforce HTTPS
Selalu paksa penggunaan HTTPS di production.
from flask_talisman import Talisman
Talisman(app, force_https=True)Atau di level Nginx/Cloudflare.
8. Security Headers
Gunakan Flask-Talisman untuk menambahkan header keamanan penting:
Strict-Transport-SecurityX-Content-Type-OptionsX-Frame-OptionsContent-Security-PolicyReferrer-Policy
9. Rate Limiting
Lindungi endpoint dari brute force dan abuse.
pip install Flask-Limiterfrom flask_limiter import Limiter
limiter = Limiter(app, key_func=get_remote_address)
@app.route('/login')@limiter.limit("5 per minute")def login(): ...10. CORS Configuration
Jika aplikasi Anda memiliki frontend terpisah:
pip install flask-corsfrom flask_cors import CORS
CORS(app, origins=["https://yourfrontend.com"], supports_credentials=True)Jangan gunakan origins="*" di production.
11. Secrets Management
Jangan Hardcode Secret
# Burukapp.config['SECRET_KEY'] = 'super-secret-123'
# Baikapp.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')Gunakan:
- Environment Variables
- Docker Secrets
- HashiCorp Vault
- AWS Secrets Manager / Google Secret Manager
12. Dependency Security
Perbarui dependensi secara berkala.
pip install pip-auditpip-auditAtau gunakan Dependabot di GitHub.
13. Logging & Monitoring Keamanan
Catat aktivitas penting:
- Login gagal berulang
- Percobaan akses tanpa izin
- Perubahan data sensitif
Integrasikan dengan Sentry atau SIEM system.
14. Checklist Keamanan Flask
| No | Item Keamanan | Status |
|---|---|---|
| 1 | CSRF Protection aktif | ☐ |
| 2 | Password di-hash dengan Werkzeug | ☐ |
| 3 | Session cookie secure & httponly | ☐ |
| 4 | HTTPS di-enforce | ☐ |
| 5 | Security headers via Talisman | ☐ |
| 6 | Rate limiting diterapkan | ☐ |
| 7 | Input divalidasi dengan Marshmallow | ☐ |
| 8 | Secrets disimpan di environment | ☐ |
| 9 | Dependensi diperiksa secara berkala | ☐ |
| 10 | Error message tidak membocorkan info | ☐ |
Kesimpulan
Keamanan aplikasi Flask bukan hanya tentang menambahkan satu atau dua fitur, melainkan tentang membangun budaya keamanan sejak awal pengembangan.
Beberapa langkah paling berdampak:
- Gunakan Flask-Talisman untuk security headers
- Terapkan Rate Limiting
- Hash password dengan benar
- Validasi semua input
- Simpan secret di environment variables
- Enforce HTTPS
- Update dependensi secara rutin
Keamanan adalah proses berkelanjutan, bukan proyek sekali selesai.
.webp)