Membuat Aplikasi PHP Yang Aman Bag. 1

Vulnerabilities atau kelemahan keamanan pada aplikasi berbasis web menggunakan PHP merupakan issue yang tak habis-habisnya dibahas. Tulisan kali ini berisi tip dan trik membuat aplikasi PHP yang aman.

1. Perhatikan Register Global selalu dalam kondisi OFF.

Sebenarnya tidaklah selalu benar bahwa jika register global berkondisi on lantas aplikasi PHP yang dibuat tidak aman. Ini semua bergantung kepada bagaimana seorang programmer membuat script-nya.

Berikut contoh kelemahan keamanan yang disebabkan oleh kesalahan dalam penulisan script yang mengakibatkan penyerang dapat dengan mudah memanfaatkan register global berkondisi on.

[php]
// lokasi script: http://localhost/login.php
// script login yang dipanggil dari sebuah form untuk masuk kedalam halaman Admin

// set variable $oke manjadi true jika autentifikasi sukses
if (authentifikasi($_POST['user'],$_POST['password']) {
$oke=true;
}

if ($oke) {
// masuk ke halaman admin
}
[/php]

Sekilas kode script diatas adalah kode yang aman, tetapi sebenarnya sama sekali tidak dengan kondisi register global on. Mengapa? Halaman Admin bisa diakses oleh siapa pun tanpa proses authentifikasi melalui alamat http://localhost/login.php?oke=true.

Bagaimana memperbaiki script diatas? Anda cukup menambahkan inisialisasi diawal seperti berikut:

[php num=5]
// Inisialisasi variable $oke
$oke=false;

if (authentifikasi($_POST['user'],$_POST['password']) {
$oke=true;
}
[/php]

atau

[php num=5]
if (authentifikasi($_POST['user'],$_POST['password']) {
$oke=true;
} else { // jika authentifikasi gagal, set variable $oke menjadi false
$oke=false;
}
[/php]

Contoh script diatas adalah salah satu dari kelemahan keamanan yang disebabkan oleh register global berkondisi on. Di sisi lain, programmer juga harus turut menanggung dosa akibat teknik programmingnya yang membuka kesempatan penyerang untuk mengeksploitasi kelemahan keamanan.

Teknik lain untuk mengamankan aplikasi dari ancaman register global berkondisi on adalah menerapkan apa yang disebut security throuh obscurity (keamanan dengan teknik penyembunyian). Hanya saja, kelemahan keamanan akan segera ditemukan jika aplikasi dibuat menjadi aplikasi opensource, dimana calon penyerang dapat melihat sourcecode-nya secara langsung.

Jadi memang tidak benar 100% kalau kelemahan keamanan aplikasi PHP bermula dari register global berkondisi on. Ekploitasi kelemahan keamanan sistem hanya terjadi akibat kesalahan teknik dalam pembuatan program, dan karena aplikasi dibuat menjadi opensource yang memungkinkan calon penyerang melihat sourcecode nya secara langsung.

Terlepas dari semua itu, programmer haruslah memiliki security mind yang memadai dalam membuat aplikasi, apalagi jika memiliki niat untuk membuatnya menjadi aplikasi opensource. Tetapi programmer juga manusia yang tak luput dari kesalahan. Jadi 100% PHP tidak salah melakukan keputusan untuk membuat default register global berkondisi off sejak versi 4.2.0.

Bersambung ke Membuat Aplikasi PHP Yang Aman Bag. 2

19 Comments

  1. Authentikasi model ini :
    if (authentifikasi($_POST['user'],$_POST['password']) {
    $oke=true;
    }
    else {
    $oke=false;
    }

    Juga masih memungkinkan adanya kelemahan, kelemahan dapat terjadi apabila dalam proses query tidak di sertai checking input (misalnya user= ‘or”=’ dan password = ‘or”=’), serta apabila kedua inputan dipakai untuk melakukan query secara bersamaan.
    Cara yang lebih aman menurut saya seperti ini:
    Logic dalam fungsi authentikasi sebaiknya:

    $query = “select password from user where userid=’”.$user.”‘”;
    jika hasil_query == 1
    {
    jika pencocokan_password($pw_hasil_query, $pw_inputan) == true
    return true;
    else
    return false;
    }
    else
    return false;

    Mungkin cara ini juga tidak aman, ada ide lain?

  2. anghuda says:

    untuk menghindari SQL Injection seperti yang dikhawatirkan Aris, maka perlu validasi terhadap inputan data :

    1. diperiksa dulu

    if (preg_match(“/^\w{8,20}$/”, $_POST['user'], $matches))
    $result = mysql_query(“SELECT * FROM users WHERE username=$matches[0]“);

    pola preg_match bisa mengikui aturan pembuatan username, seperti batasan panjang, karakter, dsb …

    2. gunakan mysql_real_escape_string()

    SELECT * FROM users WHERE username=”‘.mysql_real_escape_string($_POST['username']).’”

  3. Riyogarta says:

    Waduh … yang ditanyakan oleh Aris itu namanya masalah SQL Injection, udah di jawab oleh Huda …. padahal ini yang mau saya bahas di bagian dua :D

  4. nambahi sekalian : utk mencegah sql injection, gunakan aja md5 thd password dan usernya.

  5. @Riyogarta
    Di bahas lagi juga gpp kok. Khan saling melengkapi gitu.

  6. [...] Sambungan dari: Membuat Aplikasi PHP Yang Aman Bag. 1 [...]

  7. ichan says:

    bahasa tingkat tinggi yah :o mantep bgt tutorial nya :d,,,,, makasih yah sangat berguna ,,,,, :)>-
    —————————————————–
    makasih sebelum dan sesudahnya :”>
    mau tanya membuat login yang aman menggunakan PHP & MySQL ,,,, dengan (3level user) bagaimana caranya :-w ,,,,, di nanti replaynya :(

    makasih

  8. Yudhi Saputra Pribadi says:

    Wah semuanya udh dijawab…kalo gw suka pake jadi setiap setiap paramater yang di lempar itu di ereg di bersihin pake addslashes or mysql_escape_string ato sejenisnya…terus abis itu pada saat variable2 ini di lempar untuk query di query ada macam validasi lagi untuk ngecek apa dia itu untuk select ato untuk insert dan sejenisnya..begitu bro… ga tau ini aman apa ga yang jelas pada saat query gede repot gw aga sedikit load tinggi juga sih…!

  9. Dalton says:

    saya pemula dalam pemrograman PHP, dan saya mohon bantuannya mengenai script php. saya buat script untuk login(authentication) dan setelah dijalankan berhasil untuk user diurutan pertama, tapi disaat saya login menggunakan user kedua maupun ketiga informasinya gagal. intinya hanya user paling awal itu bisa login sedangkan yg kedua dst. tdk bisa login, kenapa ya???
    ini contoh scriptnya:
    nama file: cek_login.php

    mohon bantuannya dan kirim ke: dalton@lets.or.id

  10. Dalton says:

    saya pemula dalam pemrograman PHP, dan saya mohon bantuannya mengenai script php. saya buat script untuk login(authentication) dan setelah dijalankan berhasil untuk user diurutan pertama, tapi disaat saya login menggunakan user kedua maupun ketiga informasinya gagal. intinya hanya user paling awal itu bisa login sedangkan yg kedua dst. tdk bisa login, kenapa ya???
    ini contoh scriptnya:
    nama file: cek_login.php
    session_start();
    session_register(“username”);
    if ((!$username) or (!$password))
    echo “Login tidak lengkap”;
    else
    {
    $koneksi = mysql_connect(“localhost”,”root”,”") or die (mysql_error());
    mysql_select_db(“lets2″,$koneksi);
    $pas = md5 ($password);
    $login = mysql_query(“select count(*) as login from anggota where username=’$username’ and password=’$pas’”, $koneksi) or die (mysql_error());
    $row = mysql_fetch_array($login);
    if ($row["login"]==”1″)
    {
    session_register(“username”);
    header(“location:member.php”);
    }
    else
    header(“location:bukan_member.php”);
    }

    mohon bantuannya dan kirim ke: dalton@lets.or.id

  11. jack says:

    Kalau script di bawah ini lemahnya dimana mas,script ini dan ada anti SQL Injectionnya….Bantu ya para suhu!!!

    $id, ‘pass’ => $pass );

    if ( in_array ( NULL, $array ) )
    {
    die ( ‘Tidak di Izinkan Menggunakan Karakter ataupun perintah SQL’ );
    }
    else
    {
    return $array;
    }
    }

    $aman = anti_injection ( $_POST['id'], $_POST['pass'] );

    $login = mysql_query(“select * from admin where (id = ‘” . $aman['id'] . “‘) and (pass = ‘” . md5($aman['pass']) . “‘)”,$conn);
    $rowcount = mysql_num_rows($login);
    if ($rowcount == 1) {
    $_SESSION['username'] = $_POST['id'];
    header(“Location: menu.php”);
    }
    else
    {
    echo (“ACCESS DENIED!!!!!!!!!!”);
    echo (“LOGIN LAGI“);

    }
    ?>

    Nah kira-kira apa tuh salahnya script ku???

  12. Pemula PHP says:

    Maaaf kalo kurang berkenan.
    mau nimbrung tentang masalah autentikasi login, kalo saya sih mah saranin ke temen2 yang mau buat autentikasi trus autentikasinya itu ngambil data user dan passwornya dari database, seperti yang dipunya mas jack. saran :
    1. pake perintah escape_string mysql (dah dibahas diatas)
    2. passwornya kalo bisa di enkripsi MD5 sebelum dimasukin ke database(jadi yang tersimpan di db yang udah terengkripsi)
    3. pas lagi querry gak usah semua data dipanggil dari db
    kayak gini :

    $id=$_POST["id"];
    $pass=$_POST["pass"];

    $login = mysql_query(“select * from admin where id= ‘$id’ and pass=’$pass’”);

    trus dicek lagi :

    $rowcount = mysql_num_rows($login);
    if ($rowcount == 1) {
    $_SESSION['username'] = $_POST['id'];
    header(“Location: menu.php”);
    }

    sarannya :
    cukup querry aja salah satunya pass atau id-nya aja
    kalo dapat baru bandingin dengan masukannya sama gak kalo sama baru disimpan di session
    contoh :

    $id=$_POST["id"];
    $pass=$_POST["pass"];

    $id=mysql_escape_string($id);
    $pass=md5($pass);

    $login = mysql_query(“select * from admin where id=’$id’”);

    atau bisa juga yang diambil pass nya aja :

    $login = mysql_query(“select * from admin where pass=’$pass’”);

    data=mysql_fecth_array($login);
    $IDX = data["id"];
    $PASSX = data["pass"];

    trus bandingin deh :
    kalo yang diambil id berarti yang dibandingin passnya
    if ($PASSx == $pass){

    $_SESSION['IDX'];
    $_SESSION['PASSX'];

    header(“Location: menu.php”);
    }else {

    // teserah mau dtulisin apa disini

    }

    nah, mungkin kayak gitu dech
    saya khan masih pemula jadi mungkin yang udah master disini bisa ngembangin lebih baik

    trims

  13. eko purnomo says:

    Mo tanya tentang passing variabel input dalam WAMP dan XAMPP.
    Maaf saya adalah pemula dalam php, ada yang saya ingin tanyakan dalam forum ini.
    Ketika saya memakai web server php triad versi 1.2.1 menggunakan php4 ketika menangkap variabel input yang dikirimkan dari form input.html menggunakan form action hasilnya normal dan isi variabel sudah bisa dibaca. tp kenapa saya ketika menggunakan wamp atau xampp dengan php5 variabel tersebut tidak bisa dibaca, bahkan saya menggunakan method=get pun hasil variabel bisa dibaca dalam header tapi tidak bisa muncul dalam form? mohon bantuannya karena saya ingin pake xampp yg terbaru dg php 5 utk project saya.
    terima kasih

  14. doez says:

    thank’s

  15. ibrohim says:

    b//

  16. efri says:

    sorry….
    saya mau tanya-tanya??? atau ada sobat-sobat yang dapat bantu saya?
    saya mahasiswa terakhir dan sudah ujian akhir, tapi saya lagi terbantur dengan sistem yang saya bangun dengan menggunakan php dan database mysql, coz dosen penguji saya memintah form input pengguna, padahal seluruhnya udah jelas saya buat, bahwa setiap user itu sudah ada bagiannya masing-masing, tapi memang tidak ada form untuk bagi pengguna baru misalnya pimpinan atau operasional yang baru.
    thank’s, tolong sarannya, secepatnya

  17. triyandi says:

    mas, kalau ingin membuat user login tapi setiap user punya data diri mereka masing-masing bagaimana ya?contoh ,user login,kemudian data2 nya ditampilkan tentang datanya,lain halnya dengan user yang lain begitu pula selanjutnya.tolong dijawab ya pertanyaan saya melaluai e-mail saya oce…

  18. What blog script do you use on your site ?

  19. Wahyudi says:

    mas da yg bisa buat stok obat pake php ga databasenya MySQL….tolong mas contoh sriptnya…saya tnggu infonya…!! k\\
    send to : bad4boy@ymail.com (facebook.com)

Leave a Reply