Contents
- 1 1. Proteksi CSRF Token di Form
- 2 2. Proteksi XSS
- 3 3. Gunakan Prepared Statements Selalu
- 4 4. Proteksi Session Hijacking
- 5 5. Tambahkan reCAPTCHA di Login Page
- 6 6. Lindungi Upload File (Jika Ada)
- 7 7. Auto Logout Setelah Idle (Opsional)
- 8 8. Proteksi Spam & Abuse
- 9 9. Konfigurasi .htaccess (Jika Apache)
- 10 10. Backup & Monitoring (Server)
Hei kamu para developer PHP kece! Bikin aplikasi web itu seru, tapi jangan lupa satu hal penting: keamanannya! Ibarat rumah, web kamu juga butuh kunci dan satpam biar nggak kemalingan data. Nah, gimana caranya bikin web PHP kamu makin “kebal”?
Salah satu jurus ampuh adalah input sanitasi yang ketat. Anggap aja ini kayak nyaring semua barang bawaan pengunjung biar nggak ada bom waktu (baca: malicious script). Terus, jangan lupakan proteksi dari serangan SQL Injection. Ini penting banget biar database kamu nggak diobok-obok orang iseng.
Selain itu, aktifin juga HTTPS biar semua lalu lintas data dienkripsi, jadi kayak ngobrol rahasia gitu deh. Jangan sepelekan juga manajemen sesi yang aman biar akun pengguna nggak gampang dibajak. Terakhir, rajin-rajin deh update library dan framework PHP kamu. Ini kayak update antivirus di komputer, biar selalu terlindungi dari ancaman terbaru.
Intinya, keamanan web itu bukan cuma tempelan, tapi bagian penting dari “jeroan” aplikasi kamu. Dengan implementasi keamanan tingkat lanjut yang tepat, web PHP kamu bakal lebih tangguh dan bikin pengguna juga nyaman! Semangat!
1. Proteksi CSRF Token di Form
Ubah semua <form> di file seperti login.php, register.php,
Tambahkan token di form:
<?php
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
Validasi di file proses:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF validation failed.");
}
}
2. Proteksi XSS
Pastikan semua data dari user di-sanitize saat ditampilkan:
<?= htmlspecialchars($course['title']) ?> <?= nl2br(htmlspecialchars($lesson['content'])) ?>
Pastikan ini diterapkan di semua tampilan: dashboard, dsb.
3. Gunakan Prepared Statements Selalu
Jika sudah pakai PDO, bagus!
Contoh yang aman (sudah benar):
$stmt = $pdo->prepare("SELECT * FROM courses WHERE id = ?");
$stmt->execute([$id]);
JANGAN PERNAH menulis query begini:
// ❌ Ini bahaya: $query = "SELECT * FROM courses WHERE id = " . $_GET['id'];
4. Proteksi Session Hijacking
Tambahkan ini di includes/auth.php atau init.php:
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', isset($_SERVER['HTTPS']));
ini_set('session.use_strict_mode', 1);
session_start();
session_regenerate_id(true); // setelah login
5. Tambahkan reCAPTCHA di Login Page
Daftar di Google reCAPTCHA v2
Dapatkan site key dan secret key
Tambahkan di login.php:
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div> <script src="https://www.google.com/recaptcha/api.js" async defer></script>
Di proses login:
$secret = "YOUR_SECRET_KEY";
$response = $_POST['g-recaptcha-response'];
$verify = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=$response");
$captcha_success = json_decode($verify);
if (!$captcha_success->success) {
die("Captcha failed.");
}
6. Lindungi Upload File (Jika Ada)
Jika kamu mengizinkan upload (misal avatar, file materi), pastikan:
$allowed = ['jpg', 'jpeg', 'png', 'pdf'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array(strtolower($ext), $allowed)) {
die("Invalid file type.");
}
// Simpan di luar public folder jika bisa
7. Auto Logout Setelah Idle (Opsional)
Di auth.php:
$timeout = 1800; // 30 menit
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $timeout)) {
session_unset();
session_destroy();
header("Location: ../auth/login.php");
exit;
}
$_SESSION['last_activity'] = time();
8. Proteksi Spam & Abuse
Untuk formulir komentar, kontak, register, atau kursus gratis:
Tambahkan hidden honeypot field
Gunakan reCAPTCHA
Tambah rate-limiting sederhana:
$ip = $_SERVER['REMOTE_ADDR'];
$now = time();
$pdo->prepare("INSERT INTO attempts (ip, created_at) VALUES (?, ?)")->execute([$ip, $now]);
9. Konfigurasi .htaccess (Jika Apache)
Di folder /uploads atau /assets/uploads:
# Blok file .php <Files *.php> deny from all </Files>
10. Backup & Monitoring (Server)
Gunakan mysqldump via cron:
0 2 * * * /usr/bin/mysqldump -u user -p'pass' lms_db > /home/backup/lms_$(date +\%F).sql
Pasang Notifikasi Email saat error PHP:
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php_errors.log');
Middleware Login Check
Di includes/auth.php:
if (!isset($_SESSION['user_id'])) {
header("Location: ../auth/login.php");
exit;
}









