perpisahanmu denganku
tak pernah aku inginkan
namun aku yakin ini yang terbaik
– Kisah Kita Tlah Usai, Ello

 

Seperti biasa, kuliah ComputerSecurity selalu berakhir dengan tugas yang dengan senang hati diberikan oleh Pak Iwan dosen saya. Dan tugas untuk minggu ini adalah membuat secure login yang relatif aman terhadap SQL Injection menggunakan bahasa pemrograman sesukanya. Wah seepphhh!! bisa maen maen pake java saya.

 

Pertamanya dengan niat suci dan rada maksa, pengen bikin login berbasis web yang sedikit pake prinsip MVC. Ide gila yang ada di kepala saya adalah memakai kombinasi Hibernate-Spring-GwtExt. Untuk sebuah tugas membuat login
sederhana, kombinasi tersebut layaknya membunuh nyamuk dengan bom nuklir. Selain itu , saya juga agak mentok kalau mengenkripsi database klo pake ORMnya hibernate. Setelah itu, turun level lagi, SpringJDBC-Servlet-GwtExt. Mentok lagi, karena error NoClassDefFoundError dari spring. Walaupun error ini berhasil diatasi, berkat wejangan dari bos JUG Thomas Wiradikusuma. Akhirnya arsitektur final dari secure login yang saya bikin adalah sebagai berikut.

 

diagram-aplikasi.jpg

 

MVC Kecil kecilan

 

Finalnya saya pake Servlet dan layer viewnya saya pake ZK-JSP. Pengamanan yang saya lakukan untuk menghandle injeksi SQl dilakukan di dua tempat. Pada level database dan di layer Model.

 

Enkripsi md5 ala MySql pada data layer

 >

Database yang saya gunakan kali ini adalah MySql 5. Pengamanan pada level ini adalah penggunaan fungsi bawaanl MySql md5() untuk mengenkripsi input username dan password dari user. Dapat dilihat pada gambar dibawah ini.

 

data-layer.jpg
Data Layer: Struktur Tabel beserta query untuk mendapatkan username

 e dan password yang diinputkan user dienkripsi terlebih dahulu menggunakan md5 setelah itu dicocokkan dengan kolom user/pass_md5 yang berisi hasil enkripsi dari kolom username dan securePass.

 

Penggunaan PreparedStatement pada Layer Model

 

Dapat dilihat di diagram aplikasi saya diatas, yang memanage koneksi JDBC ke MySql adalah class KonekDb.

 

 package database.beans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.sql.PreparedStatement;
public class KonekDb {
    Connection con;
    PreparedStatement prepState;
    String driver,url,username,password;

    final String QUERY_LOGIN  = "     SELECT username FROM `secureuser2`
    WHERE user_md5=md5(?) AND pass_md5=md5(?)";

    private void setUpConnection() throws Exception{

        try{
        readProperties();
        Class.forName(driver);
        con = DriverManager.getConnection(url,username,password);
        }catch(Exception e){

            throw new SQLException(e);

        }

    }

    private void readProperties(){

        driver = ResourceBundle
        .getBundle("mysql").getString("driver");

        url = ResourceBundle
        .getBundle("mysql").getString("url");

        username = ResourceBundle
        .getBundle("mysql").getString("username");

        password = ResourceBundle
        .getBundle("mysql").getString("password");
    }

    public String queryLogin(String user, String pass) throws Exception{

        String userReturned = "";    

        try{

        setUpConnection();
        prepState = con.prepareStatement(QUERY_LOGIN);
        prepState.setString(1,user);
        prepState.setString(2, pass);
        ResultSet RsLogin = prepState.executeQuery();

        RsLogin.first();
        userReturned = RsLogin.getString(1);
        RsLogin.close();

        }catch(Exception e){

        throw new SQLException(e);

        }
        return userReturned;

    }
}
Dengan menggunakan PreparedStatement, input akan dianalisis dulu oleh JVM seblum dieksekusi ke dalam MySql. Menurut Wikipedia, PreparedStatement ini memang acara yang paling ampuh (pake nada jualan obat).

 

ZK JSP yang saya pake buat mempermanis tampilan menggunakan AJAX ternyata berat banget. Padahal cuman konek intranet dari kelas ke laboratorium, tapi loadingnya hampir 3 menitan. Saran saya pake AJAX framework yang javascrip-based aja, lebih ringan. Sebagai contoh bisa dicoba Gwt-Ext, ExtJs , Scriptaculous dan lain lain.

 

Sekian deulu deh laporan tugas saya. Oh ya , sekedar pamer. Didemokan sukses lho, beberapa script injeksi yang dimasukkan tidak mempan *tertawa bangga*. Mongo kalau ada yang diskusi. Kita bisa sharing ilmu bareng
Go Java Folks!!!

 

: )