Sistem Login yang Aman dengan PHP

Saya pertama kali belajar PHP, saya bingung dengan bagaimana sistem login di web. Saya mencari-cari artikel di internet dan banyak sekali variasi kode untuk halaman dan verifikasi login agar bisa masuk ke halaman tertentu, baik itu halaman admin atau halaman yang dilindungi oleh pembuatnya. Skema login sebenarnya sederhana dan pada tulisan ini saya juga hanya memberikan skema yang sederhana. Urutan autentikasi login ada 4:

  1. User melihat halaman dengan form untuk mengisi username dan password disertai dengan tombol untuk login, bisa juga ditambahkan dengan form lain misalnya Captcha berupa gambar. Kadang kala, form login tidak harus username dan password, bisa saja hanya form password saja yang ditampilkan.
  2. User memasukkan data dan memberikan data ke server untuk diproses.
  3. Data input username dan password diproses. Data ini dicocokan dengan database yang ada, misalnya database MySQL. Jika username dan password yang diberikan dari input user sama dengan username dan password pada database, maka login berhasil. Jika tidak ada data yang  cocok, maka login tidak berhasil.
  4. Buat session untuk akses file yang diproteksi. Session digunakan untuk keperluan yang kita inginkan. Session adalah variabel global yang bisa menyimpan data penanda bahwa seorang user telah berhasil login sehingga file yang diproteksi bisa diakses.

Skema login yang lebih kompeks bisa ditambahkan sesuai dengan kebutuhan, misalnya saja memeriksa IP, membatasi jumlah user yang login, dll. Pertama, kita harus membuat halaman login, kode-kode html di bawah ini adalah bagian dari keseluruhan html yang ada.

login.php

1
2
3
4
5
<form action="auth.php" method="post">
	<label for="username">Username</label><input type="text" name="username"  class="input" size="10" autocomplete="off" /><br /><br />
	<label for="password">Password</label><input type="text" name="password" class="input" size="20" autocomplete="off" /><br />
	<input type="submit" value="Login" class="btn" />
</form>

auth.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
	session_start();
	$user       = mysql_real_escape_string($_POST["user"]);
	$user       = substr($user, 0, 10);
	$password   = mysql_real_escape_string($_POST["password"]);
	$password   = substr($password, 0, 20);
	$q          = "SELECT * FROM user WHERE user='$user'";
	$r          = mysql_query($q);
	$d          = mysql_fetch_object($r);
 
	if($d->user == $user AND $d->password == md5($password))
	{
		$_SESSION["user"] = $data->user;
		$_SESSION["nama"] = $data->nama;
	}
	else
	{
		header("location: login.php");
	}
?>

Jika dilihat kode di atas, ada beberapa isu keamanan yang perlu diperhatikan.

  1. Gunakan $_POST, bukan $_GET, atau $_REQUEST. Metoda ini digunakan agar data dikirim lewat metoda POST yang tidak kelihatan lewat browser. REQUEST dicegah karena metoda ini masih menerima data dari GET.
  2. Gunakan fungsi mysql_real_escape_string(). Fungsi ini berguna untuk mengilangka tanda quote pada data input username dan password yang bisa membahayakan fungsi login kita dengan serangan sql injection. SQL injection adalah metode serangan pada halaman login dengan memasukkan inputan data yang salah sehingga sql kita menjadi tidak logis sesuai dengan tujuan awal, hasilnya bisa saja user mendapatkan akses admin tanpa harus mengetahui password admin tersebut.
  3. Ambil data username dari database terlebih dahulu. Pengecekan passwor dilakukan setelah mengambil data username terlebih dahulu. Sebisa mungkin hindari penggunaan perintah sql :
    1
    
    "SELECT * FROM user WHERE user='$user' and password='$password'";

    Kode sql di atas bisa rentan terhadap serangan sql injection.

  4. Batasi penggunaan input karakter pada form login. Form input bisa dibatasi dengan penggunaan tag size=”10″ pada kode html. Lakukan proteksi juga di sisi server dengan fungsi substr()
  5. Jangan simpan password pada $_SESSION. Session bisa saja disalahgunakan, oleh karena itu simpanlah data yang memang pentin pada session dan jangan menyimpan password.

Selamat mengamankan halaman login 🙂

Leave a Reply

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

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.