🟦 A. AUTHENTICATION (Wajib Level 3)
1. Password Handling
- Password hanya disimpan dengan
password_hash()(argon2id lebih baik). - Tidak ada password tersimpan plaintext, bahkan untuk admin.
- Tidak ada password default seperti “admin/12345”.
- Pengguna dipaksa ganti password pada login pertama.
- Password harus minimal 10–12 karakter.
- Password must expire (opsional bila lingkungan tinggi sensitif).
2. Login Security
- Setelah login →
session_regenerate_id(true)wajib. - Login hanya via HTTPS (HTTP dilarang total).
- Lockout otomatis jika gagal login 5x dalam 15 menit.
- Notifikasi gagal login (opsional, meningkat level 3).
- Captcha untuk brute-force defense (opsional tapi direkomendasikan).
- Device fingerprint optional (User-Agent + hashed IP).
3. Session Security
- Session cookie:
HttpOnly = 1Secure = 1SameSite = Strictuse_strict_mode = 1
- Session expired otomatis setelah X menit (misal 20 menit idle).
- Session ID tidak boleh lewat URL.
- Logout menghapus session & cookie.
🟧 B. ACCESS CONTROL (Wajib Level 3)
1. Role-Based Access Control (RBAC)
- Semua halaman admin memiliki pengecekan level akses.
- Siswa tidak dapat mengakses fungsi nilai guru/admin.
- Dosen tidak bisa melihat data siswa dari kelas lain (IDOR check).
- Admin saja yang bisa mengedit user.
2. Horizontal Privilege Check
- Setiap request seperti
?id=123dicek dengan memastikan
user berhak melihat ID tersebut.
3. Vertical Privilege Check
- Pengguna biasa tidak bisa memanggil endpoint admin.
- Tidak ada file admin yang dapat diakses via URL tanpa login.
🟨 C. INPUT VALIDATION (Wajib Level 3)
1. Anti SQL Injection
- Semua query menggunakan PDO prepared statements.
- Tidak ada interpolasi langsung seperti:
"SELECT * FROM siswa WHERE id=$_GET[id]" - Tidak ada
mysql_query(),mysqli_query()tanpa bind. - Tidak ada query dinamis berbasis input user.
2. Anti XSS (Level 3)
- Semua output teks ke HTML menggunakan:
htmlspecialchars($val, ENT_QUOTES, 'UTF-8'); - Semua data yang tampil di tabel, form, dan view aman.
- Semua output ke JS di-escape.
- Tidak ada echo langsung dari
$_GET,$_POST,$_REQUEST.
3. Anti LFI / RFI
- Tidak ada:
include $_GET['page']; - Semua routing melalui whitelist:
$allowed = ['dashboard','nilai','profile'];
🟩 D. CSRF PROTECTION (Wajib Level 3)
Token Design
- CSRF token berbasis HMAC:
hash_hmac('sha256', session_id(), SECRET_KEY) - Token berbeda per-session.
- Token ditempatkan di input hidden.
Token Validation
- Validasi token menggunakan
hash_equals(). - Semua aksi POST (edit nilai, tambah siswa, reset password) harus punya CSRF token.
🟪 E. FILE UPLOAD SECURITY (Wajib Level 3)
SIAKAD biasanya punya upload foto siswa/dosen dan dokumen.
1. Validasi MIME
- Gunakan:
finfo_file(FILEINFO_MIME_TYPE)
2. Rename file
- Semua file rename jadi nama acak:
/uploads/98asfd9asd8f9asd.jpg
3. Penyimpanan aman
- Simpan file diluar
/public_html. - Jika harus di public:
.htaccess→php_flag engine off- nginx → blok eksekusi PHP pada folder upload.
4. Antivirus Scanning (Level 3)
- Gunakan ClamAV untuk scan upload:
clamscan --no-summary filename
5. Block upload ukuran besar
- Cek ukuran file secara manual.
- Pastikan
upload_max_filesizeaman.
🟫 F. CONFIGURATION SECURITY
1. Config File
config.phpberada di luar folder publik.- Tidak ada password database dalam repositori.
- Tidak ada file
.sql,.env,backup.bakdalam public.
2. PHP Configuration
display_errors = Offlog_errors = Ondisable_functions:exec, system, shell_exec, popen, passthru, proc_openexpose_php = Offallow_url_include = Offfile_uploads = Onsession.use_only_cookies = 1
3. Error Handling
- Error tidak tampil ke pengguna.
- Error ditulis ke log file yang aman.
🟦 G. DATA & DATABASE SECURITY
1. Database Access
- User DB per aplikasi (misal:
siakad_user,payment_user). - Hak akses database minimal (least privilege).
- Tidak ada akun DB root digunakan aplikasi.
- Tidak ada wildcard privilege:
GRANT ALL ON *.*.
2. Data Encryption
- Data sensitif dienkripsi di database (opsional).
- Koneksi MariaDB via TLS (opsional Level 3+).
3. Query Security
- Tidak ada query dynamic tanpa bind.
- Seluruh operasi CRUD menggunakan prepared statement.
🟥 H. LOGGING & MONITORING
Logging
- Semua aktivitas penting (login, perubahan nilai, edit data siswa) dicatat.
- Log tidak mengandung password.
- Log tidak berada di folder publik.
Monitoring
- Deteksi brute-force login.
- Deteksi perubahan file (integrity check).
🟩 I. SERVER SECURITY (Level 3)
Web Server
- HTTPS wajib.
- HSTS aktif.
- WAF (ModSecurity + OWASP CRS).
- Rate limiting login (nginx limit_req).
Server Application
- PHP-FPM user terpisah untuk tiap aplikasi.
- Isolasi folder (open_basedir).
- Fail2Ban aktif (SSH, login admin, phpMyAdmin).
Database Server
- Port MySQL tidak terbuka publik.
- Firewall hanya mengizinkan server aplikasi & server payment.
🟪 J. DEPLOYMENT SECURITY (Level 3)
- Tidak ada file development di produksi (
phpinfo();, debug.php). - Aplikasi punya proses CI/CD (opsional).
- Backup database terenkripsi & tersimpan di lokasi offline.
- Backup tidak boleh disimpan di public_html.
🟫 K. BUSINESS LOGIC SECURITY (Sangat penting untuk SIAKAD)
- Siswa hanya bisa melihat nilai sendiri.
- Guru hanya bisa mengedit nilai kelas yang diajar.
- Admin saja yang boleh reset password siswa/dosen.
- Tidak ada parameter GET/POST yang memungkinkan manipulasi nilai.
- Tidak ada “grade tampering” melalui ID yang bisa ditebak.
🟩 L. KEAMANAN PAYMENT (Jika SIAKAD terintegrasi pembayaran)
- Koneksi ke server payment tidak lewat internet publik (gunakan firewall/IP whitelisting).
- Callback pembayaran divalidasi dengan HMAC Signature.
- Tidak ada log yang menyimpan data sensitif transaksi.
- Nominal pembayaran tidak boleh berasal dari input user.