Script PHP sederhana untuk mengatasi SQL Injection

Dari 2 post terbaru, dan hasil diskusi kemarin, tampaknya belum di share, “Gimana sih caranya biar script PHP kita ga kena SQL injection?”

saya pribadi ga ikut waktu hari jum’at kemaren gimana prosesnya saya kurang tau, tapi saya coba bantu, untuk mejawab pertanyaan diatas.
OK, saya asumsinkan Anda yang sedang membaca tulisan saya ini, paham dengan konsep dasar PHP dan Database.

Udah ga sabar nih!!
santey, saya tau anda ambisius, tapi kita bikin skenario nya dulu lah, masa langsung hajar” aja, kaya babi kesetanan?
skenario nya, saya lanjutin dari post tomi tentang cara dasar sql injection, dan post aziz tentang cara menangkalnya, namun masih belum 100% prakteknya. Misalkan kita punya list artikel di blog kita, dan kita ingin memunculkan id artikel sesuai dengan yang diminta. Misal query simpelnya yaitu “Select * from article where id_article = ‘5’”.

Nah, pasti udah paham kan gimana itu maksud dr sql injection?
ok, kalo belum saya kasi tau simpelnya itu gimana. Sql injection itu metode untuk menambahkan (inject) script sql yang kita inginkan ke script punya orang laen yang udah dibikin. Misal script sql kita seperti ini (yang seharusnya, cuma input 1 string saja) “Select * from article where id_article = ‘id_article'” , dengan metode get ke artikel misalnya

 "http://www.contoh.com/index.php?id=9" 

sqlnya jadi

 "Select * from article where id_article = '9'" 

. Nah kalau misal script yang barusan di inject dengan ini

 "http://www.contoh.com/index.php?id=-3+UNION+SELECT+group_concat(schema_name),2,3,4,5,6,7+ from+information_schema.schemata—" 

maka SQL nya jadi

 "Select * from article where id_article = '-3+UNION+SELECT+group_concat(schema_name),2,3,4,5,6,7+ from+information_schema.schemata—'" 

. Udah jelas itu query nya bakal keganggu, dan output dari resultnya bakal keliatan di browser.

So?
ya, disini kita harus validasi, variabel apa aja yang boleh masuk.
berarti kita tentuin kriteria validasinya.
1. harus angka
2. harus diantara 1 atau 2 angka
3. harus angka positif
4. harus di escape,biar ga ada error.

Ok sekarang kita mulai
1. bikin fungsi yang ngecek value yang kita masukin itu angka apa bukan?

	function isNumber($number)
	{
		if (preg_match("/^\-?\+?[0-9e1-9]+$/", $number))
		{
			return $number;
		} else {
			return false;
		}
	}

2. Bikin fungsi utk ngecek panjang string value yang bole masuk berapa banyak?

	function checkLength($value, $maxLength, $minLength = 0)
	{
		if (!(strlen($value) > $maxLength) && !(strlen($value) < $minLength)) {
			return $value;
		} else {
			return false;
		}
	}

3. Bikin fungsi utk ngecek angka itu positif apa bukan?

	function checkNegative($value)
	{
		if (!($value <= 0))
			return $value;
		else
			return false;
	}

4. Bikin fungsi utk escape string sql query

	function sanitize($string)
	{
		$string = mysql_escape_string(trim(strip_tags(stripslashes($string))));
		return $string;
	}

5. terus validasi string yang dimasukin kosong apa ngga?

if (!empty($_POST['id']) && isset($_POST['id']))
   #if true
else
   #if false

kalo saya si lebih enak gini utk make nya.

	#the variable
	$id = $_POST['id'];
	$ok['id'] = sanitize(checkNegative(isNumber(checkLength($id,2,1))));
	#kalo coba" maen, ya tendang aja
	if ($ok['id'] == false)
	{
		echo "SQL STRING = Select * from article where id_article = '".$id."'
"; die("whoops something wrong with your query :D"); }

terus ntr outputnya string yang dimasukin itu sesuai apa ngga.
pasti pada bingung kan hasil akhirnya gimana?
pengen si saya demoin langsung dsini, tapi kita belum ada hosting berbayar sendiri,ya silahkan aja ini di makan script yang udah jadi nya, siapa tau ini berguna. Kalo emang pengen tau lebih lanjut mana yang perlu dijelasin, kasi komen aja, ntr saya jelasin mana yang bingung nya. Oh iah 1 lagi, mungkin script ini masih ada celahnya, silahkan dikasi tau aja, Kita bikin yang bener” aman. Ditunggu komentarnya ya.

download

http://dl.dropbox.com/u/20434260/Validation.tar.gz

Screenshoot :
(dikumpulin jadi satu)

result dari script injection

sumber? dari pengalaman pribadi yang udah makan php selama 4 taunan.

thanks,
seeya in next tuts.

3 thoughts on “Script PHP sederhana untuk mengatasi SQL Injection

  1. Postingnya sudah lama ya, tapi saya baru baca. Selama ini untuk data dari parameter url atau form submit dengan tipe number saya biasanya casting atau konversi dulu ke integer untuk mengantisipasi data tidak dalam format string sehingga bisa menghindari SQL Injection. intval($_GET(‘id’)) atau (int) $_GET(‘id’). String yang tidak valid otomatis akan diubah oleh php menjadi 0. Aman.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s