Tutorial PHP Dasar #12: php security (sql injection & hashing)

Author Erick Irwansyah
25 Dec 2024
Tutorial PHP Dasar #12:  php security  (sql injection & hashing)

Halo lagi! Kali ini kita akan bahas tentang keamanan di PHP, yang penting banget buat melindungi aplikasi web kita dari ancaman seperti SQL Injection dan mengelola password hashing. Dua hal ini harus dikuasai agar aplikasi kita tetap aman, apalagi jika aplikasi kita menyimpan data pengguna sensitif seperti password.


Apa Itu SQL Injection?

SQL Injection adalah teknik yang digunakan oleh hacker untuk menyisipkan query SQL yang berbahaya ke dalam input form, dengan tujuan mengakses atau merusak data di database. Misalnya, jika aplikasi kita tidak memvalidasi input pengguna dengan baik, hacker bisa menyisipkan kode SQL seperti ini:

' OR '1'='1

Ini akan membuat query SQL yang seharusnya hanya menampilkan data pengguna yang valid menjadi terbuka untuk siapa saja.


Mencegah SQL Injection dengan Prepared Statements

Cara terbaik untuk mencegah SQL Injection adalah dengan menggunakan prepared statements. Di PHP, kita bisa menggunakan mysqli atau PDO untuk membuat prepared statement.

Contoh Menggunakan Prepared Statement dengan mysqli:

<?php
include('koneksi.php');

// Ambil data dari form
$username = $_POST['username'];
$password = $_POST['password'];

// Buat prepared statement
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password); // "ss" berarti dua parameter string

// Eksekusi query
$stmt->execute();

// Ambil hasil
$result = $stmt->get_result();

if ($result->num_rows > 0) {
    echo "Login berhasil!";
} else {
    echo "Login gagal, username atau password salah.";
}

$stmt->close();
$conn->close();
?>

Di sini, kita mengikatkan parameter ke query dengan bind_param(), yang mencegah input pengguna dimasukkan langsung ke dalam query, sehingga mencegah SQL Injection.


Menggunakan Password Hashing

Penting banget untuk tidak menyimpan password pengguna dalam bentuk teks biasa. Alih-alih, kita harus hashing password tersebut menggunakan algoritma hash yang kuat, seperti bcrypt. Dengan begitu, meskipun database kita terkompromi, password asli tetap tidak bisa diketahui.

Di PHP, kita bisa menggunakan fungsi password_hash() untuk membuat hash password dan password_verify() untuk memverifikasi password.

Contoh Menggunakan Password Hashing:

1. Menyimpan Password dengan Hashing:

<?php
include('koneksi.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Hash password sebelum disimpan
    $hashed_password = password_hash($password, PASSWORD_BCRYPT);

    // Simpan username dan hashed password ke database
    $sql = "INSERT INTO users (username, password) VALUES ('$username', '$hashed_password')";

    if ($conn->query($sql) === TRUE) {
        echo "Pengguna berhasil ditambahkan!";
    } else {
        echo "Error: " . $conn->error;
    }
}
?>

2. Memverifikasi Password saat Login:

<?php
include('koneksi.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Ambil hashed password dari database
    $sql = "SELECT password FROM users WHERE username = '$username'";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $hashed_password = $row['password'];

        // Verifikasi password
        if (password_verify($password, $hashed_password)) {
            echo "Login berhasil!";
        } else {
            echo "Password salah!";
        }
    } else {
        echo "Username tidak ditemukan!";
    }
}
?>

Dengan cara ini, meskipun database kita terkompromi, password asli tidak akan bisa diketahui karena hanya hash yang tersimpan di database.


Studi Kasus: Sistem Login dengan Keamanan

Buatlah dokumen baru php baru, lalu buatlah form seperti berikut:

Form Login dengan Keamanan:

<form method="POST" action="login.php">
    <label for="username">Username:</label>
    <input type="text" id="username" name="username"><br><br>

    <label for="password">Password:</label>
    <input type="password" id="password" name="password"><br><br>

    <button type="submit">Login</button>
</form>

Proses Login dengan Keamanan:

<?php
include('koneksi.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Menggunakan prepared statement untuk mencegah SQL Injection
    $stmt = $conn->prepare("SELECT password FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();

    $result = $stmt->get_result();

    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $hashed_password = $row['password'];

        // Memverifikasi password
        if (password_verify($password, $hashed_password)) {
            echo "Login berhasil!";
        } else {
            echo "Password salah!";
        }
    } else {
        echo "Username tidak ditemukan!";
    }

    $stmt->close();
    $conn->close();
}
?>

Apa Selanjutnya?
Sekarang, kamu sudah tahu cara mencegah SQL Injection dan cara mengelola password dengan aman menggunakan hashing. Selanjutnya, kita akan belajar tentang upload file dengan PHP, yang sangat berguna untuk fitur seperti meng-upload foto profil atau dokumen.


Sekianlah belajar PHP tentang keamanan dan hashing password. Dengan memahami keamanan, aplikasi kamu bisa lebih aman dari ancaman eksternal. Artikel ini sangat berguna sebelum kamu melanjutkan ke tutorial PHP selanjutnya di www.code80vity.com. Sampai jumpa di pembahasan berikutnya, dan jangan lupa terus eksplorasi PHP!

Tutorial Terkait Lainnya

Comments

Please login to post a comment.
No comments yet. Be the first to comment!