Secara default, PHP Native memberikan kebebasan penuh, namun itu berarti kita harus membangun "benteng" pertahanan sendiri secara manual. Berikut adalah langkah-langkah krusial untuk memperketat keamanan websitemu:
1. Mencegah SQL Injection (SQLi)
Ini adalah ancaman paling umum. Jangan pernah memasukkan variabel langsung ke dalam query SQL.
Solusi: Gunakan Prepared Statements dengan PDO (PHP Data Objects).
Contoh Kode:
// Cara LAMA yang Berbahaya (Jangan ditiru!)
// $sql = "SELECT * FROM users WHERE email = '" . $email . "'";
// Cara AMAN dengan PDO
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
Dokumentasi: Dengan
prepare, database memisahkan antara instruksi SQL dan data user, sehingga input berbahaya tidak akan dieksekusi sebagai perintah.
2. Mengamankan Input dari XSS (Cross-Site Scripting)
XSS terjadi ketika user memasukkan script (seperti <script>alert('hack')</script>) ke form dan script itu muncul di halaman lain.
Solusi: Selalu gunakan
htmlspecialchars()saat menampilkan data ke browser.
Contoh Kode:
// Saat menampilkan data user
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
3. Hashing Password yang Kuat
Jangan pernah menyimpan password dalam bentuk teks biasa atau MD5.
Solusi: Gunakan fungsi bawaan PHP
password_hash()danpassword_verify().
Contoh Kode:
// Saat pendaftaran (Hashing)
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
// Saat login (Verifikasi)
if (password_verify($inputPassword, $hashedPassword)) {
// Login sukses
}
4. Proteksi CSRF (Cross-Site Request Forgery)
Seperti Laravel, kamu harus membuat Token CSRF manual agar form hanya bisa dikirim dari website milikmu sendiri.
Langkah-langkah:
- Buat token acak dan simpan di $_SESSION.
- Masukkan token ke dalam input tersembunyi (hidden field) di form.
- Validasi token saat form diterima.
5. Konfigurasi Folder dan File
Struktur folder yang buruk bisa mengekspos file sensitif seperti .env atau log.
Saran: Pisahkan folder publik dan folder sistem. Hanya folder
publicyang bisa diakses dari browser.File .htaccess: Gunakan untuk membatasi akses ke folder tertentu.
# Isi file .htaccess di folder include/ atau config/ Deny from all
Struktur folder yang baik adalah garis pertahanan pertama dalam PHP Native. Prinsip utamanya adalah "Separation of Concerns": memisahkan kode logika aplikasi dari file yang bisa diakses langsung oleh publik (browser).
Berikut adalah rekomendasi struktur folder yang aman dan terorganisir:
Struktur Folder yang Disarankan
project-root/
│
├── core/ # Logika utama (Tidak boleh diakses publik)
│ ├── config.php # Koneksi database & API keys
│ ├── functions.php # Helper functions
│ ├── init.php # Inisialisasi session & autoload
│ └── .htaccess # Keamanan: Deny from all
│
├── includes/ # Komponen UI (Partial)
│ ├── header.php
│ ├── footer.php
│ └── navbar.php
│
├── public/ # SATU-SATUNYA folder yang diakses browser
│ ├── css/
│ ├── js/
│ ├── uploads/ # Tempat file yang diunggah user
│ ├── index.php # Front Controller
│ └── login.php
│
├── storage/ # Log, session manual, atau file privat
│ └── logs/
│
├── .env # Data sensitif (Gunakan library phpdotenv)
└── .htaccess # Redirect semua request ke folder public/
Mengapa Struktur Ini Lebih Aman?
1. Membatasi "Document Root"
Pada hosting (seperti Apache atau Nginx), arahkan Document Root ke folder public/, bukan ke project-root/.
Efeknya: Jika hacker mencoba mengakses
domain.com/core/config.php, server akan memberikan error 404 atau 403 karena folder tersebut berada "di luar" jangkauan publik.
2. Penggunaan file .htaccess di Folder Sensitif
Jika kamu tidak bisa mengubah Document Root di hosting (misal pada Shared Hosting biasa), letakkan file .htaccess di dalam folder core/ dan storage/ dengan isi:
# Mencegah siapapun mengakses file di folder ini via browser
Deny from all
3. File Konfigurasi di Luar Public
File config.php yang berisi username dan password database harus berada di folder core/. Di dalam file public/index.php, kamu cukup memanggilnya menggunakan:
require_once '../core/config.php';
Dengan begini, meskipun ada kesalahan konfigurasi server yang membuat file PHP terbaca sebagai teks biasa, file database-mu tetap tidak bisa ditebak lokasinya.
Langkah Implementasi
- Pindahkan semua file logic (database, class, functions) ke dalam folder core/.
- Buat folder public/ dan masukkan file .css, .js, serta file PHP yang bertugas menampilkan halaman (seperti index.php).
- Update Path: Pastikan semua perintah include atau require disesuaikan jalurnya (misal: ../core/functions.php).
Dokumentasi Keamanan Tambahan:
Folder Uploads: Di dalam
public/uploads/, pastikan kamu menaruh.htaccessyang mematikan eksekusi script agar user tidak bisa mengunggah file.phpdan menjalankannya.# public/uploads/.htaccess php_flag engine off
Ringkasan Tips Tambahan
| Komponen | Saran Keamanan |
| Sesi | Gunakan session_regenerate_id(true) setelah login untuk mencegah session hijacking. |
| Error | Matikan display_errors di produksi (melalui php.ini) agar struktur kode tidak terlihat hacker. |
| Upload | Validasi tipe file secara ketat. Jangan izinkan file .php diunggah ke folder gambar. |