Cara Menutup Bug SQL Injection

Kali ini saya akan memberi tahu bagaimana cara untuk mengatasi Bug SQL Injection pada web-web yang rentan akan serangan tersebut. SQL Injection adalah jenisaksi hacking pada keamanan komputer dimana seorang penyerang bisa bisa mendapatkanakses ke basis data di dalam sistem. SQL Injection yaitu serangan yang mirip dengan serangan XSS dalam bahwa penyerang memanfaatkan aplikasi vektor dan juga dengan Common dalam serangan XSS.Dan sekarang saya akan memberi tahu bagaimana cara mengatasi serangan SQL Injection tersebut.


Contoh code yang vulnerable/rentan terhadap SQL Injection :
<?php$id = $_GET['id'];
$db = mysql_connect('localhost', 'admin', '123456');
mysql_select_db("bug", $db);
$query = "SELECT * FROM pengguna WHERE id = '".$id."'";
$hasil = mysql_query($query);
echo $hasil;
?>
Dalam tutorial ini saya memberikan sebuah contoh kode PHP diatas yang ada bug SQL Injection nya & memperbaiki bug tersebut dengan beberapa cara di bawah ini.

1. Gunakan Prepared Statement pada SQL Query anda.Prepared statements adalah sebuah fitur yang disediakan oleh sebuah Database Management System (DBMS) seperti MySQL, PostgreSQL, Oracle, SQLite, IBM, Firebird, DBLib, dan lain-lain, dimana kita bisa mengirim query secara terpisah dari query utama dan variabel pendukungnya. Prepared Statement adalah salah satu cara untuk melakukan komunikasi ke database yang dikatakan cukup efektif untuk mencegah SQL Injection. Tujuannya, agar query menjadi lebih aman dan cepat (jika perintah yang sama akan digunakan beberapa kali).  Menggunakan prepared statement ini juga sangat disarankan ketika perlu melakukan banyak query supaya tidak terlalu memberatkan sistem.

Berikut contoh code untuk memperbaiki bug SQL Injection pada code diatas.
<?php
$db_host = "localhost";
$db_name = "admin"; // database name
$db_user = "baru"; // datebase user
$db_pass = "123456"; // database password

$koneksi = "mysql:host=$db_host;dbname=$db_name";

try 
{
    $db = new PDO($koneksi, $db_user, $db_pass);   
}
catch (exception $e) 
{
    echo "error";
    exit();
}
$id = $_GET['id'];
$sql = "SELECT * FROM pengguna WHERE id = $id";
$stmt = $db->prepare($sql);
$stmt->execute();
$objek = $stmt->fetchObject();
echo $objek->nama;
?>
2. Gunakan filter pada code PHP anda.
Apa itu PHP Filter ?
Sebuah filter PHP digunakan untuk memvalidasi dan menyaring data yang berasal dari sumber yang tidak aman.
Filter ini tentunya berguna untuk menyaring tipe input yang sedang dimasukkan oleh pengguna dan pastinya fitur Filter pada php ini juga bisa berguna untuk meminilisir serangan SQL Injection pada parameter/website anda. berikut contoh codenya:
<?php
$id = filter_var($_POST['id'], FILTER_VALIDATE_INT); // Filter ini berguna untuk mefilter tipe
//data integer
$nama = filter_var($_POST['nama'], FILTER_SANITIZE_STRING);//untuk tipe string
?>

3. Gunakan .htaccess untuk memfilter Query HTTP pada web server anda.
Metode ini biasanya digunakan oleh plugin keamanan Wordpress
berikut contoh codenya :
ServerSignature Off

Options -Indexes

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC]
RewriteRule ^(.*)$ - [F,L]
RewriteCond %{REQUEST_URI} (timthumb\.php|phpthumb\.php|thumb\.php|thumbs\.php) [NC]
RewriteRule . - [S=1]
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|) [NC,OR]

RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|\)|\(|%0A|%0D|%22|%27|%28|%3C|%3E|).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]

RewriteCond %{THE_REQUEST} \?\ HTTP/ [NC,OR]

RewriteCond %{THE_REQUEST} \/\*\ HTTP/ [NC,OR]

RewriteCond %{THE_REQUEST} etc/passwd [NC,OR]

RewriteCond %{THE_REQUEST} cgi-bin [NC,OR]

RewriteCond %{THE_REQUEST} (%0A|%0D) [NC,OR]

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]

RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]

RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]

RewriteCond %{QUERY_STRING} ftp\: [NC,OR]

RewriteCond %{QUERY_STRING} http\: [NC,OR]

RewriteCond %{QUERY_STRING} https\: [NC,OR]

RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]

RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]

RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]

RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]

RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]

RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]

RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]

RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]

RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]

RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]

RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]

RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|) [NC,OR]

RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]

RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]

RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]

RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]

RewriteCond %{QUERY_STRING} (sp_executesql) [NC]

RewriteRule ^(.*)$ - [F,L]



4.  Pasang WAF ( Web Application Firewall ) Pada Web Server Anda.
Fire wall ini adalah sebuah aplikasi keamanan untuk web server berada pada Layer 7 OSI. WAF ini di standari oleh OWASP (Open Web Application Security Project), merupakan kebijakan keamanan yang di posisiskan antara aplikasi web dan end user.
Berikut beberapa WAF yang dapat diandalkan untuk menjaga Web anda dari serangan Hacker Jahat :3 :v :
Barracuda Networks Web Application Firewall CloudFlare ( CDN sekaligus WAF ) Incapsula ( CDN sekaligus WAF ) Dan Masih banyak lagi
Oke, mungkin ini bisa saya opinikan 
sumber Wikepedia 
Semoga Bermanfaat :)

Previous
This is the oldest page
Thanks for your comment