Month: April 2012

  • Peraturan Masyarakat

    Dalam kehidupan bermasyarakat, kita harus mematuhi peraturan (norma) yang berlaku. Peraturan yang dibuat oleh orang-orang terpandai dalam masyarakat. Peraturan tersebut dirancang supaya orang-orang pandai bisa hidup dengan nyaman.

    Orang-orang bodoh, tidak akan mengerti peraturan-peraturan tersebut. Tetapi orang-orang pandai tau, bagaimana menggunakan dan memainkannya. Peraturan-peraturan tersebut akan terus melayani orang-orang pandai. Sebagai contoh, pajak, gaji, dana pensiun, asuransi, pelayanan kesehatan, alokasi dana, subsidi, dan lain-lain.

    Orang-orang pandai dengan sengaja membuat peraturan yang sangat sulit untuk dimengerti. Sementara orang-orang bodoh yang berusaha memahami peraturan itu diperlakukan seperti idiot. Jadi bagi orang-orang bodoh, sepanjang hidupnya akan dicurangi dan diharuskan membayar lebih banyak.

    Orang-orang pandai tidak bisa ditipu dengan mudah, mereka akan mengambil manfaat dari situasi ini. Situasi orang-orang bodoh yang dicurangi dan ditindas sepanjang waktu. Ini adalah fenomena yang terjadi di masyarakat. Jika Anda tidak bisa menerima kenyataan ini, buatlah peraturan sendiri! Jika Anda ingin hidup tanpa dicurangi, belajarlah!

  • 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);  
    
  • Memahami SQL Join dengan Diagram Venn

    Query JOIN pada bahasa SQL berfungsi untuk menggabungkan data dari 2 atau lebih tabel dalam sebuah database. Syntax SQL mempunyai 4 tipe JOIN, yaitu: INNER, OUTER, LEFT, dan RIGHT.

    Diagram Venn adalah diagram yang menunjukan semua kemungkinan relasi logis antara sekelompok variabel yang berbeda. Di sekolah dasar, Diagram Venn dikenalkan pada saat mempelajari teori himpunan pada Matematika. Diagram Venn biasanya dilambangkan dengan 2 atau lebih lingkaran yang saling berpotongan (meskipun tidak harus selalu demikian).

    Misalkan kita mempunyai 2 buah tabel pada database, TabelA dan TabelB. TabelA di sebelah kiri dan TabelB di sebelah kanan. Kemudian kita akan mengisi masing-masing dengan 4 buah data.

    id nama       id  nama
    -- ----       --  ----
    1  Andik      1   Andik
    2  Binta      2   Bambi
    3  Carli      3   Conan
    4  Didut      4   Didut
    

    Sekarang kita coba gabungkan kedua tabel di atas menggunakan tipe-tipe JOIN yang ada.

    1. INNER JOIN

    SELECT * FROM TabelA INNER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id nama       id  nama
    -- ----       --  ----
    1  Andik      1   Andik
    4  Didut      4   Didut
    

    INNER JOIN hanya akan menampilkan data yang cocok satu sama lain (berpasangan) pada kedua tabel. Diagram Venn-nya adalah sebagai berikut.

    inner join

    2. OUTER JOIN
    Pada dasarnya OUTER JOIN dibagi menjadi 3, FULL OUTER JOIN, LEFT OUTER JOIN, dan RIGHT OUTER JOIN.

    2.a. FULL OUTER JOIN

    SELECT * FROM TabelA FULL OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id    nama       id    nama
    --    ----       --    ----
    1     Andik      1     Andik
    2     Binta      null  null
    3     Carli      null  null
    4     Didut      4     Didut
    null  null       2     Bambi
    null  null       3     Conan
    

    FULL OUTER JOIN menghasilkan semua data yang ditemukan dan cocok satu sama lain pada kedua tabel, jika ada yang tidak cocok, bagian yang tidak ada tersebut akan berisi null. Jadi bisa dikatakan FULL OUTER JOIN ini akan menampilkan semua data yang ada di kedua tabel termasuk yang tidak cocok satu sama lain. Diagram Venn-nya adalah sebagai berikut.

    full outer join

    2.b. LEFT OUTER JOIN

    SELECT * FROM TabelA LEFT OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id    nama       id    nama
    --    ----       --    ----
    1     Andik      1     Andik
    2     Binta      null  null
    3     Carli      null  null
    4     Didut      4     Didut
    

    LEFT OUTER JOIN menghasilkan semua data yang ada pada TabelA (tabel sebelah kiri), dengan pasangannya (jika ada) pada TabelB (tabel sebelah kanan). Jika pasangannya tidak ditemukan, tabel sebelah kanan akan berisi null. Diagram Venn-nya adalah sebagai berikut.

    left outer join

    Lalu bagaimana jika kita menginginkan data yang hanya ada pada TabelA (tabel sebelah kiri)? Untuk itu kita membutuhkan bantuan klausa WHERE.

    2.c. LEFT OUTER JOIN dengan klausa WHERE

    SELECT * FROM TabelA LEFT OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    WHERE TabelB.id IS null
    
    id    nama       id    nama
    --    ----       --    ----
    2     Binta      null  null
    3     Carli      null  null
    

    Query LEFT OUTER JOIN di atas menghasilkan data yang hanya ada pada TabelA (tabel sebelah kiri). Diagram Venn-nya adalah sebagai berikut.

    left outer join where

    Untuk tipe RIGHT OUTER JOIN tidak perlu dijelaskan lagi karena hasilnya hanya kebalikan dari LEFT OUTER JOIN. Terakhir, ada satu bentuk diagram lagi, yaitu jika yang diinginkan hanya data yang tidak memiliki pasangan satu sama lain, alias data tersebut berada di luar bagian yang berpotongan.

    2.d. FULL OUTER JOIN dengan klausa WHERE

    SELECT * FROM TabelA FULL OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    WHERE TabelA.id IS null OR
    TabelB.id IS null
    
    id    nama       id    nama
    --    ----       --    ----
    2     Binta      null  null
    3     Carli      null  null
    null  null       2     Bambi
    null  null       3     Conan
    

    Query FULL OUTER JOIN di atas menghasilkan data yang unik (tidak ada yang berpasangan) dari TabelA dan TabelB. Diagram Venn-nya adalah sebagai berikut.

    full outer join where

    Artikel ini merupakan terjemahan bebas dari artikel yang ditulis oleh Jeff Atwood dengan ditambah penjelasan seperlunya.