Security Best Practices & Hardening untuk Aplikasi Flask

Security Best Practices & Hardening untuk Aplikasi Flask

Sun Jun 07 2026
477 words · 4 minutes

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:

PrinsipPenjelasan
Defense in DepthJangan hanya mengandalkan satu lapisan keamanan
Least PrivilegeBerikan hak akses seminimal mungkin
Fail SecurelySistem harus gagal dalam keadaan aman
Input ValidationJangan pernah percaya input dari user
Secure by DefaultKonfigurasi 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.

Terminal window
pip install flask-talisman
from 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

# Aman
user = 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 HTTPS
app.config['SESSION_COOKIE_HTTPONLY'] = True # Tidak bisa diakses via JavaScript
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax' # Proteksi CSRF tambahan
app.config['PERMANENT_SESSION_LIFETIME'] = 3600 # 1 jam

Gunakan JWT dengan Hati-hati

Jika menggunakan JWT:

  • Gunakan algoritma yang kuat (HS256 atau RS256)
  • 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-Security
  • X-Content-Type-Options
  • X-Frame-Options
  • Content-Security-Policy
  • Referrer-Policy

9. Rate Limiting

Lindungi endpoint dari brute force dan abuse.

Terminal window
pip install Flask-Limiter
from 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:

Terminal window
pip install flask-cors
from flask_cors import CORS
CORS(app, origins=["https://yourfrontend.com"], supports_credentials=True)

Jangan gunakan origins="*" di production.


11. Secrets Management

Jangan Hardcode Secret

# Buruk
app.config['SECRET_KEY'] = 'super-secret-123'
# Baik
app.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.

Terminal window
pip install pip-audit
pip-audit

Atau 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

NoItem KeamananStatus
1CSRF Protection aktif
2Password di-hash dengan Werkzeug
3Session cookie secure & httponly
4HTTPS di-enforce
5Security headers via Talisman
6Rate limiting diterapkan
7Input divalidasi dengan Marshmallow
8Secrets disimpan di environment
9Dependensi diperiksa secara berkala
10Error 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:

  1. Gunakan Flask-Talisman untuk security headers
  2. Terapkan Rate Limiting
  3. Hash password dengan benar
  4. Validasi semua input
  5. Simpan secret di environment variables
  6. Enforce HTTPS
  7. Update dependensi secara rutin

Keamanan adalah proses berkelanjutan, bukan proyek sekali selesai.


Thanks for reading!

Security Best Practices & Hardening untuk Aplikasi Flask

Sun Jun 07 2026
477 words · 4 minutes