Dapatkan info setiap update artikel! Subscribe Now!

3 Cara Memperbaiki Celah SQL Injection Pada Website

3 Cara Memperbaiki Celah SQL Injection Pada Website
Saya kira tidak perlu dijelaskan detail mengenai pengertian SQL Injection, karena saya yakin kalian yang membaca artikel ini pasti sudah tau mengenai SQL Injection dan mencoba mencari cara untuk memperbaikinya. Bagi yang ingin berkenalan lebih dalam tentang SQL Injection, kebetulan di blog ini kami sudah pernah membuatkan artikelnya dengan judul Basic SQL Injection for Beginner I dan Basic SQL Injection for Beginner II.

Sebenarnya berbicara mengenai keamanan, tidak ada sistem yang seratus persen aman. Hal ini dapat menjadi peringatan bagi siapapun terlebih bagi kita para Web Programmer. Dengan ungkapan seperti itu, sebenarnya kita dituntut untuk lebih berhati-hati dalam membangun sebuah sistem apapun itu. Bagi para Web Programmer tentunya sistem tersebut mengarah pada Aplikasi ataupun Website yang dibuat. Ketelitian, kejelian, dan keahlian sangat dibutuhkan untuk membangun Website yang dibuat menjadi lebih aman.

Mengenai celah SQL Injection pada website, sebenarnya ini merupakan perwujudan dari kurangnya ketelitian, kejelian, dan keahlian dari Web Programmer atau Web Developernya. Bisa dibilang, celah ini ada murni kesalahan dari mereka. Yang mana kesalahannya terjadi akibat tidak terfilternya Request Method baik itu GET ataupun POST. Seharusnya segala unsur yang dapat memungkinkan untuk menerima inputan sebaiknya difilter terlebih dahulu. Jika tidak, hal itu dapat dimanfaatkan oleh orang lain dengan menginputkan sesuatu yang berbahaya.

Oke agar tidak panjang lebar, disini saya mempunyai dua file yang akan dijadikan studi kasus. File pertama adalah index.php yang isinya seperti di bawah ini.


<?php  
$conn = mysqli_connect("localhost", "root", "", "blog");
$result = mysqli_query($conn, "SELECT * FROM artikel ORDER BY tanggal DESC");
?>
<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>SQL Injection</title>
<?php require_once("template/header.php"); ?>

 <section id="wrapper-content" class="wrapper-content">
  <main>
   <?php while($row = mysqli_fetch_assoc($result)) : ?>
   <div class="content-main">
    <img src="img/<?= $row["gambar"]; ?>" alt="<?= $row["judul"]; ?>">
    <div>
     <h2><a href="article.php?id=<?= $row["id"]; ?>"><?= $row["judul"]; ?></a></h2>
     <p><?= (str_word_count($row["konten"]) > 80 ? substr($row["konten"],0,150). "..." : $row["konten"]) ?></p>
     <h3><i class="fa fa-user"></i> <?= $row["penulis"]; ?></h3> 
     <h3><i class="fa fa-calendar"></i> <?= date("d M Y", strtotime($row["tanggal"])); ?></h3>
    </div>
   </div>
   <?php endwhile; ?>
  </main>

  <?php require_once('template/sidebar.php');
 
require_once('template/footer.php');
?>

Dan file kedua yaitu article.php dengan isi file seperti di bawah ini.

<?php
$conn = mysqli_connect("localhost", "root", "", "blog");
$id = $_GET["id"];
$result = mysqli_query($conn, "SELECT * FROM artikel WHERE id =$id");
while ($row = mysqli_fetch_assoc($result)) {
 $detailArtikel = $row;
}
$baseUrl = "http://localhost/sqlinjection";
if(!isset($id)){
 header("Location: index.php");
 exit;
} 
?>
<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title><?= $detailArtikel["judul"]; ?></title>
<?php require_once("template/header.php"); ?>

 <section id="wrapper-content" class="wrapper-content">
  <main>
   <article>
    <div class="judul-artikel">
     <h2><?= $detailArtikel["judul"]; ?></h2>
    </div>
    <div class="thumbnail-post">
     <img src="<?= $baseUrl; ?>/img/<?= $detailArtikel["gambar"]; ?>" alt="<?= $detailArtikel["judul"]; ?>" width="500">
    </div>
    <div class="post-artikel">
     <p><?= $detailArtikel["konten"]; ?></p>
    </div>
   </article>
  </main>

  <?php require_once('template/sidebar.php');
require_once('template/footer.php');
?>

Kedua file di atas sama sekali belum diperbaiki, jadi masih bisa dilakukan Injeksi SQL. Lalu bagaimana cara memperbaiki celahnya? Berikut ini 3 cara yang paling direkomendasikan untuk mengamankan website dari celah SQL Injection.

1. Redirect

Cara yang pertama ini sebenarnya bukan filtering dari Request Method melainkan alternatif yaitu dengan meredirect jika tidak ada data yang dikirimkan ataupun ada data tapi tidak sesuai. Bisa dibilang dengan redirect ini, mencegah orang lain untuk menginputkan apapun yang tidak sesuai pada parameter. Jika kita mencoba menginputkan sesuatu yang tidak sesuai maka akan diredirect atau dipaksa untuk berpindah halaman. Kita bisa mengarahkannya kemanapun semisal ke homepage yaitu index.php dsb.

Yang perlu kita lakukan adalah menggunakan fungsi dari PHP yaitu isset() untuk pengecekan. Coba perhatikan bagian isi dari file article.php di bawah ini.


<?php
$conn = mysqli_connect("localhost", "root", "", "blog");
$id = $_GET["id"];
$result = mysqli_query($conn, "SELECT * FROM artikel WHERE id =$id");
while ($row = mysqli_fetch_assoc($result)) {
 $detailArtikel = $row;
}
$baseUrl = "http://localhost/sqlinjection";
if(!isset($id)){
 header("Location: index.php");
 exit;
} 
?>

Sebenarnya fungsi isset sudah diterapkan pada file article.php, namun kita akan merubahnya agar lingkupnya lebih spesifik. Caranya bisa dibilang cukup mudah. Kita tinggal mengganti parameter dari fungsi isset yang isinya $id diganti dengan $detailArtikel. $detailArtikel berisi data lengkap dari tabel artikel berupa id dan lain-lain. Jadi, ini bisa dimanfaatkan untuk melakukan pengecekan. Kita akan mengecek apakah $detailArtikel sudah diset atau belum. Karena statement di atas menggunakan not isset, maka pengecekannya adalah jika $detailArtikel belum diset maka redirect ke halaman index.php. Perintah redirectnya terdapat pada header("Location: index.php").

Dengan itu PHP akan mengecek jika ada data di parameter tidak sesuai dengan data yang ada pada $detailArtikel, maka user akan diredirect ke halaman index.php. Untuk mengetesnya coba kalian lakukan testing SQL Injection, maka otomatis halamannya akan redirect menuju index.php. Namun jika data di parameter sesuai halamannya tidak akan diredirect.

2. Fungsi intval

Cara yang kedua ini merupakan filter untuk mencegah terjadinya SQL Injection. Dengan menggunakan fungsi intval, semua tipe data akan diubah menjadi integer. Jadi perintah-perintah untuk melakukan SQL Injection tidak akan berfungsi. Cara penerapannya pun cukup gampang. Kita tinggal masukkan sesuatu yang ingin difilter ke parameter pada fungsi intval dalam hal ini yaitu $_GET["id"].

Jadi pada file article.php di atas seharusnya sudah berubah menjadi seperti ini.


<?php
$conn = mysqli_connect("localhost", "root", "", "blog");
$id = intval($_GET["id"]);
$result = mysqli_query($conn, "SELECT * FROM artikel WHERE id =$id");
while ($row = mysqli_fetch_assoc($result)) {
 $detailArtikel = $row;
}
$baseUrl = "http://localhost/sqlinjection";
if(!isset($id)){
 header("Location: index.php");
 exit;
} 
?>

3. Prepared Statement

Cara yang terakhir ini merupakan cara yang paling direkomendasikan. Cara ini tidak hanya bisa dilakukan pada Request Method GET saja tapi juga POST. Berikut ini adalah penerapan Prepared Statement pada file article.php.


<?php
$conn = mysqli_connect("localhost", "root", "", "blog");
$stmt = mysqli_prepare($conn, "SELECT * FROM artikel WHERE id =?");
mysqli_stmt_bind_param($stmt, "i", $_GET["id"]);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
 $detailArtikel = $row;
}
$baseUrl = "http://localhost/sqlinjection";
if(!isset($detailArtikel)){
 header("Location: index.php");
 exit;
} 
?>

Terlihat jelas di sana bahwa fungsi mysqli_query() diganti menjadi mysqli_prepare() dan value id pada querynya diganti menjadi (?). $_GET["id"] kita letakkan menjadi parameter ke dalam fungsi mysqli_stmt_bind_param(). Prosesnya bisa dibilang cukup panjang dan banyak dibandingkan dengan dua cara di atas tadi. Namun mengenai tingkat kemanannya tidak usah diragukan lagi. Sampai sekarang cara ini belum bisa dilakuan Injeksi SQL.

Itulah tadi beberapa cara yang bisa dilakukan untuk memperbaiki celah SQL Injection pada website. Jika celah ini tetap dibiarkan akan sangat berbahaya karena dengan teknik ini bisa dengan mudah mengetahui isi dari database pada website.

About the Author

Seorang yang suka belajar berbagai hal dan membagikannya ke publik agar bisa tumbuh bersama.

Posting Komentar

Cookie Consent
We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.