Month: December 2011

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

  • Menghilangkan Versi WordPress dari Kode HTML

    Menghilangkan informasi tentang versi berapa WordPress yang digunakan adalah ide yang bagus. Adanya informasi yang menunjukan versi WordPress yang diinstal, dapat sedikit membantu hacker untuk menyelidiki kelemahan sebuah blog. Dengan sedikit trik, kita bisa menyembunyikan fakta bahwa WordPress yang diinstal bukan merupakan versi terbaru.

    Sebelumnya kita pelajari dulu bagaimana untuk melihat versi WordPress. Klik view source atau tekan ctrl + u untuk melihat kode html yang dihasilkan WordPress. Perhatikan ada

    <meta name="generator" content="WordPress 3.2.1" />

    Cara termudah yang disarankan untuk menghilangkan versi WordPress adalah dengan menginstal sebuah plugin. Namun trik berikut ini menurut saya lebih mudah, tanpa plugin. Edit dan tambahkan langsung di file function.php pada folder themes yang digunakan.

    remove_action('wp_head', 'wp_generator');

    Setelah ditambahkan sebaris kode di atas pada file function.php, coba kita periksa dengan mengklik view source pada browser. Jika generator meta tidak hilang, mungkin ditulis hard-coded di file header.php. Cari dan hapus kode di bawah ini:

    <meta name="generator" content="WordPress <?php bloginfo('version'); ?>" />

    Sebagai tambahan untuk trik yang pertama, dapat diganti menggunakan kode di bawah ini untuk menghapus semua generator meta versi WordPress, termasuk untuk menghapus tanda http://wordpress.org/?v=3.2.1 pada RSS feed. Bagi yang belum tau, tanda ini terletak pada source code RSS feed WordPress, pada bagian atas. Tanda ini tidak terhapus jika hanya menggunakan kode pada trik pertama di atas.

    function remove_version() {  
       return '';  
    }  
    add_filter('the_generator', 'remove_version');
    

    Terakhir, coba buka alamat blog Anda ditambah dengan readme.html (misal: http://blogsaya.com/readme.html). Halaman tersebut berisi deskripsi lengkap versi WordPress yang digunakan.
    readme version wordpress

    Saya rasa semua juga sudah tau, tinggal hapus saja file readme.html di direktori utama WordPress. Jika tidak ingin menghapusnya, cukup hapus nomor versi yang terletak di atas.

  • Cara Melihat Private Foto di Facebook

    Melihat private foto di Facebook bukanlah hal yang tidak mungkin. Di bawah ini adalah cara melihat private foto di Facebook dengan memanfaatkan bug yang ada di sistem report Facebook.

    Peringatan:
    Sangat disarankan untuk menggunakan dummy account, bukan account Anda yang sebenarnya. Saya tidak bertanggungjawab jika Facebook menutup account Anda dengan alasan melanggar kebijakan mereka.

    Langkah 1:
    Siapkan sebuah account facebook yang ingin dilihat private fotonya
    private foto facebook 1

    Langkah 2:
    Klik pada Report/block. Dari popup menu yang muncul, pilih Inappropriate profile photo kemudian tekan Continue.
    private foto facebook 2

    Langkah 3:
    Pilih Nudity or pornography kemudian tekan Continue.
    private foto facebook 3

    Langkah 4:
    Centang pada Report to Facebook, kosongkan pilihan yang lain. Kemudian tekan Continue.
    private foto facebook 4

    Langkah 5:
    Pilih pada Help us take action by selecting additional photos to include with your report, kemudian tekan Continue.
    private foto facebook 5

    Langkah 6:
    Kini Anda bisa melihat foto facebook yang di-private πŸ™‚
    private foto facebook 6

    Sumber: http://forum.bodybuilding.com/showthread.php?t=140261733

  • Kisah Si Penjual Sepeda

    Alkisah pada suatu masa di negeri antah berantah, muncul sebuah perusahaan yang melakukan praktek penjualan licik. Bermula dari suatu iklan di koran dan majalah:

    PROMO SEPEDA ISTIMEWA

    DAPATKANLAH DENGAN HARGA 10 DOLLAR

    bukan 50 dollar

    JANGAN LEWATKAN KESEMPATAN INI

    MINTALAH KETERANGAN CUMA-CUMA

    KEPADA KAMI:

    ……………………….

    Tentu saja banyak orang menaruh hati pada iklan itu. Mereka meminta keterangan persyaratannya. kemudian katalogpun dikirimkan.

    Apa yang diperoleh mereka atas 10 dollar bukanlah sebuah sepeda, melainkan 4 kupon untuk dijual pada temannya dengan harga 10 dollar setiap kupon. Jadi, bila dia dapat mengumpulkan 40 dollar untuk diserahkan ke perusahaan itu maka sebuah sepeda memang didapatkannya. Dengan demikian, orang itu memang hanya membayar 10 dollar, sisanya 40 dollar berasal dari kantong orang lain. Tak pelak selain membayar 10 dollar dia harus mencari orang yang bersedia membeli 4 kupon itu, nampaknya memang tidak memerlukan ongkos tambahan.

    Apakah arti kupon itu sehingga ada orang yang mau membeli seharga 10 dollar? Dia sendiri membeli hak untuk menukar kupon ini dengan 4 kupon serupa. Pemilik-pemilik kupon yang baru, akan menerima 4 kupon untuk penyebaran selanjutnya.

    Sepintas tak ada kelicinan dalam aturan permainannya. Perusahaan selalu memegang janji, sepeda itu sungguh-sungguh dapat dibeli seharga 10 dollar. Demikian juga perusahaan tidak mengalami kerugian. Perusahaan selalu menerima harga penuh sebuah sepeda, yaitu 50 dollar.

    Akan tetapi, cara ini adalah jelas sebuah kelicikan. Karena keranjingan ini menyebabkan kerugian pada sebagian orang yang tidak dapat menjual kuponnya. Orang-orang inilah yang membayar kekurangannya. Cepat atau lambat, suatu saat para pemegang kupon merasa tidak mungkin menjual kupon itu lagi. Kita bisa hitung bertambahnya para pemegang kupon secara pesat.

    Kelompok pembeli pertama, yang menerima kupon langsung dari perusahaan, biasanya tak mengalami kesulitan mencari pembeli (4 partisipan baru). Kelompok selanjutnya harus menjual kupon mereka pada 16 orang yang lain (4 x 4), dan untuk menjualnya mereka harus meyakinkan pembeli. Kita anggap saja mereka berhasil membujuk 16 partisipan, maka mereka ini harus menyebarkan kepada 16 x 4 = 64 partisipan yang lain.

    Jadi dari 1 pembeli langsung telah diperoleh 1 + 4 + 16 + 64 = 85 partisipan, 21 di antaranya menerima sepeda, sedangkan 64 orang sisanya diberikan harapan menerima sepeda, sebuah harapan yang harus dibayar 10 dollar untuk sebuah sepeda :).

    Cakupan wilayah penjualannya kian meluas dan semakin menyusup ke semua sudut negeri, sehingga makin sulit menemukan prospek baru. Enam puluh empat partisipan baru itu harus menjual kuponnya kepada 256 korban baru, yang pada giliran selanjutnya harus menjual pada 1024 orang. Dalam sekejap sebuah kota kecil di negeri itu pun kebanjiran kupon.

    Tawaran itu telah menyeret kian banyak orang ke dalam ngarai yang tak berlembah. berikut ini adalah “kedalaman ngarai” itu:

    1

    4

    16

    64

    256

    1024

    4096

    16384

    Seterusnya bisa dicari dengan rumus 4n, nilai konstanta 4 adalah jumlah korban yang harus dicari, dan variable n adalah tingkatan/kedalaman ngarai.

    Jika di kota kecil itu cukup banyak pengendara sepedanya, misalnya ada 21845 orang, maka demam itu akan melanda kota dalam 8 putaran saja. Pada saat itu semua orang telah terseret, namun hanya ΒΌ nya memperoleh sepeda, sisanya hanya akan menjadi “pemilik masa yang abadi”, karena pasti tak akan sanggup menjual kupon-kupon tersebut.

    Meskipun kota terpadat di dunia sekalipun, ambang kejenuhannya akan segera tercapai, karena piramida bilangan di atas sangat pesat pertumbuhannya. “Otak yang kurang sehat” akan menjadi penjual sukarela tanpa hasil.

     

    Catatan:
    Cerita di atas adalah fiktif tetapi teknik yang digunakan asli dan bisa diterapkan di dunia nyata. Rasanya tak berlebihan kalau saya menganalogikan cerita di atas dengan bisnis MLM. Hanya orang-orang yang berada di level atas bisa menikmati hasilnya, karena itulah mereka sering berkata: “Kalau saya bisa, Andapun bisa!”.
    Empat fakta MLM yang saya kumpulkan:
    1. Di perusahaan biasanya pemilik usaha menggaji karyawan, sedangkan di MLM tidak ada sistem seperti itu.
    2. Di perusahaan biasa, si A dengan kedudukan lebih rendah dari si B bisa saja suatu waktu mendapat promosi dan akhirnya kedudukan si A lebih tinggi dari si B, sedangkan di MLM, downline (si A) selamanya tidak akan bisa menjadi upline (si B).
    3. Pada umumnya jalur distribusi barang terdiri dari produsen, distributor, dan konsumen, sedangkan di MLM, kita jadi distributor/penjual, sekaligus konsumen sendiri.
    4. Dari cerita di atas menunjukkan pasar yang tidak terbatas, saya pernah baca pasar yang tak terbatas itu menyalahi ilmu ekonomi.

    Cerita ini pernah dipublikasikan di blog lama saya yang tiba-tiba dihapus secara sepihak dari pihak web hosting gratisan πŸ˜€ Namun dengan berbekal webarchive akhirnya saya bisa menemukan kembali cerita lama itu. Link di atas juga sebagai bukti bahwa saya pernah memposting kisah itu.

  • Pengenalan AJAX Menggunakan jQuery

    AJAX (Asynchronous JavaScript and XML) adalah sebuah teknik pemrograman yang memungkinkan kita melakukan pertukaran data antara client dengan server secara asynchronous, yang artinya komunikasi terjadi di belakang layar sehingga halaman web tidak harus dimuat ulang hanya untuk mengganti sebagian dari isinya.

    Sebelum era jQuery, pemrograman AJAX sangat sulit dilakukan, karena berhubungan dengan pengaksesan DOM menggunakan JavaScript. Terimakasih kepada jQuery, sehingga pemrograman menggunakan teknik AJAX bisa menjadi lebih mudah dan cepat.

    Penerapan teknik AJAX yang paling sederhana adalah untuk memanggil dan memuat sebuah dokumen HTML ke dalam DOM. Teknik ini dapat dengan mudah kita wujudkan dengan menggunakan fungsi load() dari jQuery. Secara singkat fungsi ini berguna untuk memuat data (HTML dokumen) dari server dan menyisipkannya ke dalam elemen yang sesuai.

    $(document).ready(function() {
      $('#tombol').click(function(){
        $('#container').load('content.html');
        });
      });
    

    Selain menggunakan fungsi jQuery load(), potongan kode di atas juga menggunakan fungsi click(). Fungsi ini akan dieksekusi ketika ada click event (user meng-klik sebuah tombol atau link). Fungsi ini mirip dengan JavaScript event onClick.

    Berikut ini adalah source code lengkapnya. Untuk mencoba kode ini, dibutuhkan juga sebuah file HTML yang akan dipanggil, beri nama “isi.html” dan isilah dengan sembarang kode HTML.

    <!DOCTYPE html>
    <html>
    <head>
      <script src="http://code.jquery.com/jquery-latest.js"></script>	
      <script type="text/javascript">
      $(document).ready(function() {
        $('#tombol').click(function(){
          $('#kontainer').load('isi.html');
          });
        });
      </script>
    </head>
    <body>
      <input type="button" id="tombol" value="klik di sini">
      <div id="kontainer">
        <!--Isi dari file content.html akan ditampilkan di sini-->
      </div>
    </body>
    </html>
    

    Ketika tombol diklik, AJAX memanggil URL “isi.html” dan menyisipkannya ke dalam DOM. DOM yang dimaksud di sini adalah sebuah elemen dengan id=”kontainer”.

    Karena fungsi jQuery click() mirip dengan event JavaScript onClick, maka source code di atas dapat juga ditulis seperti berikut:

    <!DOCTYPE html>
    <html>
    <head>
      <script src="http://code.jquery.com/jquery-latest.js"></script>
      <script type="text/javascript">		
      function loadIsi(){
        $('#kontainer').load('isi.html');
      }
      </script>
    </head>
    <body>	
      <a href="#tombol" onclick="loadIsi(); return false;">load isi</a>
      <div id="kontainer">
        <!--Isi dari file content.html akan ditampilkan di sini-->
      </div>
    </body>
    </html>