Kali ini kita akan mempelajari cara menggunakan PHP untuk memvalidasi data formulir.
Section Artikel
Validasi Formulir PHP
KEAMANAN saat memproses formulir PHP!
Halaman-halaman ini akan menunjukkan bagaimana memproses formulir PHP dengan mempertimbangkan keamanan. Validasi data formulir yang tepat penting untuk melindungi formulir dari peretas dan pengirim spam!
Formulir HTML yang akan kita kerjakan sekaran akan berisi berbagai bidang masukan: bidang teks wajib dan opsional, tombol radio, dan tombol kirim, seperti di bawah ini:
![](https://dosenit.com/wp-content/uploads/2020/11/Form.jpg)
Aturan validasi untuk formulir di atas adalah sebagai berikut:
Field | Aturan Validasi |
---|---|
Name | Required. + Hanya boleh berisi huruf dan spasi |
Required. + Harus berisi alamat email yang valid (dengan @ dan.) | |
Website | Optional. Jika ada, itu harus berisi URL yang valid |
Comment | Optional. Bidang masukan multi-baris (area teks) |
Gender | Required. Harus memilih satu |
Sekarang, kita buat kode HTML biasa untuk formulir secara terpisah berdasar pada subnya:
Field Teks
Fields 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
Fields 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
Field Form/Formulir
Kode HTML formulir terlihat seperti ini:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Saat formulir dikirimkan, data formulir dikirim dengan method = “post”.
Apa itu 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 di halaman yang sama dengan formulir.
Apa itu fungsi htmlspecialchars ()?
Fungsi htmlspecialchars()
mengubah karakter khusus menjadi entitas HTML. Hal ini berarti itu akan menggantikan karakter HTML seperti < dan > dengan < dan >. Hal ini mencegah penyerang mengeksploitasi kode dengan memasukkan 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 kita, maka pengguna dapat memasukkan garis miring (/) dan kemudian beberapa perintah Cross Site Scripting (XSS) untuk dijalankan.
Skrip lintas situs (XSS) adalah jenis kerentanan keamanan komputer yang biasanya ditemukan di aplikasi Web. XSS memungkinkan penyerang memasukkan 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">
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 menjadi:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Kode ini menambahkan tag skrip dan perintah peringatan. Dan saat halaman dimuat, kode JavaScript akan dieksekusi (pengguna akan melihat kotak peringatan). Hal 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()
mengubah karakter khusus menjadi entitas HTML. Sekarang jika pengguna mencoba mengeksploitasi variabel PHP_SELF, maka akan menghasilkan keluaran berikut:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Upaya eksploitasi gagal dan tidak ada kerusakan yang 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 hal berikut di bidang teks:
<script>location.href('http://www.hacked.com')</script>
Kode di atas tidak akan dijalankan, karena akan disimpan sebagai kode pelolosan HTML, seperti ini:
<script>location.href('http://www.hacked.com')</script>
Kode Di atas cukup aman untuk ditampilkan di dalam halaman atau di dalam email.
Kita 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 PHPstripslashes()
)
Langkah selanjutnya adalah membuat fungsi yang akan melakukan semua pemeriksaan untuk kita (yang jauh lebih nyaman daripada menulis kode yang sama berulang kali).
Kita akan beri 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; } ?>
<!DOCTYPE HTML> <html> <head> </head> <body> <?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; } ?> <h2>PHP Form Validation Example</h2> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> Name: <input type="text" name="name"> <br><br> E-mail: <input type="text" name="email"> <br><br> Website: <input type="text" name="website"> <br><br> Comment: <textarea name="comment" rows="5" cols="40"></textarea> <br><br> 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 <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>Your Input:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
Output :
![](https://dosenit.com/wp-content/uploads/2020/11/input.jpg)
Perhatikan di awal skrip, kita memeriksa apakah formulir telah dikirimkan menggunakan $_SERVER [“REQUEST_METHOD”]. Jika REQUEST_METHOD adalah POST, maka formulir telah dikirim – dan harus divalidasi. Jika belum dikirimkan, lewati validasi dan tampilkan formulir kosong.
Namun, pada contoh di atas, semua kolom input bersifat opsional. Skrip berfungsi dengan baik meskipun pengguna tidak memasukkan data apa pun.