Pada bab ini kami akan memperkenalkan cara menggunakan PHP untuk memverifikasi data formulir yang dikirimkan oleh klien.
Kita perlu mempertimbangkan keamanan ketika berhadapan dengan formulir PHP. Dalam bab ini kami akan mendemonstrasikan pemrosesan data formulir PHP yang aman Untuk mencegah peretas dan spam, kita perlu melakukan verifikasi keamanan data pada formulir. |
Formulir HTML yang dijelaskan dalam bab ini berisi kolom masukan berikut: Bidang teks wajib dan opsional, tombol radio, dan tombol kirim:
Aturan validasi formulir di atas adalah sebagai berikut:
Bidang | Aturan validasi |
---|---|
nama | harus. +hanya boleh berisi huruf dan spasi |
harus. + harus berupa alamat email yang valid (berisi '@' dan '.') | |
URL | Opsional. Jika ada, itu harus berisi URL yang valid |
Komentar | Opsional. Bidang masukan multi-baris (bidang teks) |
jenis kelamin | harus. Harus memilih satu |
Pertama mari kita lihat kode form HTML murni:
Bidang "Nama", "Email", dan "Situs Web" adalah elemen input teks, dan bidang "Keterangan" adalah area teks. Kode HTMLnya terlihat seperti ini:
"Nama": <input type="text" name="name">Email: <input type="text" name="email">Situs web: <input type="text" name="website">Keterangan : <textarea nama="komentar" row="5" cols="40"></textarea>
Bidang "Jenis Kelamin" adalah tombol radio dan kode HTMLnya terlihat seperti ini:
Jenis Kelamin:<input type="radio" name="gender" value="female">Wanita<input type="radio" name="gender" value="male">Pria
Kode formulir HTML terlihat seperti ini:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Formulirnya menggunakan metode method="post" untuk mengirimkan data.
Apa yang dimaksud dengan variabel $_SERVER["PHP_SELF"]? $_SERVER["PHP_SELF"] adalah variabel super global yang mengembalikan nama file dari skrip yang sedang dijalankan dan terkait dengan root dokumen. |
Oleh karena itu, $_SERVER["PHP_SELF"] akan mengirimkan data formulir ke halaman saat ini alih-alih melompat ke halaman lain.
Apa yang dimaksud dengan metode htmlspecialchars()? Fungsi htmlspecialchars() mengubah beberapa karakter yang telah ditentukan sebelumnya menjadi entitas HTML. Karakter yang telah ditentukan sebelumnya adalah: & (ampersand) menjadi & " (kutipan ganda) menjadi " ' (kutipan tunggal) menjadi ' < (kurang dari) menjadi < > (lebih besar dari) menjadi> |
Variabel $_SERVER["PHP_SELF"] dapat digunakan oleh peretas!
Ketika peretas menggunakan tautan HTTP skrip lintas situs untuk menyerang, variabel server $_SERVER["PHP_SELF"] juga akan tertanam dalam skrip. Alasannya adalah skrip lintas situs ditambahkan ke jalur file yang dapat dieksekusi, sehingga string $_SERVER["PHP_SELF"] akan berisi kode program JavaScript di belakang tautan HTTP.
XSS juga disebut CSS (Cross-Site Script), serangan skrip lintas situs. Penyerang jahat memasukkan kode HTML berbahaya ke dalam halaman Web ketika pengguna menelusuri halaman tersebut, kode HTML yang tertanam di halaman Web akan dieksekusi, sehingga mencapai tujuan khusus dari pengguna jahat. |
Tentukan nama file formulir berikut "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Sekarang, kita menggunakan URL untuk menentukan alamat pengiriman "test_form.php", dan kode di atas diubah sebagai berikut:
<metode formulir="post" action="test_form.php">
Itu akan baik-baik saja.
Namun, pertimbangkan bahwa pengguna akan memasukkan alamat berikut ke bilah alamat browser:
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('diretas')%3C/script%3E
URL di atas akan diuraikan menjadi kode berikut dan dieksekusi:
<form method="post" action="test_form.php/"><script>peringatan('diretas')</script>
Tag skrip telah ditambahkan ke kode, dan perintah peringatan telah ditambahkan. Kode Javascript ini akan dieksekusi ketika halaman dimuat (pengguna akan melihat kotak pop-up). Ini hanyalah contoh sederhana bagaimana variabel PHP_SELF dapat dieksploitasi oleh hacker.
Harap perhatikan bahwa kode JavaScript apa pun dapat ditambahkan dalam tag <script>! Peretas dapat menggunakan ini untuk mengarahkan halaman ke halaman di server lain. File kode halaman dapat melindungi kode berbahaya. Kode tersebut dapat mengubah variabel global atau memperoleh data formulir pengguna.
$_SERVER["PHP_SELF"] dapat dihindari dengan menggunakan fungsi htmlspecialchars().
Kode formulir terlihat seperti ini:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() mengubah beberapa karakter yang telah ditentukan sebelumnya menjadi entitas HTML. Nah jika user ingin memanfaatkan variabel PHP_SELF maka akan dihasilkan output sebagai berikut:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Upaya untuk mengeksploitasi eksploitasi ini gagal!
Pertama, kami memproses semua data yang dikirimkan oleh pengguna melalui fungsi htmlspecialchars() PHP.
Saat kami menggunakan fungsi htmlspecialchars(), pengguna mencoba mengirimkan kolom teks berikut:
<skrip>lokasi.href('http://www.codercto.com')</skrip>
Kode ini tidak akan dieksekusi karena akan disimpan sebagai kode lolos HTML seperti ini:
<script>location.href('http://www.codercto.com')</script>
Kode di atas aman dan dapat ditampilkan secara normal di halaman atau dimasukkan ke dalam email.
Saat pengguna mengirimkan formulir, kami akan melakukan dua hal berikut:
Gunakan fungsi PHP trim() untuk menghapus karakter yang tidak perlu (seperti spasi, tab, baris baru) pada data input pengguna.
Gunakan fungsi PHP striplashes() untuk menghilangkan garis miring terbalik () dari data input pengguna
Selanjutnya, mari kita tulis fungsi pemfilteran ini dalam fungsi yang kita definisikan sendiri, yang dapat sangat meningkatkan penggunaan kembali kode.
Beri nama fungsi test_input().
Sekarang, kita dapat menggunakan fungsi test_input() untuk mendeteksi semua variabel di $_POST. Kode scriptnya adalah sebagai berikut:
<?php//Tentukan variabel dan setel ke nilai kosong secara default $name= $email= $gender= $comment= $website= ""; if($_SERVER["REQUEST_METHOD"]== "POST") { $nama= tes_input($_POST["nama"]); $email= tes_input($_POST["email"]); test_input($_POST["situs web"]); $komentar= test_input($_POST["komentar"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= potong ($data); $data= garis miring($data); $data= htmlkarakter khusus($data);}?>
Perhatikan bahwa ketika kita menjalankan skrip di atas, kita akan menggunakan $_SERVER["REQUEST_METHOD"] untuk mendeteksi apakah formulir telah dikirimkan. Jika REQUEST_METHOD adalah POST, formulir akan dikirimkan - dan data akan divalidasi. Jika formulir tidak diserahkan, validasi akan dilewati dan ditampilkan kosong.
Penggunaan item input pada contoh di atas bersifat opsional dan dapat ditampilkan secara normal meskipun pengguna tidak memasukkan data apa pun.
Pada bab berikutnya kami akan memperkenalkan cara memvalidasi data yang dimasukkan oleh pengguna.