Yii2: Encrypt and Decrypt Url On The Fly

encryptPernahkah Anda berfikir bahwa url yang keluar dar aplikasi Yii kita terlalu vulgar :) sebut saja.. misalnya http://localhost/aplikasi/employee?id=3, Nah orang awam pun akan memahami bahwa url tersebut artinya menunjuk ke data employee dengan id = 3.. maka dengan asumsi tersebut siapapun orangnya kemudian bisa menerka dan mengakses URL dengan mudah.. yaitu cukup dengan mengubah nilai dari parameter id.

Apakah ini celah keamanan di Yii? saya kira bukan.. :) jikalau seandainya dengan mengubah nilai parameter tersebut bisa membuat orang yang tidak berhak bisa mengaksesnya maka kesalahan terletak pada Anda :).. Gunakan scope (istilah pada model) untuk membatasi data.. hak akses RBAC dan FilterAccess hanya membatasi akses namun tidak membatasi pengaksesan data.. hati2 heheh santai saja :)

Jadi encrypt dan decrypt pada artikel ini sebenarnya bukan untuk tujuan security hanya agar URL tidak terlalu vulgar.. namun jika Anda gunakan untuk tujuan keamanan ya silahkan.. maklum saya bukan satpam jadi gak begitu mudeng dengan keamanan.. :) Oke deh.. tanpa berpanjang kata lagi, saya akan tunjukkan bagaimana cara melakukannya..

Pada artikel ini saya hanya akan memberikan contoh sederhana (contoh advanced tanyaakan pada ahlinya aku ramudeng) yaitu mengubah Url ini http://localhost/aplikasi/employee?id=3 menjadi http://localhost/aplikasi/employee?id=Mwsxa, yap.. hanya nilai dari parameter saja yang saya enkripsi yaitu dari 3 menjadi Mwsxa. Untuk melakukannya saya menggunakan fungsi default php yaitu base64_decode dan encode dalam prakteknya Anda bisa gunakan fungsi lain (maklum saya bisanya cuman begini om.. jangan di timpuk yah..) :)

Sebenarnya kita bisa melakukan cara manual.. update semua view dan controller kita ubah dan sesuaikan dengan model diatas :) cara ini mudah.. tapi lama.. sedangkan yang ingin saya tawarkan cara cepat dan lebih mudah.. :) silahkan dipilih.. yaitu sebagaimana judul artikel ini
Encrypt and Decrypt Url On The Fly.

Hal itu bisa kita lakukan di Yii2 melalui yii\web\UrlRule, Dimana class ini mengijinkan kita mengoverwrite dua fungsi penting terkait pengaturan Url yaitu createUrl (untuk menggenerate Url) dan parseRequest (membaca Url). Setelah membaca ini http://www.yiiframework.com/doc-2.0/guide-runtime-url-handling.html saya akhirnya Alhamdulillah menemukan cara ini..

Pertama.. buatlah class misalnya saya kasih nama UrlRule.. simpan dengan nama UrlRule.php pada directory common\helpers; Jika directory ini gak ada gimana??? Kalo gak ada yang tinggal di buat.. jangan dibuat sulit to hehehe..

<?php
namespace common\helpers;

use yii;

class UrlRule extends yii\web\UrlRule
{
    public $connectionID = 'db';

    public function init()
    {
        if ($this->name === null) {
            $this->name = __CLASS__;
        }
    }

    public function createUrl($manager, $route, $params)
    {
		$args='?';
		$idx = 0;
		foreach($params as $num=>$val){
			if($num=='id'){
				$val = base64_encode($val);
			}
			$args .= $num . '=' . $val;
			$idx++;
			if($idx!=count($params)) $args .= '&';
		}
		$suffix = Yii::$app->urlManager->suffix;
		if ($args=='?') $args = '';
		return $route .$suffix. $args;
        return false;  // this rule does not apply
    }

    public function parseRequest($manager, $request)
    {
		$pathInfo = $request->getPathInfo();
		$url = $request->getUrl();
		$queryString = parse_url($url);
		if(isset($queryString['query'])){
			$queryString = $queryString['query'];
			$args = [];
			parse_str($queryString, $args);
			$params = [];
			foreach($args as $num=>$val){
				if($num=='id'){
					$val = base64_decode($val);
				}
				$params[$num]=$val;
			}
			$suffix = Yii::$app->urlManager->suffix;
			$route = str_replace($suffix,'',$pathInfo);
			return [$route,$params];
		}
        return false;  // this rule does not apply
    }
}

Pahami kode diatas.. saya kira mudah kok… makanya gak saya jelasin… ngantuk..

Kemudian ubah main config aplikasi Anda.. backend\config\main.php

// ...
'components' => [
    'urlManager' => [
        'rules' => [
		    // ...
            ['class' => 'common\helpers\UrlRule', 'connectionID' => 'db', /* ... */],
        ],
    ],
],

Selesai.. silahkan coba aplikasimu terutama bagian Gridview Edit, Create, dan View.. keren kan? :)

CMIIW

9 Comments
  1. agit
  2. Gedhe76
  3. asep muhidin
  4. asep muhidin
  5. polres situbondo
  6. Aries
  7. umakant mane
  8. Joko
  9. rino

Leave a Reply

Your email address will not be published. Required fields are marked *