Tag: Security

  • Memanipulasi URL pada Status Bar Browser

    Mungkin teknik ini hanya digunakan oleh para penjahat dunia maya. Orang yang merasa perlu untuk menyembunyikan apa yang seharusnya bebas diketahui publik. Penting bagi kita untuk mengetahui teknik yang digunakan oleh para penjahat untuk melindungi diri bukan untuk sebaliknya. Biasanya ini digunakan untuk menyembunyikan/memanipulasi link referal atau sebagai langkah awal kejahatan phishing.

    Ketika kita menyorotkan mouse pada sebuah tautan (link), misalnya ini, maka akan muncul URL dari tautan tersebut pada status bar. Biasanya terletak pada pojok kiri bawah sebuah browser.

    Sebuah tautan yang benar adalah menggunakan tag HTML <a> dengan atribut href dan title. Atribut href wajib ada karena dibutuhkan sebagai tujuan sebuah tautan dan memunculkan URL pada status bar, sedangkan title opsional.

    <a href="http://sibudi.net" title="Websiteku">klik di sini</a>
    

    Berikut ini adalah 3 teknik yang digunakan untuk menyembunyikan atau memanipulasi tautan.

    Cara pertama

    <a style="cursor:pointer" onClick="location.href='http://sibudi.net'" >klik di sini</a>
    

    Pada kode di atas, atribut href sengaja tidak ditulis. Dalam keadaan normal hal tersebut tidak berbahaya, hanya akan menampilkan tulisan “klik di sini” pada browser dan tidak bisa diklik. Namun dengan tambahan sedikit kode JavaScript di atas, tautan di atas akan mengarah pada “http://sibudi.net” tanpa dapat dilihat tujuannya oleh pengguna awam.

    Untuk lebih meyakinkan dapat ditambahkan inline css cursor:pointer yang akan mengubah pointer menjadi gambar tangan. Bisa juga ditambahkan text-decoration:underline dan color sesuai dengan warna yang digunakan pada browser.

    Cara kedua (hanya bekerja pada browser IE):

    <a href="http://sibudi.net" onMouseOver="window.status='http://www.google.com'; return true" onMouseOut="window.status=''">klik di sini</a>
    

    Tautan di atas tidak lagi hanya menyembunyikan URL tapi memanipulasi URL. Jadi pada status bar tertulis “http://google.com” padahal jika diklik akan menuju ke “http://sibudi.net”. Namun teknik itu tidak akan bekerja pada browser selain IE.

    Cara ketiga

    <script>
    function redirect(URL) {
    
      document.location = URL;
      return false;
    }
    </script>
    
    <a href="http://google.com" onClick="return redirect('http://sibudi.net');">klik di sini</a>
    

    Teknik ketiga adalah gabungan dari 2 teknik sebelumnya, yaitu menggunakan atribut href dan onClick. Seperti yang kita tau, atribut href akan memunculkan URL pada status bar. Ketika tautan di atas diklik, maka akan membangkitkan event onClick dan memanggil fungsi JavaScript redirect.

    Perlu dicatat bahwa ketiga teknik di atas sangat bergantung pada JavaScript. Jadi tidak akan bekerja pada browser yang di-disable Javascript-nya. Tautan akan tetap mengarah sesuai pada atribut href dan hanya berupa teks biasa jika atribut href tidak ada. Untuk menangani masalah JavaScript ini, bisa mengacu pada tulisan menangani browser dengan JavaScript disable.

  • Mengeblok Flash dari Browser

    Akhir-akhir ini semakin banyak website yang tidak beretika, menjejali pengunjungnya dengan iklan-iklan besar yang menutup hampir keseluruhan layar. Iklan yang muncul tiba-tiba dan menutup sebagian layar tidak hanya memakan bandwidth tetapi juga sangat mengganggu. Banyak sekali iklan bertebaran di situs-situs besar, baik yang berbentuk teks maupun gambar. Tapi di antara iklan yang paling menyebalkan tentunya adalah iklan berbentuk animasi Flash. Tidak hanya menampilkan gambar bergerak, terkadang iklan tersebut juga mengeluarkan suara yang mengagetkan.

    Browser adalah pintu gerbang menuju dunia maya, maka sudah sewajarnya kita melindunginya dari hal-hal yang tidak diinginkan. Untuk mengatasi masalah yang cukup mengganggu ini, kita dapat memasang plugin flashblock pada browser. Khusus untuk Google Chrome ada sebuah pilihan yang dapat diaktifkan untuk mengeblok script-script yang tidak bisa dijalankan secara alami oleh browser, atau dengan kata lain script yang berjalan menggunakan plugin seperti Flash. Cara mengaktifkannya adalah dengan menuju ke menu settings -> Under The Hood -> klik pada tombol Content Settings pada bagian Privacy -> cari pada bagian Plug-ins -> lalu pilih Click to play.

    click to play flash

    Dengan pilihan ini, pengguna diharuskan mengeklik tulisan “click to run the Flash plug-in” pada browser ketika sebuah animasi Flash muncul. Tentunya kita hanya mengeklik pada media yang dipercaya dan tau isinya tidak akan membuang-buang waktu atau bandwidth, misalnya pada saat menonton video di Youtube. Kini kita bisa berselancar, membaca informasi di dunia maya dengan nyaman dan aman tanpa gangguan animasi Flash. Mungkin pada versi Firefox berikutnya pilihan ini juga akan disertakan. Di bawah ini adalah tampilan pada saat dijumpai animasi/video Flash pada browser.

    click to play flash plugin

  • 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);  
    
  • Membuat Tombol “Back”

    Pada umumnya browser sudah memiliki tombol “back” yang berfungsi untuk kembali ke halaman sebelumnya. Seorang web developer harus mempunyai alasan yang bagus untuk memasangnya pada website, misal karena adanya permintaan khusus dari klien. Namun, artikel ini ditulis bukan demi klien, melainkan demi ilmu pengetahuan 🙂

    Ada 2 cara yang bisa dipakai, yaitu dengan JavaScript dan PHP. Untuk mencoba kode-kode di bawah ini, dibutuhkan sebuah halaman lain yang berisi link menuju ke halaman yang berisi tombol “back” ini.

    <input type="button" value="Go Back" onclick="history.back(-1)" />
    

    Tentunya implementasi menggunakan JavaScript masih kurang, karena ada kemungkinan user mematikan JavaScript di browser-nya. Berikut ini adalah implementasi dengan PHP.

    <?php
      $url = htmlspecialchars($_SERVER['HTTP_REFERER']);
    ?>
      <a href="<?=$url?>">Go Back</a>
    

    Pada snippet di atas digunakan fungsi PHP htmlspecialchars untuk mensanitasi input dari client. Meskipun secara fisik tidak ada input yang bisa disusupi oleh user, namun harus tetap berpegang pada prinsip dasar pengembangan website, yaitu jangan pernah percaya apa yang dikirimkan oleh client.

    Jika kode PHP di atas langsung dieksekusi tanpa melalui halaman lain, maka akan muncul pesan peringatan:

    Notice: Undefined index: HTTP_REFERER in /var/www/index.php on line 2

    Itu adalah pesan peringatan karena ada yang salah pada kode PHP. Untuk memperbaiki kesalahan itu bisa dipelajari di sini.

    <?php
      $url = isset($_SERVER['HTTP_REFERER']) ? htmlspecialchars($_SERVER['HTTP_REFERER']) : '';
    ?>
      <a href="<?=$url?>">Go Back PHP</a>
    

    Dalam artikel singkat ini selain dipelajari cara membuat tombol “back” namun juga pentingnya menulis kode yang baik dan berkualitas. Kode yang baik dan berkualitas akan membuat website yang dibuat menjadi lebih aman. Mulailah menulis kode yang berkualitas dari kasus yang paling sederhana.

  • Validasi File Upload di PHP

    Validasi file upload sangat penting dilakukan karena adanya fitur mengunggah file ke web server adalah kegiatan yang cukup berbahaya. Ambil contoh pada sebuah web yang mengijinkan user untuk meng-upload foto/gambar bisa jadi dijadikan celah bagi para hacker untuk meletakan script berbahaya pada server.

    Berbekal beberapa baris kode PHP kita sudah bisa membuat file upload sederhana. Namun hanya mengandalkan script sederhana tersebut tidak cukup untuk membuat file upload yang bisa diandalkan.

    Untuk meminimalkan celah pada fitur file upload, dapat dilakukan dengan cara memverifikasi jenis file yang diupload. Kita tidak boleh mengandalkan informasi dari ekstensi file atau dari nilai $_FILES['berkas']['type'] atau dari mime type karena ketiga informasi tersebut bisa dipalsukan. Lebih baik menggunakan fungsi PHP exif_imagetype() untuk memeriksa signature dari file yang diupload atau fungsi PHP getimagesize() untuk memperoleh ukuran gambar.

    $fileType = exif_imagetype($_FILES['myFile']['tmp_name']);
    $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
    if (!in_array($fileType, $allowed)) {
      echo "hanya diijinkan untuk meng-upload file gambar (gif, jpg, atau png)";
    }
    

    Namun tidak menutup kemungkinan, fungsi PHP di atas juga belum cukup untuk menghentikan hacker yang kelewat kreatif. Jadi perlu ditambahkan juga pemeriksaan ekstensi file, dan ubah paksa file .php menjadi file .jpg sehingga kode php yang mungkin lolos dari pemeriksaan pertama tidak bisa dieksekusi di server.

    <form action="" method="post" enctype="multipart/form-data">
     <input type="file" name="myFile"/>
     <input type="submit" value="Upload"/>
    </form>
    
    <?php
    define("UPLOAD_DIR", "images/");
    
    if (!empty($_FILES['myFile']['name'])) {
    	
      // verifikasi file gambar (GIF, JPEG, atau PNG)
      $fileType = exif_imagetype($_FILES['myFile']['tmp_name']);
      $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
      if (!in_array($fileType, $allowed)) {
        echo "hanya diijinkan untuk meng-upload file gambar (gif, jpg, atau png)";
      }
    	
      else{
        $myFile = $_FILES['myFile'];
    
    
        // ubah paksa nama file yg mengandung selain huruf, angka, ".", "_", dan "-" dengan regex
        $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile['name']);
    
        // periksa ekstensi file
        $parts = pathinfo($name);		
        if (isset($parts['extension'])) {
          $ext = $parts['extension'];
    			
          if ($ext !== 'jpg' && $ext !== 'gif' && $ext !== 'png')
            $ext = "jpg";
    			
    	$name = $parts['filename'] . '.' . $ext;
          }
    		
          else { // jika file tidak memiliki ekstensi maka berikan ekstensi .jpg
            $ext = 'jpg';
    	$name = $parts['filename'] . '.jpg';
          }
    
          // simpan file
          move_uploaded_file($myFile['tmp_name'], UPLOAD_DIR . $name);
      }
    }
    

    Sebagai tambahan, mungkin juga perlu untuk membatasi ukuran file yang diupload untuk melindungi website dari serangan yang mencoba mengganggu network traffic atau system load.