Mencegah serangan CSRF di CodeIgniter

Muhammad Zakuan
WonogiriDev
Published in
3 min readJul 25, 2018

CSRF atau Cross-Site Request Forger merupakan jenis serangan yang dilakukan dengan cara mengeksekusi perintah perintah di dalam sistem tanpa dikehendaki. CSRF dilakukan dengan memanfaatkan celah keamanan yang ada di dalam sistem.

Ada banyak jenis serangan web yang yang dilakukan dengan menggunakan teknik CSRF ini, mulai dari yang tidak begitu berbahaya sampai yang berbahaya. Pada tulisan ini penulis akan mencontohkan serangan csrf yang dilakukan pada framework PHP CodeIgniter berikut penjelasan pencegahannya.

Pada framework CodeIgniter serangan csrf dapat dilakukan dengan mengirimkan link yang berisi request kepada sistem, kemudian sistem akan mengeksekusi dikarenakan tidak adanya autentikasi dari mana perintah tersebut berasal.

Untuk melihat serangan tersebut, mari kita praktikkan saja ..

  1. Download file codeigniter di https://codeigniter.com/download
  2. Ubah folder dengan nama sistem. Berikutnya kita akan menyebut folder ini dengan aplikasi sistem
  3. Bikin database dengan nama test_csrf, kemudian copy pase kode sql berikut.
CREATE TABLE `students` (
`id` int(11) NOT NULL PRIMARY KEY,
`name` varchar(50) NOT NULL,
`majors` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

4. Bikin controller dengan nama Form.php, copy paste code berikut ke dalam file tersebut.

<?phpdefined('BASEPATH') OR exit('No direct script access allowed');class Form extends CI_Controller {public function __construct(){parent::__construct();$this->load->helper('form');$this->load->database();}public function index(){$this->load->view('form');}public function create(){$data = array('name' => $this->input->post('name'), 'majors' => $this->input->post('majors'));$this->db->insert('students', $data);if ($this->db->affected_rows()) {echo "Berhasil";} else {echo "Gagal";}}}

5. Bikin view dengan nama form.php, kemudian copy paste code berikut.

<h1>Form</h1><form method="post" accept-charset="utf-8" action="http://localhost/codeigniter/sistem/index.php/form/create"><label for="nama">Nama : </label><input type="text" name="name" id="name"><br><label for="majors">Jurusan : </label><input type="text" name="majors" id="majors"><br><br><input type="submit" name="submit" value="Submit Post!"  /></form>

6. Jalankan controller Form.php, maka akan tampil windows seperti berikut.

7. Isikan dengan nama sembarang, kemudian klik Submit, maka data akan tersimpan di database.

Disamping itu akan ada window yang menginformasikan bahwa input berhasil.

8. Nah sekarang copy paste folder sistem dan ubah nama menjadi attack, kita akan simulasikan folder ini sebagai aplikasi penyerang untuk kemudian mengirimkan link untuk dieksekusi oleh aplikasi sistem.

9. Ubah file view form.php seperti berikut

<h1>Form</h1><form method="post" accept-charset="utf-8" action="http://localhost/sistem/index.php/form/create"><label for="nama">Nama : </label><input type="text" name="name" id="name"><br><label for="majors">Jurusan : </label><input type="text" name="majors" id="majors"><br><br><?php echo form_submit('submit', 'Submit Post!'); ?><?php echo form_close(); ?>

Jadi, action dari form tersebut akan dikirim ke aplikasi sistem untuk dieksekusi.

10. Jalankan controller Form dari aplikasi penyerang.

11. Input field formnya, kemudian klik submit. Hasilnya form akan terinput ke database.

Pada kasus di atas, proses penyimpanan ke database dilakukan oleh aplikasi attack tanpa kehendak dari aplikasi sistem. Untuk mencegah serangan tersebut di codeigniter sebenarnya sudah disediakan confignya. Buka file config.php di aplikasi sistem. Kemudian set true variabel array $config seperti berikut.

$config[‘csrf_protection’] = TRUE; //untuk keamanan csrf

Jalankan langkah 10 dan 11, maka anda akan mendapati hasil sebagai berikut.

Nah, sekarang aplikasi sistem anda sudah terlindungi dari serangan csrf jenis ini. Sekarang jalankan sebagaimana langkah 6 dan 7. Maka anda akan mendapati yang sama seperti langah 10 dan 11. Ini terjadi karena ada proses autentikasi. Agar sistem bisa mengenali bahwa perintah tersebut berasal dari aplikasi sistem itu sendiri, tambahkan code berikut ke dalam form.

<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>">

Maka sistem akan bisa mengenali bahwa perintah tersebut berasal dari aplikasi sistem.

Anda juga bisa mengecek apakah attack masih bisa mengirim link ke aplikasi sistem untuk menyimpan data. Hasilnya seharusnya tidak bisa .

Semoga bermanfaat …

--

--