PEMROGRAMAN WEB PHP FORMS 09 MEI 2016 MUHMMAD NAWAWI / nawawi@it.student.pens.ac.id
PHP FORM HANDLING PHP superglobal $_GET dan $_POST digunakan untuk mengumpulkan data dari form PHP A SIMPLE HTML FORM Dibawah ini merupakan contoh tampilan dari form HTML sederhana dengan dua inputan dan tombol submit : <html> <body> <form action="welcome.php" method="post"> Name: <input type="text" name="name"><br> E-mail: <input type="text" name="email"><br> <input type="submit"> </form> </body> </html> Ketika user mengisi form diatas dan menekan tombol submit, makan data dari form di kirimkan pada sebuah proses menuju sebuah file php bernama welcome.php. Form data yang dikirimkan menggunakan method HTTP POST. Untuk menampilkan data yang telah dikirimkan sebelumnya gunakan echo pada semua variables. Pada welcome.php: menampilkan seperti dibawah ini : <html> <body> Welcome <?php echo $_POST["name"];?><br> Your email address is: <?php echo $_POST["email"];?>
</body> </html> Maka tampilan outputnya akan menjadi seperti ini : Welcome John Your email address is john.doe@example.com Hasil yang sama akan ditampilkan jika menggunakan method HTTP GET : Contoh : <html> <body> <form action="welcome_get.php" method="get"> Name: <input type="text" name="name"><br> E-mail: <input type="text" name="email"><br> <input type="submit"> </form> </body> </html>
Dan welcome.php akan memiliki tampilan seperti berikut : <html> <body> Welcome <?php echo $_GET["name"];?><br> Your email address is: <?php echo $_GET["email"];?> </body> </html> Code diatas sangan mudah. Namun, hampir keseluruhan bagian terpenting hilang. Anda perlu menggunakan validasi form untuk melindungi skrip dari code yang berbahaya. GET VS POST Keduanya GET dan POST membuat sebuah array(e.g. array( key => value, key2 => value2, key3 => value3,...)). Array ini memegang key/nilai yang disamakan, dimana key adalah nama yang berada pada form kontrol dan nilai yang di inputkan user. Kedua GET dan POST diperlakukan sebagai $_GET dan $_POST. Ini adalah sangat umum, yang berarti mereka selalu dapat diakses, terlepas dari ruang lingkup dan ana dapat mengaksesnya dengan berbagai fungsi,kelas atau file tanpa mempunyai sesuatu yang spesial. $_GET adalah sebuah array yang variablenya di lewatkan pada parameter URL $_POST adalah sebuah variablee yang di lewatkan pada sebuah skrip melalui method HTTP POST. KAPAN MENGGUNAKAN GET? Informasi yang dikirim dari sebuah form menggunakan method get adalah dapat dilihat oleh siapapun(semua nama variable dan nilai dapat dilihat pada URL). GET juga memiliki limit pada jumlah informasi yang akan di kirimkan. Batasnya adalah 2000 karakters. Namun, karena dapat dilihat dan ditampilkan pada URL, masih di mungkinkan untuk di bookmark pada sebuah halaman. Hal itu dapat di contoh pada beberapa kasus. GET dapat digunakan untuk mengirimkan data yang tidak sensitif. KAPAN MENGGUNAKAN POST?
Informasi yang dikirimkan pada method POST bersifat tak terlihat pada hal lain(semua variable/nilai menempel dengan badan pada HTTP request) dan memiliki tanpa batas jumlah yang akan dikirimkan. Selain itu,post mendukung fungsi terdepan yang mendukung untuk multi-bagian binary input ketika mengunggah file pada server. Namun, karena variablenya tidak ditampilkan pada URL, itu hal yang sulit untuk memberikan bookmark pada halaman tersebut.
PHP 5 Form Validation PHP Form Validation Pikirkan keamanan saat memproses PHP form! Laman ini akan menunjukkan bagaimana cara memproses php form dengan aman. Validasi yang benar dari form data itu penting untuk melindungi form dari hacker dan spammer! HTML form yang akan dikerjakan pada bab ini, mengandung berbagai macam input fields: text field required dan optional, radio button, dan sebuah submit button: Aturan validasi untuk form diatas adalah : Fields Name E-mail Website Comment Gender Aturan Validasi Required. + Harus terdiri hanya atas huruf dan whitespace Required. + Harus terdiri atas alamat email yang valid (dengan @ dan.) Optional. Jika diisi harus mengandung URL valid Optional. Multi-line input field (textarea) Required. Harus memilih salah satu pertama lihat HTML code untuk form: Text Fields Name, email, dan website field adalah element text input, dan comment field adalah textarea. HTML code akan tampak 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>
Radio Buttons Gender field adalah radio button dan kode HTML nya tampak seperti ini: Gender: <input type="radio" name="gender" value="female">female <input type="radio" name="gender" value="male">male The Form Element HTML code dari form nya tampak seperti ini: <form method="post" action="<?php echo htmlspecialchars($_server["php_self"]);?>"> ketika form disubmit, data form akan dikirim dengan method="post". Catatan Apa itu variabel $_SERVER["PHP_SELF"]? $_SERVER["PHP_SELF"] adalah sebuah super global variabel yang mereturn nama file dari script yang sedang dijalankan. Jadi, the $_SERVER["PHP_SELF"] mengirimkan data form ke halaman itu sendiri, daripad lompat ke halaman yang lain. Dengan cara ini, user akan mendapat pesan error di halaman yang sama dengan form. Catatan Apa itu fungsi htmlspecialchars()? fungsi htmlspecialchars() mengubah special karakter menjadi entiti HTML. ini maksudnya akan mengganti karakter HTML seperti < dan > dengan < dan >. Ini mencegah penyerang untuk mengeksplotitasi kode dengan menginject HTML atau kode javascript (serangan cross-site scripting) dalam form. Big Note on PHP Form Security Variabel $_SERVER["PHP_SELF"] dapat digunakan oleh hacker. Jika PHP_SELF digunakan dalam halaman jadi user dapat memasukkan slash (/) dan kemudian beberapa pertintah Cross site Scripting (XSS) untuk dijalankan. Catatan Cross-site Scripting (XSS) adalah sebuah tipe dari kelemahan keamanan komputer yang umumnya ditemukan di applikasi web. XSS menyebabkan penyerang menginject client-side script ke halaman web yang dilihat user lain.
Diasumsikan terdapat form pada halman bernama "tes_form.php": <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>"> Sekarang, jika user memasukkan URL normal di address bar seperti "http://www.example.com/test_form.php", code diatas akan diterjemahkan ke: <form method="post" action="test_form.php"> Sejauh ini masih bagus. Akan tetapi, mempertimbangkan user yang memasukkan URL seperti ini di address bar: http://www.example.com/test_form.php/%22%3e%3cscript%3ealert('hacked')%3c/script%3e dalam kasus tersebut, code diatas akan diterjemahkan ke: <form method="post" action="test_form.php/"><script>alert('hacked')</script> Code ini menambahkan script tag dan sebuah perintah alert. Dan ketika halaman dimuat, Javascript code akan dieksekusi (User akan melihat sebuah alert box). Ini hanya contoh sederhana dan tidak berbahaya dari bagaimana variabel PHP_SELF dapat dieksploitasi. Mawas lah akan semua javascript code yang dapat ditambahkan dalam <script> tag! Seorang hacker dapat meredirect user menuju suatu file di server lain, dan file tersebut dapat menyimpan kode berbahaya yang dapat mengubah global variabel atau mengirim form ke alamat lain untuk menyimpan data userm, sebagai contohnya. How To Avoid $_SERVER["PHP_SELF"] Exploits? Eksploitasi $_SERVER["PHP_SELF"] dapat dihindari dengan menggunakan fungsi htmlspecialchars(). kode form akan terlihat seperti ini: <form method="post" action="<?php echo htmlspecialchars($_server["php_self"]);?>"> fungsi htmlspecialchars() mengubah karakter spesial menjadi entiti html. sekarang jika user mencoba mengeksploitasi variabel PHP_SELF, akan menunjukkan hasil output: <form method="post" action="test_form.php/"><script>alert('hacked')</script>"> Percobaan eksploitasi gagal, dan tidak ada bahaya. Validate Form Data With PHP Hal pertama yang harus dilakukan adalah melewatkan semua variabel melalui fungsi htmlspecialchars().
Ketika menggunakan fungsi htmlspecialchars; maka jika user mencoba untuk submit kode berikut ke text field: <script>location.href('http://www.hacked.com')</script> Maka akan tidak dieksekusi, karena itu akan disimpan sebagai HTML escaped code, seperti ini: <script>location.href('http://www.hacked.com')</script> Code sekarang aman untuk ditampilkan di halaman atau didalam e-mail. Akan dilakukan dua langkah lagi ketika user submit form: Menghilangkan karakter tidak penting (spasi ekstra, tab, newline) dari data inputan user (dengan fungsi PHP trim()) Hilangkan backslash(\) dari inputan user (dengan fugnsi PHP stripslashes()) Langkah selanjutnya untuk membuat fungsi yang akan melakukan checking (yang lebih mudah daripada menulis ulang code yang sma berulang ulang)> Beri nama fungsi test_input(). Sekarang, dapat diperiksa tiap variabel $_POST dengan fungsi test_input(), dan scriptnya tampak 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 pada awal dari script, disitu diperiksa apakah form telah disbmit emggunakan $_SERVER["REQUEST_METHOD"]. jika REQUEST)_METHOD adalah POST, maka form akan disubmit dan akan divalidasi. jika belum disubmit, lewati validasi dan tampilkan form blank. Akan tetapi pada contoh diatas, semua input fields adalah optional. Script akan berjalan dengan baik meskipun user tidak memasukkan data apapun. Langkah selanjutnya adalah untuk membuat input field yang dan buat pesan error jika dibutuhkan.
PHP 5 Forms - Required Fields Bab ini menunjukkan bagaimana membuat field input yang dibutuhkan dan membuat pesan kesalahan jika diperlukan. PHP - Required Fields Dari tabel aturan validasi pada halaman sebelumnya, kita melihat bahwa "Nama", "E -mail, dan "Gender" adalah bidang yang diperlukan. Bidang ini tidak boleh kosong dan harus diisi dalam bentuk HTML. Bidang Name Aturan Validasi Wajib. + Harus hanya berisi huruf dan spasi E-mail Wajib. + Harus berisi alamat email yang valid ( dengan @ dan. ) Website Pilihan. Jika ada, itu harus berisi URL yang valid Comment Pilihan. bidang input multi -line ( textarea ) Gender Wajib. Harus pilih salah satu Pada bab sebelumnya, semua field input bersifat opsional. Dalam kode berikut kami telah menambahkan beberapa variabel baru: $nameerr, $emailerr, $gendererr, dan $websiteerr. Variabel error ini akan terus menampung pesan kesalahan untuk bidang yang diperlukan. Kami juga telah menambahkan jika pernyataan lain untuk setiap $_POST variabel. Ini memeriksa jika variabel $_ POST kosong ( fungsi empty() PHP ). Jika kosong, pesan kesalahan disimpan dalam variabel kesalahan yang berbeda, dan jika itu tidak kosong, akan mengirimkan data input pengguna melalui fungsi test_input(): <?php // define variables and set to empty values $nameerr = $emailerr = $gendererr = $websiteerr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_post["name"])) { $nameerr = "Name is required"; else { $name = test_input($_post["name"]);
if (empty($_post["email"])) { $emailerr = "Email is required"; else { $email = test_input($_post["email"]); if (empty($_post["website"])) { $website = ""; else { $website = test_input($_post["website"]); if (empty($_post["comment"])) { $comment = ""; else { $comment = test_input($_post["comment"]); if (empty($_post["gender"])) { $gendererr = "Gender is required"; else { $gender = test_input($_post["gender"]);?>
PHP - Display The Error Messages Kemudian dalam bentuk HTML, kita menambahkan sedikit script setelah masing-masing bidang yang diperlukan, yang menghasilkan pesan kesalahan yang sesuai jika diperlukan (yaitu jika pengguna mencoba untuk mengirimkan formulir tanpa mengisi formulir yang diperlukan): Contoh: <form method="post" action="<?php echo htmlspecialchars($_server["php_self"]);?>"> Name: <input type="text" name="name"> <span class="error">* <?php echo $nameerr;?></span> <br><br> E-mail: <input type="text" name="email"> <span class="error">* <?php echo $emailerr;?></span> <br><br> Website: <input type="text" name="website"> <span class="error"><?php echo $websiteerr;?></span> <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 <span class="error">* <?php echo $gendererr;?></span> <br><br> <input type="submit" name="submit" value="submit"> </form>
Langkah berikutnya adalah untuk memvalidasi data input, yang "Apakah bidang Nama hanya berisi huruf dan spasi?", Dan "Apakah bidang E -mail berisi sintaks alamat e - mail yang valid?", Dan jika diisi seluruhnya, "Apakah field website berisi URL yang valid?".
PHP - Validasi E-mail & URL PHP - Validasi Nama Kode berikut menunjukkan cara mudah untuk mengecek jika field nama hanya mengandung huruf dan spasi. Jika nilai dari field nama tidak valid, maka menyimpan pesan kesalahan: $name = test_input($_post["name"]); if (!preg_match("/^[a-za-z ]*$/",$name)) { $nameerr = "Only letters and white space allowed"; // Fungsi preg_match() mencari pola pada string, mengembalikan true jika pola ada, dan false jika tidak. PHP - Validasi E-mail Cara termudah dan aman untuk mengecek apakah alamat email sesuai kaidah dengan menggunakan fungsi filter_var(). Pada kode berikut, jika alamat email tidak sesuai kaidah, maka menyimpan pesan kesalahan: $email = test_input($_post["email"]); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $emailerr = "Invalid email format"; PHP - Validasi URL Kode berikut mengecek apakah alamat URL valid (regular expression berikut memperbolehkan '-' pada URL). Jika alamat URL tidak valid, maka menyimpan pesan kesalahan: $website = test_input($_post["website"]); if (!preg_match("/\b(?:(?:https? ftp):\/\/ www\.)[-a-z0-9+&@#\/%?=~_!:,.;]*[-a-z0-9+&@#\/%=~_ ]/i",$website)) { $websiteerr = "Invalid URL"; PHP - Validasi Nama, E-mail, dan URL Kodenya akan terlihat seperti ini: Contoh <?php // define variables and set to empty values
$nameerr = $emailerr = $gendererr = $websiteerr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_post["name"])) { $nameerr = "Name is required"; else { $name = test_input($_post["name"]); // check if name only contains letters and whitespace if (!preg_match("/^[a-za-z ]*$/",$name)) { $nameerr = "Only letters and white space allowed"; if (empty($_post["email"])) { $emailerr = "Email is required"; else { $email = test_input($_post["email"]); // check if e-mail address is well-formed if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $emailerr = "Invalid email format"; if (empty($_post["website"])) { $website = ""; else { $website = test_input($_post["website"]); // check if URL address syntax is valid (this regular expression also allows dashes in the URL) if (!preg_match("/\b(?:(?:https? ftp):\/\/ www\.)[-a-z0-9+&@#\/%?=~_!:,.;] *[-a-z0-9+&@#\/%=~_ ]/i", $website)) { $websiteerr = "Invalid URL"; if (empty($_post["comment"])) { $comment = ""; else { $comment = test_input($_post["comment"]); if (empty($_post["gender"])) {
$gendererr = "Gender is required"; else { $gender = test_input($_post["gender"]);?>
PHP - Menyimpan Nilai dalam Form PHP - Complete Form Untuk menampilkan nilai-nilai dalam field input setelah pengguna menekan tombol submit, kita tambahkan script PHP kecil di dalam atribut nilai field input berikut: nama, email, dan website. Di bidang komentar textarea, kami menempatkan script antara <textarea> dan </ textarea> tag. Script kecil output nilai dari nama $, $ email, $ website, dan variabel komentar $. Kemudian, kami juga harus menunjukkan yang tombol radio yang diperiksa. Untuk ini, kita harus memanipulasi atribut diperiksa (tidak atribut nilai untuk tombol radio): Nama: <input type = "text" name = "nama" value = "? <? Php echo $ nama;>"> E-mail: <input type = "text" name = "email" value = "? <? Php echo $ email;>"> Website: <input type = "text" name = "situs" value = "<? Php echo $ situs;>?"> Komentar: <textarea name = "comment" rows = "5" cols = "40"> <? Php echo $ komentar;> </ textarea> Jenis kelamin: <Input type = "radio" name = "gender" <? Php if (isset ($ gender) && $ jender == "perempuan") echo "diperiksa";?> value = "perempuan"> Perempuan <Input type = "radio" name = "gender" <? Php if (isset ($ gender) && $ jender == "laki-laki") echo "diperiksa";?> value = "laki-laki"> Pria
example: