Validasi dan Sanitasi Form dengan PHP

Salah satu fitur PHP yang paling penting adalah kemampuannya untuk mengolah form HTML. Form adalah halaman yang hampir dapat dijumpai pada setiap website, contohnya adalah form untuk login, form pendaftaran, form kontak, dll. Mengolah form HTML dengan PHP sangat mudah, dan karena kemudahannya inilah banyak programer yang membuat form secara sembarangan.

Validasi dan sanitasi data adalah 2 hal yang tidak bisa dilepaskan ketika bekerja dengan form. Data yang tidak valid dan tidak bersih, tidak hanya akan menghasilkan informasi yang salah tetapi juga akan menimbulkan masalah keamanan. Artikel ini akan membahas proses pembuatan form dari yang sederhana sampai yang cukup kompleks dengan validasi dan sanitasi data. Hasil akhir diharapkan mampu meminimalkan kesalahan dan masalah kemananan pada form.

Contoh 1. Pengolahan form paling sederhana dengan PHP
nama file: test.html

<form name="form_test" method="post" action="test.php">
  <p><label for="email">Email </label><input name="email" type="text"/></p>
  <p><label for="website">Website </label><input name="website" type="text" /></p>
  <p><input type="submit" name="submit" value="kirim"></p>
</form>

nama file: test.php

<?php
echo 'Email: ' . $_POST['email'] . '<br />';
echo 'Website: ' . $_POST['website'];

Pada contoh di atas, tidak ada kode yang memvalidasi dan menyanitasi masukan dari pengguna. Akibatnya apapun data yang dimasukan oleh pengguna akan langsung diproses oleh PHP. Hal ini tidak boleh terjadi. Salah satu masalah yang mungkin terjadi adalah ketika pengguna tidak memasukan data sesuai format dengan benar (baik email maupun website). Sebenarnya HTML5 dapat sedikit membantu tugas para programer, yaitu dengan mengganti nilai type menjadi “email” dan “url“.

Contoh 2. HTML5 form
nama file: test.html

<form name="form_test" method="post" action="test.php">
  <p><label for="email">Email </label><input name="email" type="email"/></p>
  <p><label for="website">Website </label><input name="website" type="url" /></p>
  <p><input type="submit" name="submit" value="kirim"></p>
</form>

Dengan kode di atas, sekarang akan muncul tooltips ketika pengguna salah memasukan email atau website. Sebagai catatan, belum semua browser mendukung fitur ini, jadi validasi dan sanitasi pada server side (kode PHP) mutlak diperlukan.

Memeriksa validitas dan membersihkan data dari karakter-karakter yang tidak diinginkan adalah pekerjaan yang tidak mudah. Untungnya, mulai versi 5.2, PHP mempunyai function yang disebut filter_var yang akan membuat pekerjaan programer menjadi jauh lebih mudah. Function filter_var dapat melakukan kedua hal tersebut, baik validasi maupun sanitasi data. Sebenarnya apakah perbedaan di antara keduanya?

  1. Validasi: menentukan apakah sebuah data memiliki format yang valid.
  2. Sanitasi: menghilangkan karakter-karakter yang tidak diinginkan pada sebuah data.

Mengapa harus keduanya? Karena ada kemungkinan pengguna, baik sengaja maupun tidak sengaja memasukan karakter yang bisa berakibat buruk pada aplikasi. Berikut ini adalah contoh penggunaan filter_var.

<?php
$string = "<h1>Hello, World!</h1>";
$string = filter_var($string, FILTER_SANITIZE_STRING);
echo 'variabel $string bernilai "' . $string . '"';

Tampak pada contoh kode di atas, filter_var akan menghilangkan semua tag HTML pada suatu string. Sekarang ubah file “test.php” di atas untuk memvalidasi dan menyanitasi masukan email dan website.

Contoh 3. PHP filter_var
nama file: test.php

<?php
if (!empty($_POST['email'])) {  
  $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);  
  if (filter_var($email, FILTER_VALIDATE_EMAIL)) {  
    echo "Email $email valid.<br/>";  
  } else {  
    echo "Email $email tidak valid.<br/>";  
  }  
} else {
  echo "Email harus diisi.<br/>";
}

if (!empty($_POST['website'])) {  
  $website = filter_var($_POST['website'], FILTER_SANITIZE_URL);  
  if (filter_var($website, FILTER_VALIDATE_URL)) {  
    echo "Website $website valid.";  
  } else {  
    echo "Website $website tidak valid.";  
  }  
} else {
  echo "Website harus diisi";
}

Sebagai catatan, alamat website yang valid itu harus mengandung “http://“. Kode !empty($_POST['email']) adalah untuk memeriksa apakah pengguna memasukan data atau tidak.

Selain dengan filter_var, masih ada cara lain yang bisa digunakan, terutama jika server belum mendukung function ini, yaitu dengan htmlspecialchars. Function htmlspecialchars akan mengkonversi 5 karakter khusus menjadi representasinya dalam bentuk kode. Kelima karakter tersebut beserta representasinya adalah sebagai berikut.

  • &‘ (ampersand) dikonversi menjadi ‘&amp;‘.
  • "‘ (double quote) dikonversi menjadi ‘&quot;‘.
  • '‘ (single quote) dikonversi menjadi ‘&#039;‘.
  • <' (less than) dikonversi menjadi '&lt;'
  • '>' (greater than) dikonversi menjadi '&gt;'

Contoh penggunaannya adalah sebagai berikut.

<?php
$string = htmlspecialchars("<a href='test'>Test string</a>", ENT_QUOTES);
echo $string; // &lt;a href=&#039;test&#039;&gt;Test string&lt;/a&gt;

Jalankan kode di atas, lalu view source hasilnya. Hasil view source akan sama seperti yang ada pada baris komentar di atas. Pada function htmlspecialchars di atas, terdapat argumen ENT_QUOTES yang berarti akan mengkonversi ''' (single quote) dan '"' (double quote). Jika argumennya ENT_NOQUOTES, kedua quote tidak akan dikonversi.

sql injection

Akhirnya, jika bekerja dengan database, dibutuhkan suatu function yang akan melindungi database dari serangan SQL Injection. Function mysql_real_escape_string akan membersihkan semua data yang akan dimasukan ke dalam database.

<?php
$email = mysql_real_escape_string($email);
$website = mysql_real_escape_string($website);
$query = 'UPDATE nama_tabel SET website = ' . $website . ' WHERE email = ' . $email;  
mysql_query($query);  

About Sibudi

Ubuntu user | Loves books | Blogger | Web Developer | Learn PHP, JavaScript, Ruby & Python the hard way

24. April 2012 by Sibudi
Categories: PHP | Tags: , , , , | 3 comments

Comments (3)

  1. mas gimana ya caranya membuat url yang tidak valit secara otomatis masuk ke form pencarian. misalnya ada link seperti ini: http://domaincontoh.com/12345 dan ternyata url tersebut tidak valit, maka saya ingin secara otomatis “12345” tersebut masuk di form pencarian dan langsung menampilkan hasilnya. nah yang semacam itu php nya gimana ya mas?

Leave a Reply

Required fields are marked *