Bagaimana mencegah SQL Injection di PHP?

Pada artikel ini, kita akan membahas cara mencegah injeksi SQL di PHP. Prasyarat dari topik ini adalah Anda memiliki XAMPP di komputer Anda.

Mengapa injeksi SQL terjadi?

Injeksi SQL adalah teknik injeksi kode yang digunakan untuk menyerang aplikasi berbasis data, di mana pernyataan SQL berbahaya dimasukkan ke dalam kolom entri untuk dieksekusi (misalnya, untuk membuang konten database ke penyerang).

Dalam jenis teknik ini, peretas atau penyerang menggunakan beberapa karakter khusus yang mengubah kueri SQL menjadi kueri SQL baru dan penyerang dapat memanipulasi kueri dengan memasukkan lebih banyak jenis kata kunci.

Mari kita membuat skenario injeksi SQL kemudian kita akan belajar cara memperbaikinya.

Langkah 1: Jadi, mari kita mulai dengan membuat database –

CREATE DATABASE GFG;

Langkah 2: Gunakan basis data ini –

USE GFG;

Langkah 3: Buat tabel kredensial login di database GFG –

CREATE TABLE users( 
    id int(10) PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255),
    password VARCHAR(255)
);

Langkah 4: Masukkan beberapa data ke dalam database –

INSERT INTO users VALUES(1, 'idevesh', '1234');
INSERT INTO users VALUES(2, 'geeksforgeeks', 'gfg');

Data Setelah dimasukkan

Langkah 5: Sekarang buat skrip PHP untuk halaman login –

(a) Buat File Koneksi DB (dbconnection.php) –

PHP

<?php

 

$db = mysqli_connect("localhost","root","","GFG");

 

if (mysqli_connect_errno()) {

    echo "Failed to connect to MySQL: "

        . mysqli_connect_error();

}

?>

(B) Buat form HTML untuk input dari USER –

PHP

<!DOCTYPE html>

<html>

 

<head>

    <title>GFG SQL Injection Article</title>

    <link rel="stylesheet" type="text/css"

        href="style.css">

</head>

 

<body>

    <div id="form">

        <h1>LOGIN FOR SQL INJECTION</h1>

        <form name="form"

            action="verifyLogin.php" method="POST">

 

            <p>

                <label> USER NAME: </label>

                <input type="text" id="user"

                    name="userid" />

            </p>

 

            <p>

                <label> PASSWORD: </label>

                <input type="text" id="pass"

                    name="password" />

            </p>

 

            <p>

                <input type="submit"

                    id="button" value="Login" />

            </p>

        </form>

    </div>

</body>

 

</html>

(C) Buat file verifikasiLogin.php untuk memvalidasi input pengguna –

PHP

<?php

 

include 'dbconnection.php';

$userid = $_POST['userid'];

$password = $_POST['password'];

$sql

"SELECT * FROM users WHERE username="$userid" AND password = '$password'";

$result = mysqli_query($db, $sql) or die(mysqli_error($db));

$num = mysqli_fetch_array($result);

     

if($num > 0) {

    echo "Login Success";

}

else {

    echo "Wrong User id or password";

}

?>

Langkah 6: Sekarang kami akan memberikan kata sandi beracun untuk masuk ke profil pengguna –

Poisoned password = ' or 'a'='a

Jadi, seperti yang Anda lihat, string beracun yang disebutkan di atas dapat membuat setiap pengguna login dengan nama pengguna geeksforgeeks sehingga ini disebut SQL Injection.

Sekarang untuk menghindari jenis injeksi SQL ini, kita perlu membersihkan input kata sandi dan input nama pengguna menggunakan mysqli_real_escape_string() fungsi.

Fungsi mysqli_real_escape_string() mengambil karakter khusus sebagai input dari pengguna dan tidak menganggapnya sebagai penggunaan kueri.

Jadi kode baru untuk verifikasiLogin.php adalah –

PHP

<?php

 

include 'dbconnection.php';

$userid = $_POST['userid'];

$password = $_POST['password'];

 

$sanitized_userid

    mysqli_real_escape_string($db, $userid);

     

$sanitized_password

    mysqli_real_escape_string($db, $password);

     

$sql = "SELECT * FROM users WHERE username=""

    . $sanitized_userid . "" AND password = '"

    . $sanitized_password . "'";

     

$result = mysqli_query($db, $sql

    or die(mysqli_error($db));

     

$num = mysqli_fetch_array($result);

     

if($num > 0) {

    echo "Login Success";

}

else {

    echo "Wrong User id or password";

}

 

?>