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.
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: 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!!!
: )
Like this:
Like Loading...
Related
hmm ….
aku pake zk (pure zk, without jsp) gapapa … bisa dikonek dari cs net meskipun agak lemot tapi masih itungan detik ….
btw punya source + tutorial Gwt-Ext ga?
aku yo tertarik ttg permasalahan CIS (Criptografi en Informesion Sekiuriti). Tp sing diajarno nang kuliahku kok rodho2 beda yo…
Sing diajarno ttg algoritma2 enkripsi dan dekripsi.
btw
ini code boleh di kopi tak??? π
salam kenal…
hehe… ini SQL injectionnya kayak apa ya?? aku pake PreparedStatement aja dah bisa nangani sedikit SQL injection π
*btw.. lagi berusaha keras utk menggabungkan gwt-ext dgn struts-spring neh >.< … 2 hari ga pernah cukup :((
Ak maw tanya nih
Gimana cara memulai menggunakan spring MVC pada oracle Jdeveloper?
Ak masih pemula nih…
Mohon bantuannya
Apakah perlu d import package springnya
Klo iya dapat darimana dan cara import nya gimana?
Thx
bisa minta file’nya g om.. saya baru belajar java, langsung dikasi tugas buat login form yang bisa nampilin database trus bisa langsung di edit juga.
terimakasih
SQL injection lewat tapi login brute force masih bisa.
ingat MD5 bisa terjadi collision
http://www.mathstat.dal.ca/~selinger/md5collision/
solusinya
ambil passwordnya dengan query dengan parameter username.
tapi usernamenya harus bebas string select, insert, delete, ;, –, and, or
trus untuk cegah brute force tambahkan captcha
happy coding kiki
Wah…kerenz abis! Tapi gw belum pernah tuh pake Ajax! lain kali posting tutorial Ajax y!Dari dasar…Ok, my man!
ZK bisa cepet asal tahu cara makenya, pake itu listmodel, servlet thread, pake genericforwardcomposer, initiator, jangan pake zscript dll..