Validasi Formulir PHP
Bab ini dan bab berikutnya menunjukkan cara menggunakan PHP untuk memvalidasi data formulir.
Validasi Formulir PHP
Pikirkan KEAMANAN saat memproses formulir PHP!
Halaman-halaman ini akan menunjukkan cara memproses formulir PHP dengan mempertimbangkan keamanan. Validasi yang tepat dari data formulir penting untuk melindungi formulir Anda dari peretas dan spammer!
Formulir HTML yang akan kita kerjakan dalam bab ini, berisi berbagai bidang input: bidang teks wajib dan opsional, tombol radio, dan tombol kirim:
Aturan validasi untuk formulir di atas adalah sebagai berikut:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
Pertama kita akan melihat kode HTML biasa untuk formulir:
Bidang Teks
Bidang nama, email, dan situs web adalah elemen input teks, dan bidang komentar adalah area teks. Kode HTML terlihat seperti ini:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
Tombol radio
Bidang gender adalah tombol radio dan kode HTML terlihat seperti ini:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
Elemen Bentuk
Kode HTML formulir terlihat seperti ini:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Saat formulir dikirimkan, data formulir dikirim dengan metode = "posting".
Apa variabel $_SERVER["PHP_SELF"]?
$_SERVER["PHP_SELF"] adalah variabel super global yang mengembalikan nama file dari skrip yang sedang dieksekusi.
Jadi, $_SERVER["PHP_SELF"] mengirimkan data formulir yang dikirimkan ke halaman itu sendiri, alih-alih melompat ke halaman lain. Dengan cara ini, pengguna akan mendapatkan pesan kesalahan pada halaman yang sama dengan formulir.
Apa fungsi htmlspecialchars()?
Fungsi htmlspecialchars() mengonversi karakter khusus menjadi entitas HTML. Artinya akan menggantikan karakter HTML seperti < dan > dengan < dan >. Ini mencegah penyerang mengeksploitasi kode dengan menyuntikkan kode HTML atau Javascript (serangan Cross-site Scripting) ke dalam formulir.
Catatan Besar tentang Keamanan Formulir PHP
Variabel $_SERVER["PHP_SELF"] dapat digunakan oleh peretas!
Jika PHP_SELF digunakan di halaman Anda, maka pengguna dapat memasukkan garis miring (/) dan kemudian beberapa perintah Cross Site Scripting (XSS) untuk dieksekusi.
Cross-site scripting (XSS) adalah jenis kerentanan keamanan komputer yang biasanya ditemukan di aplikasi Web. XSS memungkinkan penyerang untuk menyuntikkan skrip sisi klien ke halaman Web yang dilihat oleh pengguna lain.
Asumsikan kita memiliki formulir berikut di halaman bernama "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Sekarang, jika pengguna memasukkan URL normal di bilah alamat seperti "http://www.example.com/test_form.php", kode di atas akan diterjemahkan ke:
<form method="post" action="test_form.php">
Sejauh ini bagus.
Namun, pertimbangkan bahwa pengguna memasukkan URL berikut di bilah alamat:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
Dalam hal ini, kode di atas akan diterjemahkan ke:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Kode ini menambahkan tag skrip dan perintah peringatan. Dan ketika halaman dimuat, kode JavaScript akan dieksekusi (pengguna akan melihat kotak peringatan). Ini hanyalah contoh sederhana dan tidak berbahaya bagaimana variabel PHP_SELF dapat dieksploitasi.
Ketahuilah bahwa kode JavaScript apa pun dapat ditambahkan di dalam tag <script>! Seorang peretas dapat mengarahkan pengguna ke file di server lain, dan file itu dapat menyimpan kode berbahaya yang dapat mengubah variabel global atau mengirimkan formulir ke alamat lain untuk menyimpan data pengguna, misalnya.
Bagaimana Menghindari Eksploitasi $_SERVER["PHP_SELF"]?
Eksploitasi $_SERVER["PHP_SELF"] dapat dihindari dengan menggunakan fungsi htmlspecialchars().
Kode formulir akan terlihat seperti ini:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Fungsi htmlspecialchars() mengonversi karakter khusus menjadi entitas HTML. Sekarang jika pengguna mencoba mengeksploitasi variabel PHP_SELF, itu akan menghasilkan output berikut:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Upaya eksploitasi gagal, dan tidak ada salahnya dilakukan!
Validasi Data Formulir Dengan PHP
Hal pertama yang akan kita lakukan adalah meneruskan semua variabel melalui fungsi htmlspecialchars() PHP.
Saat kita menggunakan fungsi htmlspecialchars(); lalu jika pengguna mencoba mengirimkan yang berikut ini di bidang teks:
<script>location.href('http://www.hacked.com')</script>
- ini tidak akan dieksekusi, karena akan disimpan sebagai kode lolos HTML, seperti ini:
<script>location.href('http://www.hacked.com')</script>
Kode sekarang aman untuk ditampilkan di halaman atau di dalam email.
Kami juga akan melakukan dua hal lagi saat pengguna mengirimkan formulir:
- Hapus karakter yang tidak perlu (spasi ekstra, tab, baris baru) dari data input pengguna (dengan fungsi PHP trim())
- Hapus garis miring terbalik (\) dari data input pengguna (dengan fungsi stripslash PHP())
Langkah selanjutnya adalah membuat fungsi yang akan melakukan semua pemeriksaan untuk kita (yang jauh lebih nyaman daripada menulis kode yang sama berulang-ulang).
Kami akan memberi nama fungsi test_input().
Sekarang, kita dapat memeriksa setiap variabel $_POST dengan fungsi test_input(), dan skripnya terlihat seperti ini:
Contoh
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Perhatikan bahwa di awal skrip, kami memeriksa apakah formulir telah dikirimkan menggunakan $_SERVER["REQUEST_METHOD"]. Jika REQUEST_METHOD adalah POST, maka formulir telah dikirimkan - dan harus divalidasi. Jika belum terkirim, lewati validasi dan tampilkan formulir kosong.
Namun, dalam contoh di atas, semua kolom input bersifat opsional. Script berfungsi dengan baik bahkan jika pengguna tidak memasukkan data apa pun.
Langkah selanjutnya adalah membuat kolom input yang diperlukan dan membuat pesan kesalahan jika diperlukan.