• Tidak ada hasil yang ditemukan

ANTIINJECTION NOVA ROCHAYATI MANAJEMEN INFORMATIKA

N/A
N/A
Protected

Academic year: 2021

Membagikan "ANTIINJECTION NOVA ROCHAYATI MANAJEMEN INFORMATIKA"

Copied!
14
0
0

Teks penuh

(1)

NOVA ROCHAYATI 3093311030

MANAJEMEN INFORMATIKA

ANTIINJECTION

Menurut Wikipedia Xss injection adalah salah satu jenis serangan injeksi code (code injection attack) Html. Jadi inti dari XSS Injection adalah serangan menggunakan HTML code.

Source.

Dari source diatas kita melihat 2 Fungsi, yakni fungsi htmlspecialchars dan trim, lalu apa kegunaanya?

 Htmlspecialchars : berfungsi untuk mengabaikan tag html, misal spasi dirubah menjadi %20, sehingga ketika ada attacker menyisipkan kode html, maka tidak akan terbaca sebagai Tag HTML, tetapi teks biasa.

 Trim : trim disini berfungsi untuk menghapus karakter spasi di depan teks.

function antixss($data) { $xss = htmlspecialchars(trim($data)); return $xss; } <?php

mysql_connect("localhost","root","") or die ("gagal Koneksi"); mysql_select_db("db_guestbook") or die ("gagal koneksi database");

(2)

{ $xss = htmlspecialchars(trim($data)); return $xss; } $nama = antixss($_POST['nama']); $email = antixss($_POST['email']); $web = antixss($_POST['web'];); $pesan = antixss($_POST['pesan']); $tgl = date('Y-m-d');

$query = mysql_query("insert into buku_tamu values('','$nama','$email','$web','$pesan','$tgl')"); if(!$query)

{

echo "Gagal simpan buku tamu, silahkan <a href=\"buku_tamu.php\">ulangi</a>."; }

else {

echo "Terima kasih $nama telah mengisi buku tamu."; } ?> http://burhanudin.web.id/programing/ SIMPAN KOMENTAR <?php <?php session_start(); include "config/connection.php"; include "config/library.php";

$nama=trim($_POST['nama_komentar']); $komentar=trim($_POST['isi_komentar']); if (empty($nama)){

echo "Anda belum mengisikan NAMA<br />

<a href=javascript:history.go(-1)><b>Ulangi Lagi</b>"; }

elseif (empty($komentar)){

echo "Anda belum mengisikan KOMENTAR<br />

<a href=javascript:history.go(-1)><b>Ulangi Lagi</b>"; }

(3)

elseif (strlen($_POST['isi_komentar']) > 1000) {

echo "KOMENTAR Anda kepanjangan, harap dikurangin atau dibagi jadi beberapa bagian.<br />

<a href=javascript:history.go(-1)><b>Ulangi Lagi</b>"; }

else{

function antiinjection($data){

$filter_sql = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($data,ENT_QU OTES))));

return $filter_sql; }

$nama = antiinjection($_POST['nama_komenta']); $url = antiinjection($_POST['url']);

$isi = antiinjection($_POST['isi_komentar']); if(!empty($_POST['kode'])){

if($_POST['kode']==$_SESSION['captcha_session']){ // Mengatasi input komentar tanpa spasi

$split_text = explode(" ",$isi_komentar); $split_count = count($split_text);

$max = 57;

for($i = 0; $i <= $split_count; $i++){ if(strlen($split_text[$i]) >= $max){

for($j = 0; $j <= strlen($split_text[$i]); $j++){ $char[$j] = substr($split_text[$i],$j,1);

if(($j % $max == 0) && ($j != 0)){ $v_text .= $char[$j] . ' '; }else{ $v_text .= $char[$j]; } } }else{ $v_text .= " " . $split_text[$i] . " "; } }

(4)

$sql = mysql_query("INSERT INTO komentar(id_berita,nama_komentar,url,isi_komentar,tgl, jam_komentar)

VALUES('$_POST[id]','$nama_komentar','$url','$v_text','$tgl_sekarang','$jam_se karang')");

echo "<meta http-equiv='refresh' content='0; url=?view=detailberita2&id=$_POST[id]'>"; }else{

echo "Kode yang Anda masukkan tidak cocok<br />

<a href=javascript:history.go(-1)><b>Ulangi Lagi</b></a>"; }

}else{

echo "Anda belum memasukkan kode<br />

<a href=javascript:history.go(-1)><b>Ulangi Lagi</b></a>"; }

} ?> ?>

HALAMAN INDEX

<?php if ($_GET['view']=='detailberita2'){

$detail=mysql_query("SELECT * FROM berita,user,kategori WHERE kategori.id_kategori=berita.id_kategori AND id_berita='$_GET[id]'");

$dbr = mysql_fetch_array($detail); $tgl = tgl_indo($dbr[tgl]);

$baca = $dbr[dibaca]+1;

echo "<span class=tanggal><img src=images/clock.gif> $dbr[hari], $tgl $dbr[jam] WITA</span><br />";

echo "<span class=judul>$dbr[judul]</span><br />"; echo "<span class=posting>

Kategori: <a href=?view=detailkategori&id=$dbr[id_kategori]-$dbr[kategori_seo].html><b>$dbr[nama_kategori]</b></a> - Dibaca: <b>$baca</b> kali</span><br />";

// Apabila ada gambar dalam berita, tampilkan

(5)

echo "<p><span class=image><img src='images/img_berita/med_$dbr[gambar]' border=0> </span></p>";

}

//$isi_berita=nl2br($d[isi_berita]); // membuat paragraf pada isi berita echo "$dbr[isi_berita] <br />";

// Tampilkan judul berita yang terkait (maks: 5)

echo "<img src=images/berita_terkait.jpg><br /><ul>";

// pisahkan kata per kalimat lalu hitung jumlah kata

$pisah_kata = explode(",",$dbr[tag]); $jml_katakan = (integer)count($pisah_kata); $jml_kata = $jml_katakan-1;

$ambil_id = substr($_GET[id],0,4);

// Looping query sebanyak jml_kata

$cari1 = "SELECT * FROM berita WHERE (id_berita<'$ambil_id') and (id_berita!='$ambil_id'

) and (" ;

for ($f=0; $f<=$jml_kata; $f++){

$cari1 .= "tag LIKE '%$pisah_kata[$f]%'"; if ($f < $jml_kata ){

$cari1 .= " OR "; }

}

$cari1 .= ") ORDER BY id_berita DESC LIMIT 5";

$hasil1 = mysql_query($cari1);

while($hsl=mysql_fetch_array($hasil1)){

echo "<li><a href=?view=detailberita&id=$hsl[id_berita]-$hsl[judul_seo].html>$hsl[judul]</a></li>";

}

echo "</ul>";

// Apabila detail berita dilihat, maka tambahkan berapa kali dibacanya

mysql_query("UPDATE berita SET dibaca=$dbr[dibaca]+1

WHERE id_berita='$_GET[id]'");

// Hitung jumlah komentar

(6)

id_berita='$_GET[id]' AND aktif='Y'"); $kmt = mysql_fetch_array($komentar);

echo "<br /><span class=judul><b>$kmt[jml]</b> Komentar : </span><br /><hr color=#CCC noshade=noshade />";

// Paging komentar

$p = new Paging3; $batas = 10;

$posisi = $p->cariPosisi($batas);

// Komentar berita

$sqlq = mysql_query("SELECT * FROM komentar WHERE id_berita='$_GET[id]' AND aktif

='Y' LIMIT $posisi,$batas");

$jmlh = mysql_num_rows($sqlq);

// Apabila sudah ada komentar, tampilkan

if ($jmlh > 0){

while ($show = mysql_fetch_array($sqlq)){ $tanggal = tgl_indo($show[tgl]);

// Apabila ada link website diisi, tampilkan dalam bentuk link if ($show[url]!=''){

echo "<span class=komentar><a name=$show[id_komentar] id=$show[id_komentar]><a hr ef='http://$s[url]' target='_blank'>$show[nama_komentar]</a></a></span><br />";

} else{

echo "<span class=komentar>$show[nama_komentar]</span><br />"; }

echo "<span class=tanggal>$tanggal - $show[jam_komentar] WITA</span><br /><br />"; echo "<span class=komentar>$show[isi_komentar]</span><br>";

echo "<hr color=#CCC noshade=noshade />"; }

$jmldata = mysql_num_rows(mysql_query("SELECT * FROM komentar WHERE id_ber ita='$_GET[id]'"));

$jmlhalaman = $p->jumlahHalaman($jmldata, $batas);

$linkHalaman = $p->navHalaman($_GET['halkomentar'], $jmlhalaman); echo "$linkHalaman";

(7)

}

// Form komentar

echo "<br /><b>Isi Komentar :</b>

<table width=100% style='border: 1pt dashed #0000CC;padding: 10px;'>

<form name='form' action=simpankomentar.php method=POST onSubmit=\"return validasi (this)\">

<input type=hidden name=id value=$_GET[id]>

<tr><td>Nama</td><td> : <input type=text name=nama_komentar size=40 maxlength=50> </td></tr>

<tr><td>Website</td><td> : <input type=text name=url size=40 maxlength=50></td></tr> <tr><td valign=top>Komentar</td><td> <textarea name='isi_komentar' style='width: 300p x; height: 100px;'></textarea></td></tr>

<tr><td> </td><td><img src='captcha.php'></td></tr>

<tr><td> </td><td>(Masukkan 6 kode diatas)<br /><input type=text name=kode size=6 ma xlength=6><br /></td></tr>

<tr><td> </td><td><input type=submit name=submit value=Kirim></td></tr> </form></table><br />";

} ?>

http://forumphp.web.id/

KEAMANAN

$judul=trim($_POST[judul]); $headline=trim($_POST[headline]); $berita=trim($_POST[berita]); if (empty($judul)){

echo "Anda belum mengisikan Judul<br />

<a href=javascript:history.go(-1)><b>Ulangi Lagi</b>"; }

elseif (empty($headline)){

echo "Anda belum mengisikan headline<br />

<a href=javascript:history.go(-1)><b>Ulangi Lagi</b>"; }

elseif (strlen($_POST[headline]) > 1000) {

echo "headlineAnda kepanjangan, dikurangin atau dibagi jadi beberapa bagian.<br /> <a href=javascript:history.go(-1)><b>Ulangi Lagi</b>";

(8)

else{

function antiinjection($data){

$filter_sql = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($data,ENT_QU OTES))));

return $filter_sql; }

$judul= antiinjection($_POST[judul]); $headline= antiinjection($_POST[headline]); $berita= antiinjection($_POST[berita]);

http://www.kaskus.us/

Dalam Web Script batasan jumlah Login User sudah tentu ada, jika pada program dekstop akan mengakhiri program ketika User menginputkan username dan password salah dalam jumlah yang telah ditentukan, maka dalam Web biasanya akan ada dua kemungkinan. 1. Akun Akan diblokir dalam database, mungkin gambarnya seperti ini

2. Akun akan login kembali setelah beberapa menit kemudian tergantung banyaknya pengaturan jumlah waktu, ini disebut timer login

Dalam posting kali ini, kami akan membahas No.1, yaitu bila User menginputkan Username dan Password salah dalam 3 kali, maka Username tersebut akan diblokir dan tidak bisa Login kembali sebelum menghubungi Admin. Langkahnya sebagai berikut :

1. Buat Database bebas, Misal Sumberdaya, Jika belum paham cara buat database MySql, silahkan baca kembali Cara Membuat database PHP MySql

(9)

2. Jika database sudah dibuat, langkah selanjutnya adalah Buatlah Tabel misalkan kita berinama Users, untuk cara membuat tabel silahkan baca artikel pada nomor 1, satu paket dengan cara pebuatan database

3. Didalam tabel Users, yang wajib diperhatikan adalah filed batas_login dan blokir, kedua field inilah yang nantinya akan kita mainkan dalam script, Logikanya, jika batas login user adalah 3

kali, maka status blokir akan berubah 'Y' ketika user menginputkan sebanyak 3 kali salah

4. Langkah selanjutnya adalah, kita lihat script pada Cek_login.php <?php include "config/koneksi.php"; function antiinjection($data){ $filter_sql = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($data,ENT_QUOTES)))); return $filter_sql; } $username = antiinjection($_POST['username']); $pass = antiinjection(md5($_POST['password'])); if (!ctype_alnum($username) OR !ctype_alnum($pass)){ echo "<script type=text/javascript>

alert('Script Login');

window.location = 'http://www.google.com/' //yang ini pengalihan ketika user salah </script>";

//header('location:index.php'); }

else{

(10)

password='$pass' AND blokir='N'"); $ketemu=mysql_num_rows($login); $r=mysql_fetch_array($login);

// Apabila username dan password ditemukan if ($ketemu > 0){

mysql_query("UPDATE users SET batas_login = 0 where username='$username'"); session_start(); session_register("namauser"); session_register("namalengkap"); session_register("passuser"); session_register("leveluser"); $_SESSION[namauser] = $r[username]; $_SESSION[namalengkap] = $r[nama_lengkap]; $_SESSION[passuser] = $r[password]; $_SESSION[leveluser] = $r[level]; header('location:media.php?module=home'); } else{

mysql_query("UPDATE users SET batas_login = batas_login + 1 where username='$username'");

$a=mysql_fetch_array(mysql_query("SELECT batas_login from users where username = '$username'"));

$b=$a['batas_login']; if($b > 2){

mysql_query("UPDATE users SET blokir = 'Y' where username='$username'"); echo "<script type=text/javascript>

alert('Username $username Telah Di Blokir, Silahkan Hubungi Administrator'); window.location = 'http://www.google.com/'

</script>"; }

else{

echo "<script type=text/javascript>

(11)

window.location.href='index.php' </script>"; } } } ?>

5. Keterangan tulisan warna merah

- http://www.google.com/ adalah script pengalihan program ketika user diblokir - users adalah nama table dalam database

- batas_login adalah field pada tabel users yang menentukan banyaknya batasan login - blokir adalah field yang ada pada tabel user yang berfungsi sebagai aktif dan tidaknya user - $b adalah variabel yang digunakan untuk penetuan banyaknya jumlah login

- 2 adalah jumlah maksimal login

6. Jalankan program, dan Jika program dijalankan maka akan terlihat seperti ini

Form Login

Masukan username yang telah ada pada database, kemudan masukan password yang salah, makan akan keluar alert, dan setelah memasukan passwrod sebanyak tigakali salah, maka alert terakhir adalah username diblokir

(12)

Catatan :

Untuk membuat script batasan jumlah login, kita hanya merubah sedikit pada file cek_login.php dan manipulasi database pada tabel users.

http://onebaja.blogspot.com/

Pergunakan Anti SQL Injection

SQL Injection merupakan teknik menyusupkan perintah SQL kedalam query dengan cara memanipulasi input data pada sebuah aplikasi.

Bagaimana menanggulanginya? Berikut adalah fungsi Anti SQL Injection yang sering saya pergunakan.

function anti_sql_injection( $input ) {

// daftarkan perintah-perintah SQL yang tidak boleh ada // dalam query dimana SQL Injection mungkin dilakukan $aforbidden = array (

"insert", "select", "update", "delete", "truncate", "replace", "drop", " or ", ";", "#", "--", "=" );

// lakukan cek, input tidak mengandung perintah yang tidak boleh $breturn=true; foreach($aforbidden as $cforbidden) { if(strripos($input, $cforbidden)) { $breturn=false; break; } } return $breturn; }

Cara memanfaatkan fungsi tersebut adalah sebagai berikut (contoh pada proses login dimana SQL injection kerap dilakukan)

if(anti_sql_injection($_POST['user']) and anti_sql_injection($_POST['password'])) { // lakukan proses login

} else { die();

(13)

}

Selain itu, SQL injection juga dapat dicegah dengan pengaturan priveleges pada database yang dipergunakan. Misalnya, bagian situs yang hanya berfungsi memperlihatkan data melalui query select menggunakan user dengan privelege select saja. Bagian situs yang berfungsi untuk memberi kesempatan pembaca untuk berkomentar menggunakan user dengan privelege insert saja dst.

Pergunakan session_regenerate_id() Untuk Pembuatan Session

Selintas penggunaan session adalah teknik yang aman untuk menjaga sebuah halaman agar tidak bisa dikunjungi oleh sembarang orang. Misalnya, pemanfaatan session untuk halaman

administrasi sebuah situs. Namun, session pun memiliki titik kelemahan yang bisa dieksploitasi attacker dan dipergunakan sebagai senjata untuk menyerang sistem aplikasi.

Cara paling mudah untuk memanfaatkan session sebagai titik kelemahan sistem aplikasi adalah menggunakan metode fixation. Session faxation adalah metode dimana seorang attacker

menyerang browser user sebelum login dilakukan. Yaitu dengan memasukkan id session untuk kemudian dimanfaatkan dengan tujuan tertentu.

Berikut adalah ilustrasi bagaimana session fixation dilakukan untuk menyerang keamanan sistem aplikasi berbasis web.

session_start();

if($_SESSION['id_user']<>13) { // Proses login (authentifikasi)

// Jika login sukses, jalankan perintah dibawah ini $_SESSION['id_user']=13;

} else {

if($_SESSION['id_user']==13) { // lakukan proses A

}

Script diatas adalah bagian dimana variable id_user (13) didaftarkan sebagai variable session JIKA pengunjung belum login dan login yang dilakukan sukses. Artinya, jika login pernah dilakukan maka halaman ini tidak akan melakukan proses login dan langsung melakukan proses A.

Langkah selanjutnya, pastikan bahwa browser yang digunakan bersih dari session sebelumnya. Lalu ketikan alamat script diatas dengan menambahkan PHPSESSID=1804.

Misalnya nama file script diatas adalah test.php dan diletakkan di server.com, maka yang harus Anda tuliskan adalah http://server.com/test.php?PHPSESSID=1804 dan lakukan login. Setelah

(14)

itu, silakan Anda mencoba mengakses alamat tersebut diatas menggunakan browser lain atau komputer lain yang terhubung dengan server.com. Hasilnya, Anda akan melakukan proses A tanpa melakukan login!

Hal diatas terjadi akibat id session yang dipergunakan saat session dibentuk adalah sama dengan id session yang sebelumnya telah diketikkan secara “paksa” dalam URL. Untuk menanggulangi hal ini, diperlukan fungsi untuk meng-generate ulang id session yaitu dengan menggunakan fungsi session_regenerate_id() sehingga bagian script diatas menjadi seperti dibawah ini: session_start();

if($_SESSION['id_user']<>13) { // Proses login (authentifikasi)

// Jika login sukses, jalankan perintah dibawah ini session_regenerate_id(); $_SESSION['id_user']=13; } else { if($_SESSION['id_user']==13) { // lakukan proses A }

Secara default, penggunaan fungsi session_regenerate_id() tidak serta merta akan menghapus session sebelumnya secara otomatis. Agar session_regenerate_id() menghapus/menghancurkan session sebelumnya, Anda perlu menambahkan parameter boolean true pada fungsi tersebut. Sayangnya, parameter ini hanya bisa digunakan untuk PHP dengan versi 5.1.0 keatas.

Referensi

Dokumen terkait