Month: June 2012

  • Bug Y2K38 pada Fungsi date() PHP

    Agar tidak bertele-tele, coba saja kode PHP berikut ini.

    <?php
    echo date('l d F Y H:i:s', strtotime('2038-02-19 3:14:07'));
    

    Seperti yang kita tau, fungsi date() pada kode PHP di atas akan mengembalikan sebuah string waktu sesuai format ‘l d F Y H:i:s’. Harusnya pada browser akan tercetak:

    Friday 19 February 2038 03:14:07

    Namun jika waktu yang tercetak tidak seperti di atas, berarti aplikasi PHP Anda mempunyai kemungkinan terkena bug Y2K38.

    Apa yang dimaksud bug Y2K38? Y2K38 yang disebut juga sebagai Unix Millenium Bug, dapat mempengaruhi sistem yang menggunakan 32-bit signed integer untuk merepresentasikan waktu (hari, tanggal, bulan, tahun, jam, menit, dsb). Sebagai patokan awalnya adalah Kamis, 1 Januari 1970 00:00:00 UTC dan akan berakhir pada Selasa, 19 Januari 2038 03:14:07 UTC. Jika waktu sudah melewati 19 Januari 2038 03:14:07 UTC, akan terjadi integer overflow. Semua bit sudah terpakai, kecuali bit pertama yang tidak boleh digunakan karena sebagai signed bit (0 = positif, 1 = negatif).

    Kondisi signed bit yang diinkremen (ditambah dengan 1) selama proses perhitungan maju ini mengakibatkan nilainya mendadak berubah menjadi negatif, dalam kasus integer overflow ini nilainya menjadi negatif yang maksimum (angka paling kecil). Kemudian proses perhitungan maju berlanjut sampai negatif 0. Hal ini akan mengacaukan perhitungan waktu pada sistem. Gambar yang diambil dari Wikimedia ini menjelaskan dengan sempurna proses tersebut.

    Bug Y2K38

    Tahun 2038 masih lebih dari 20 tahun lagi, seharusnya masalah ini tidak perlu dikuatirkan. Pada tahun itu mungkin aplikasi yang Anda buat sekarang sudah usang dan tidak digunakan. Akan tetapi sebagai seorang programer yang baik sudah seharusnya memikirkan segala kemungkinan. Mungkin saja ada orang yang memakai kode yang Anda buat untuk aplikasi lain yang membutuhkan perhitungan waktu sampai 30 tahun ke depan.

    Menggunakan sistem 64-bit mungkin dapat menyelamatkan Anda, karena bagaimanapun juga 64-bit signed integer jauh lebih lebar jangkauannya dibanding 32-bit signed integer. Tapi saya belum pernah mencoba sejauh itu. Alternatif lain yang lebih mudah yaitu dengan menggunakan class PHP DateTime yang diperkenalkan mulai PHP versi 5.2.

    <?php
    $mydate = new DateTime('2038-02-19 3:14:07');
    echo $mydate -> format('l d F Y H:i:s');
    

    Dengan menggunakan DateTime aplikasi PHP tidak terkena bug Y2K38, karena mampu menangani waktu sampai pada 31 Desember 9999! Mungkin Anda berniat mewariskan kode ini untuk generasi berikutnya 😀

  • 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.