Validasi Form dan Keamanan PHP: Mencegah SQL Injection dan XSS Sejak Dini

By | 14 October 2025

Dalam pengembangan aplikasi web, keamanan data adalah hal yang paling penting. Sebagus apa pun tampilan website kamu, jika pengguna bisa menyusupkan script berbahaya atau mengutak-atik database, maka semuanya bisa hancur dalam sekejap.

Dua serangan paling umum yang wajib kamu pahami sejak awal adalah:

  • SQL Injection – manipulasi query SQL untuk mencuri atau menghapus data.

  • Cross Site Scripting (XSS) – menyisipkan script JavaScript berbahaya ke dalam halaman web.

Pada artikel ini, kita akan membahas cara validasi form, mencegah SQL Injection, dan menghindari XSS menggunakan PHP modern seperti MySQLi dan PDO.

1. Mengapa Validasi Form Itu Penting?

Validasi form adalah proses memastikan data yang dikirim pengguna benar, aman, dan sesuai format yang diharapkan sebelum disimpan ke database.

Tanpa validasi, pengguna bisa:

  • Mengirim data kosong

  • Mengirim karakter berbahaya

  • Menyisipkan tag HTML atau script (XSS)

  • Memodifikasi query SQL (SQL Injection)

Contoh sederhana form login tanpa validasi:

<?php
// login.php (tidak aman)
$username = $_POST['username'];
$password = $_POST['password'];

$result = $conn->query("SELECT * FROM users WHERE username='$username' AND password='$password'");
?>

Kode di atas berbahaya karena jika pengguna memasukkan:

admin' OR '1'='1

Maka query akan selalu berhasil login tanpa password valid — inilah yang disebut SQL Injection.

2. Validasi Form Dasar di PHP

Gunakan fungsi empty(), filter_var(), dan preg_match() untuk memeriksa format input.

Contoh validasi form registrasi

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $nama = trim($_POST['nama']);
    $email = trim($_POST['email']);
    $password = $_POST['password'];
    $errors = [];

    // Validasi nama
    if (empty($nama)) {
        $errors[] = "Nama tidak boleh kosong.";
    }

    // Validasi email
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "Format email tidak valid.";
    }

    // Validasi password
    if (strlen($password) < 6) {
        $errors[] = "Password minimal 6 karakter.";
    }

    if (empty($errors)) {
        echo "<div class='alert alert-success'>Form valid!</div>";
    } else {
        foreach ($errors as $err) {
            echo "<div class='alert alert-danger'>$err</div>";
        }
    }
}
?>

Tips:

  • Gunakan trim() untuk menghapus spasi di awal/akhir input.

  • Gunakan htmlspecialchars() untuk mencegah XSS saat menampilkan data kembali ke form.

3. Mencegah SQL Injection dengan Prepared Statement

SQL Injection terjadi karena input pengguna langsung disisipkan ke dalam query tanpa disaring. Solusi terbaik adalah Prepared Statement — baik dengan MySQLi maupun PDO.

Contoh: Prepared Statement (MySQLi OOP)

<?php
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
?>

Contoh: Prepared Statement (PDO)

<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(['username' => $username, 'password' => $password]);
?>

Dengan prepared statement, parameter tidak akan dieksekusi sebagai kode SQL, melainkan hanya sebagai nilai biasa.

4. Mencegah XSS (Cross-Site Scripting)

XSS memungkinkan penyerang menyisipkan JavaScript berbahaya ke halaman web. Biasanya terjadi saat input pengguna langsung ditampilkan tanpa disaring.

Contoh Kasus:

<?php
echo $_GET['nama'];
?>

Jika pengguna membuka URL:

profil.php?nama=<script>alert('Hacked!')</script>

Maka script akan langsung dijalankan di browser.

Cara Aman:

Gunakan htmlspecialchars() sebelum menampilkan data.

<?php
echo htmlspecialchars($_GET['nama'], ENT_QUOTES, 'UTF-8');
?>

Hasilnya:

<script>alert('Hacked!')</script>

akan tampil sebagai teks biasa, bukan script aktif.

5. Gunakan CSRF Token untuk Keamanan Tambahan

CSRF (Cross-Site Request Forgery) adalah serangan yang memaksa pengguna melakukan aksi tanpa sadar (misalnya menghapus data).
Solusinya: buat token unik di setiap form.

<?php
// generate token
session_start();
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32));
}
?>

Tambahkan di form:

<input type="hidden" name="token" value="<?= $_SESSION['token']; ?>">

Dan validasi di proses PHP:

<?php
if ($_POST['token'] !== $_SESSION['token']) {
    die("Permintaan tidak valid!");
}
?>

Ringkasan Praktik Aman PHP

Aspek Cara Aman
SQL Injection Gunakan Prepared Statement
XSS Gunakan htmlspecialchars() sebelum output
Validasi Input Gunakan filter_var() dan preg_match()
Password Gunakan password_hash() dan password_verify()
CSRF Gunakan token unik di setiap form

Kesimpulan

Keamanan web tidak hanya soal firewall dan SSL — tetapi juga dimulai dari cara kita menangani input pengguna.
Dengan validasi yang tepat dan penerapan Prepared Statement, htmlspecialchars, dan CSRF Token, website PHP kamu akan jauh lebih aman, kuat, dan profesional.

Jangan tunggu sampai situsmu diretas — amankan form PHP-mu sejak sekarang!

Category: PHP

One thought on “Validasi Form dan Keamanan PHP: Mencegah SQL Injection dan XSS Sejak Dini

  1. Pingback: Keamanan Lanjutan PHP: CSRF, Session Hijacking, dan Password Hashing - Tutorial

Comments are closed.