Archive for the ‘pemrograman web’ Category

Enkripsi Get Parameter

Posted by sipur on September 20th, 2008 under pemrograman web, web trick
Tags: , , , , , , , , , , , , ,  •  2 Comments

Yah, sering berurusan dengan get parameter pada saat membuat suatu halaman web seperti http://apalah.com/index.php?id=1&page=2. Yakin bahwa hal tersebut aman untuk situs yang ingin dibuat? Saya rasa kita semua tahu mengenai XSS (Cross Side Scripting), apakah Anda khawatir dengan hal tersebut?

Mungkin alternatif solusi yang bisa dipilih adalah dengan mengenkripsi get parameter yang akan kita kirim melalui halaman web. Salah satu enkripsi yang bisa digunakan adalah dengan menggunakan AES (Advance Encryption Standard). Berikut ini tahapan-tahapan yang mesti dilakukan jika ingin menggunakan AES untuk enkripsi pada halaman web.

1. Persiapkan master class library untuk AES-nya. Class library bisa didownload pada situs Phpclass.net atau link berikut ini. Pada dasarnya konsep enkripsi get parameter dengan menggunakan AES terdiri atas 4 bagian penting. Pertama adalah proses enkripsi parameter, kemudian meletakannya di halaman web. Lalu proses dekripsi yang dilanjutkan retrieval get parameter yang ditransfer tadi.
2. Pertama adalah proses enkripsi parameter. Buatlah instance dari kelas AES yang ada, kemudian enkripsikan get parameter yang ingin ditransfer, berikut code nya.//function to encrypt url

public function encryptParam($content) {
 
      global $aespath;
 
      include_once($aespath.'/AES.class.php');
 
      $key256 = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4';
 
      //set aes 256 bit
 
      $Cipher = new AES(AES::AES256);
 
      if(strlen($content) > 16){
 
      $content = str_split($content,16);
 
      $i=0;
 
      //do encrypting
 
      while($i<count ($content)){
 
      $temp = $Cipher->stringToHex($content[$i]);
 
      $encrypted .= $Cipher->encrypt($temp, $key256);
 
      $i++;
 
      }
 
      }
 
      else {
 
      $temp = $Cipher->stringToHex($content);
 
      $encrypted = $Cipher->encrypt($temp, $key256);
 
      }
 
      return $encrypted;
 
      }
</count>

Fungsi encrypt($param) pada AES library ini hanya mendukung enkripsi untuk 16 bytes data, jadi kita harus memecah input data terlebih dahulu menjadi potongan 16 bytes ketika input yang ada lebih dari 16 bytes. Dalam contoh di atas, yang digunakan adalah AES dengan key sepanjang 256 bit.
3. Kedua adalah peletakan get param ketika akan ditransfer [saya menggunakan PRADO PHP Framework], misalkan saya ingin menulis alamat url berikut [dalam variable php]

$url = “http://apalah.com?pages=Home&id=1&user=3″;, maka tinggal dirubah menjadi

$url = “http://apalah.com?pages=Home&”.encryptParam(”id=1&user=3″);, dalam kasus ini pages=Home tidak dienkrip karena informasi tersebut akan digunakan oleh si Prado.
4. Tahap ketiga adalah pengambilan get parameter yang telah dienkripsi. Sebagai contoh kode berikut :

      //decrypting parameter to be parse
 
      $param = explode("&",$_SERVER['REQUEST_URI']);
 
      $getparam = $this->User->decryptParam($param[1]);
 
      //split param
 
      $splited_param = $this->User->splitParam($getparam);

$splited_param merupakan array dua dimensi yang berisi get parameter dengan ketentuan. $splited_param[$i]['name'] merupakan nama get parameter, dan $splited_param[$i]['value'] merupakan nilai dari get parameter. $i adalah indeks parameter, nilai maksimum $i-1 adalah jumlah parameter get yang ditransfer. Sebagai contoh dalam kasus ini $splited_param[0]['name'] berisi “id” dan $splited_param[0]['value'] berisi “1″. Berikut ini fungsi tambahan yaitu decryptParam(), splitParam()

      //decrypt
 
      public function decryptParam($encrypted) {
 
      global $aespath;
 
      include_once($aespath.'/AES.class.php');
 
      $key256 = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4';
 
      //set aes 256 bit
 
      $Cipher = new AES(AES::AES256);
 
      //do decrypting
 
      if(strlen($encrypted)>32){
 
      $content = str_split($encrypted,32);
 
      for($i=0;$i<count ($content);$i++) {
 
      $temp = $Cipher->decrypt($content[$i], $key256);
 
      $decrypted .= $Cipher->hexToString($temp);
 
      }
 
      else {
 
      $temp = $Cipher->decrypt($encrypted, $key256);
 
      $decrypted = $Cipher->hexToString($temp);
 
      }
 
      //echo $string;
 
      return $decrypted;
 
      }
 
      //split get parameter
 
      public function splitParam($param){
 
      $temp = explode("&",$param);
 
      $count = count($temp);
 
      $i=0;
 
      while($i< $count){
 
      $temp1 = explode("=",$temp[$i]);
 
      $splited[$i]['name']=$temp1[0];
 
      $splited[$i]['value']=$temp1[1];
 
      $i++;
 
      //echo $temp[$i].'<br/> ';
 
      }
 
      return $splited;
 
      }
</count>

Semoga bermanfaat, jika masih bingung silahkan kontak di sipur@univind.com atau YM saya di and_thau