Welcome to Abdul Malik Ikhsan's Blog

Zend Framework : CSRF ( Cross Site Request Forgery ) Protection

Posted in Javascript, Teknologi, Tutorial PHP, Zend Framework by samsonasik on May 6, 2011

XHR (  XMLHttpRequest ) adalah backbone dari aplikasi web 2.0. Adalah fungsi javascript yang powerfull yang menciptakan HttpRequest. Namun, dari kemudahan yang didapat, ternyata XHR menghadirkan konsekuensi tersendiri, yaitu security hole. XHR, seperti yang telah diatur oleh W3C (  World Wide Web Consortium ), hanya digunakan ketika request itu berasal dari website di mana javascript di muat ( same origin ) untuk menghindari penyalahgunaan dari pihak yang tidak bertanggungjawab.
‘Tekanan’ untuk membolehkan adanya akses cross domain mengingkat dengan adanya konsep mash-ups (sebuah konsep di mana membolehkan data dari beberapa site untuk bisa digabungkan dalam satu single view). Requirement ini bertentangan dengan “same origin policy” ( kebijakan penggunaan request dalam site yang sama)  yang diformulasikan untuk XHR. Sebagai response dari kebutuhan ini, maka kebijakan tersebut  diextends ke “level 2” standard, yang membolehkan akses cross domain jika persyaratan lain terpenuhi, untuk melindungi pengguna (W3C Web Applications Working Group, 2008).

Resiko yang hadir dalam fungsi XHR ini adalah CSRF ( Cross Site Request Forgery )  dengan mengirimkan fake request ke website tujuan. Hal ini bisa terjadi dikarenakan XHR membolehkan browser melakukan request HTTP tanpa interaksi user. Zend Framework, sangat mengerti tentang kebutuhan keamanan ini. Zend Framework menghadirkan komponen Zend_Form yang bisa memproteksi serangan berupa CSRF ini, dengan cara memastikan user session digenerate oleh form, bukan oleh script jahat. Protection dapat dilakukan dengan menambahkan hash element yang nantinya dicek validitasnya ketika request dikirimkan.

Ok, saya akan memberi contoh penggunannya. Pertama, kita buat dulu form class sebagai contoh sebagai berikut ( disimpan dalam application/forms/FrmTesting.php)

<?php
class Form_FrmTesting extends Zend_Form
{
    public function init()
    {
        /* Form Elements & Other Definitions Here ... */
        $this->setMethod('post');
        $this->setAction('http://localhost:8080/zftutwordpress/public/testform/index');

        $this->addElement('text', 'email', array(
            'label'      => 'Your email address:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
            'EmailAddress')
        ));

        $this->addElement('submit', 'submit', array(
            'label'    => 'Goo!',
         ));

        //add CSRF protection
        $this->addElement('hash', 'csrf', array('salt' => get_class($this) . 'My_very_s3cRet%%%TokensEk@!'));
   }
}

Setelah itu, kita bisa panggil form class di controller kita :

//--------------------------------------------
// action body
$frmtest = new Form_FrmTesting();
$request = $this->getRequest();
if ($this->getRequest()->isPost()) {
    if ($frmtest->isValid($request->getPost())) {
        die('data posted is valid :');
    } else{
        //handling malicious posting ...
        die('data posted is not valid : ');
    }
}
$this->view->form  = $frmtest;
//---------------------------------------------

Di layer view, kita tinggal panggil :

<?php echo $this->form; ?> 

Semoga bermanfaat 🙂

Referensi :
Book :
Cross Site Request Forgery: What Attackers Don’t Want You to know – Jason Lam, Johannes B. Ullrich, PhD
Sites:
http://en.wikipedia.org/wiki/CSRF
http://framework.zend.com/manual/en/zend.form.standardElements.html

Advertisements

One Response

Subscribe to comments with RSS.

  1. plutov said, on December 14, 2011 at 4:19 pm

    Good article about ZF and CSRF http://plutov.by/post/zf_csrf


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: