# Security Checklist: Platform Jurnal Ilmiah (PHP Native di Shared Hosting)

Berikut adalah panduan keamanan komprehensif untuk deployment platform jurnal ilmiah di lingkungan Shared Hosting (seperti cPanel), dengan fokus pada arsitektur PHP Native murni (tanpa node.js/framework besar).

## 1. Authentication & Session
- [ ] **Session Security**: Selalu gunakan `session_start()` di awal entry point. Pastikan parameter session terlindungi:
  - `session.cookie_httponly = 1` (Mencegah pencurian session cookie via JavaScript/XSS).
  - `session.cookie_secure = 1` (Pastikan cookie hanya dikirim melalui koneksi HTTPS).
  - `session.use_only_cookies = 1` (Mencegah celah *session fixation* di mana session ID dilempar ke URL).
- [ ] **Password Hashing**: Jangan pernah menyimpan password menggunakan MD5 atau SHA1. Gunakan algoritma bawaan PHP `password_hash($password, PASSWORD_BCRYPT)` untuk menyimpan, dan `password_verify()` untuk memvalidasinya saat login.
- [ ] **Role and Permission Check**: Jangan membatasi akses sekadar "menyembunyikan tombol di UI". Lakukan validasi otorisasi absolut di baris paling awal setiap fungsi Controller (contoh: `if(current_user_role() !== 'admin') die('Unauthorized');`).

## 2. Forms & Eksekusi Data
- [ ] **Manual CSRF Protection**: Berikan token Cross-Site Request Forgery (CSRF) di setiap form/request yang mengubah state data (POST, PUT, DELETE) lalu verifikasi di backend.
  - Implementasi: Generate token `$_SESSION['csrf_token'] = bin2hex(random_bytes(32));`, masukkan jadi input hidden, dan verifikasi `hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])`.
- [ ] **SQL Injection Prevention (PDO)**: Ini wajib. Jangan pernah membentuk statement SQL secara manual (Concatenation string). Gunakan sepenuhnya ekstensi **PDO Prepared Statements** (`$stmt->prepare()` dan `$stmt->bind()`).

## 3. Output Rendering & XSS
- [ ] **XSS Prevention (htmlspecialchars)**: Setiap data yang dari input user / database jika ingin di-echo/dirender ke HTML wajib menggunakan filter `htmlspecialchars($string, ENT_QUOTES, 'UTF-8')`.

## 4. File Upload (Titik Paling Rawan di PHP Shared Hosting)
- [ ] **File Upload Security**: Tambahkan batasan ketat ukuran file via in-code (misal Naskah max 5MB).
- [ ] **PDF/DOC/DOCX Validation**: Hanya cek ekstensi itu bahaya (contoh: `shell.php.pdf`). Gunakan fungsi `finfo_file` (MIME sniffing layer) agar sistem benar-benar mendeteksi bahwa isi formatnya bertipe `application/pdf` atau `application/msword`.
- [ ] **Random Filename**: Selalu buang nama asli file yang diunggah. Terapkan nama random saat menyimpannya di disk: `uniqid() . '-' . bin2hex(random_bytes(8)) . '.pdf'`.
- [ ] **Storage Path Protection**: 
  - Simpan direktori upload `storage/uploads/` **di luar** document root (`public_html`) jika cPanel memungkinkan. 
  - Jika wajib berada di dalam public_html, buat file `.htaccess` di dalam folder `storage` yang berisi: `php_flag engine off` dan `Options -ExecCGI` sehingga seandainya ada file PHP yg lolos, tidak bisa tereksekusi.

## 5. Security Services & API
- [ ] **API Key Security**: Variabel berharga seperti Secret API Key (contoh Google Gemini, Payment Gateway) tidak boleh di *hardcode* dalam file aplikasi utama. Letakkan dalam file `config/env.php` dan letakkan minimal di luar public direct-access.
- [ ] **AI API Cost Protection**: Lindungi operasional API Gen-AI agar tidak di-spam bot yang mengakibatkan kebangkrutan billing. Set otorisasi tegas (contoh "hanya role Editor/Top Reviewer yang bisa memicu tombol AI Review") di backend.

## 6. Access Controls & Limits
- [ ] **Authorization Ownership Check**: Untuk halaman edit data, jangan sekadar mengandalkan "Log in Check". Selalu setel klausa ownership: `WHERE id = :post_id AND author_id = :user_id`. (Mencegah user A meretas submission user B dengan menebak ID).
- [ ] **Rate Limiting Sederhana**: Simpan counter `failed_logins` di $_SESSION atau DB untuk memblokir IP/Email sementara selama x menit jika user gagal masuk di atas 5 kali. Menghindari Brute-force credentials.
- [ ] **Admin Access Protection**: Proteksi URL administrator (ubah dari standard "/admin" menjadi nama endpoint khusus semacam "/auth_backroom_nexus").
- [ ] **Public Article Access Security**: Bila artikel adalah PDF premium atau dalam masa Embargo, hindari pemanggilan langsung dari statis URL `domain.com/uploads/123.pdf`. Pakai skrip `download.php?file_id=XYZ123` yang mengikat *permission check* ke database.

## 7. Configuration & File System
- [ ] **Directory Listing Protection**: Tambahkan rule `Options -Indexes` pada `.htaccess` utama di public/ root, mencegah pengunjung mengetik URL direktori lalu webserver menampilkan isi *tree* file seperti Filezilla.
- [ ] **.htaccess Protection**: Mengunci folder core PHP agar file `.php`-nya tak bisa ditembak langsung:
  ```apache
  # Contoh blokir akses web direct ke folder app/
  <Directory app>
      Require all denied
  </Directory>
  ```

## 8. Cronjob & Maintainability
- [ ] **Cron Job Security**: Endpoint URL atau file PHP yang di-panggil melalui Cronjob host (misal `cron/process_ai_queue.php`) rawan dieksekusi orang jahat jika diletakkan di `public_html`.
  - Apabila diakses via browser, gunakan validasi IP lokal (`$_SERVER['REMOTE_ADDR'] === '127.0.0.1'`) ATAU periksa `php_sapi_name() === 'cli'` (bila di-hit melalui local bash command).
- [ ] **Error Log**: Matikan `display_errors = Off` dan set log errors ke sebuah file rahasia di direktori tertutup. Pesan error stack-trace default PHP sangat disukai Hacker untuk mengetahui alur script dan query DB. 
- [ ] **Backup Database**: Di shared hosting sangat rentan malware lintas-situs, jadwalkan pencadangan Database (dump SQL) yang dibackup berkala melalui sistem auto-backup cPanel (Softaculous / JetBackup).
