PHP MySQL Connect Security

Dalam programming, tentu saja pesan error sangat membantu programmer melakukan debugging. Tetapi pesan error tersebut bisa menjadi bumerang yang malah menguntungkan para hacker oportunis. Kenapa bisa terjadi? Coba baca tulisan saya di posting ini, bagaimana bisa menebak nama bokap teman anda dengan metode ‘salah sambung’. Pesan error begitu sangat vital untuk website yang sudah publish dan running. Jadi sebaiknya dihilangkan saja pada website anda. Pada posting kesempatan kali ini, saya beri contoh hal terkecil saja. Hanya karena kurang satu karakter ini di code anda, informasi server anda sedikit “terbuka”.

Untuk contoh kali ini, saya buat yang sangat simple aja. Ada sistem informasi pegawai yang menyimpan nama karyawan dan badge number (ID karyawan)-nya. Informasi database (nama database, user pengakses database, nama table, dan isi row yang harus ditampilkan oleh program nantinya..). Pada contoh ini, DB akan di akses oleh program PHP, sehingga diharapkan PHP akan memunculkan karyawan-karyawan tersebut.

sh-3.00$ mysql -u paijo
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 4.1.20

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+----------+
| Database |
+----------+
| test     |
| test_db  |
+----------+
2 rows in set (0.00 sec)

mysql> use test_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_table        |
+-------------------+
1 row in set (0.00 sec)

mysql> select * from test_table
    -> ;
+--------+----------+
| nama   | badge_no |
+--------+----------+
| dono   | 34234    |
| kasino | 21912    |
| indro  | 99192    |
+--------+----------+
3 rows in set (0.02 sec)

mysql>

Untuk code PHP-nya standar aja.. akses DB, nge-query, dan sajikan hasil query… Kode sederhananya disajikan sebagai berikut:

<?php
//variable koneksi database
$dbhost = "localhost";
$dbname = "test_db";
$dbuser = "paijo";
$dbpass = "";

//fungsi mysql_connect()
$dbconnect = mysql_connect("$dbhost","$dbuser","$dbpass");

//just in case jika koneksi gagal dgn error handlernya
if(!$dbconnect) {
echo "ga bisa konek..\n";
}

//fungsi mysql_select_db() untuk use database "test_db"
mysql_select_db("$dbname");

//asumsi di atas ini sudah konek.. buat query ke database dgn fungsi mysql_query()
$dbquery = mysql_query("SELECT * FROM test_table");

//looping print hasil dan fetch dalam array
while ($dbrow = mysql_fetch_array($dbquery))

//looping dimulai
{

//print array ['nama'] pada tabel test_table
echo "nama: ".$dbrow['nama'];
echo " ";

//print array ['badge no.'] pada tabel test_table
echo "b/n: ".$dbrow['badge_no'];
echo "\n";
//looping berakhir
}

?>

Hasilnya OK, program bisa menyajikan 3 karyawan dan b/n nya. Bisa dilihat dari hasil querynya sebagai berikut:

sh-3.00$ php dbconnect.php
Content-type: text/html
X-Powered-By: PHP/4.3.9

nama: dono  b/n: 34234
nama: kasino  b/n: 21912
nama: indro  b/n: 99192

Nah, sekarang mari kita paksa untuk program keluarkan pesan error.. Contoh kali ini, problem simple ajah.. saya matikan daemon mysqld-nya, pasti PHP gak akan bisa ngakses DB dan muncul pesan error. Mari kita lihat pesan error program ini ketika gak bisa akses DB karena process mysql-nya saya matikan.

Error Message PHP
Error Message PHP

Terlihat ada error handler PHP dengan pesan “ga bisa konek..” kemudian diikuti error message dari beberapa fungsi. Hanya dengan eror ini, beberapa informasi yang bisa didapatkan seputar server yaitu:

  • Directory root untuk webserver ada di /var/www/html/ pada server. Ada beberapa kasus yang directory rootnya ke /home/<namauser>/public_html dsb. Dari situ bisa diketahui nama user yang terdaftar di server.
  • Nama file dbconnect.php pasti berisi file konfigurasi koneksi ke database. Jika enumerasi login user dan password ke server berhasil, tinggal buka file ini untuk mengetahui credential login mengakses database.
  • Fungsi yang digunakan: mysql_connect(), mysql_query(), mysql_select_db(),  mysql_num_rows(), mysql_fetch_array()

Kenapa ini bisa berbahaya? Karena error message tersebut bisa menjadi “pendonor” informasi penting pada step reconnaissance dalam metode hacking untuk break-in ke sistem lebih jauh dan lebih dalam. Sebagai contoh, ini adalah hasil SQL injection hingga bisa break-in ke sistem hanya karena error message PHP & MySQL pada sebuah website.

Solusi untuk masalah spoiler error message ini sangat sederhana. Tinggal menambahkan karakter “@” di depan setiap nama fungsi sehingga pada kode di atas akan menjadi “@mysql_connect()”, “@mysql_query()”, “@mysql_select_db()”, “@mysql_num_rows()”, “@mysql_fetch_array()”. Setelah seluruh fungsi di dbconnect.php saya tambahkan “@” di depan nama fungsinya, dalam keadaan daemon mysqld masih mati (koneksi ke db masih putus), seperti ini output program dbconnect.php:

Tanpa Error Message Lebih Aman
Tanpa Error Message Lebih Aman

Hati-hati.. karena luput pada hal yang sederhana, dapat membuat informasi yang tak layak/tak penting diketahui publik menjadi terpublikasi heheh..

2 thoughts on “PHP MySQL Connect Security

Leave a Reply

Your email address will not be published. Required fields are marked *