Selasa, 05 Januari 2021

Cara Menggunakan CSRF Token di Codeigniter Untuk Mencegah serangan CSRF

Cara Rusli
Cara Menggunakan CSRF Token di Codeigniter  Untuk Mencegah serangan CSRF


    CSRF merupakan sebuah singkatan Cross-site request forgery yaitu Class security di CodeIgniter. Dalam kinerja pada setiap proses post akan ada request token yang kemudian di validasi oleh sistem, dimana token ini bersifat random yang di regenerate dan bisa diatur batas expirednya.

    Pada proses CSRF CodeIgniter , harus selalu mengirim token yang di regenerate. tentu nilai token selalu berubah. Dan nilai yang di input kan ajax juga harus ikut berubah, jika tidak terjadi gagal yaitu proses 403 forbidden atau An Error Was Encountered The action you have requested is not allowed. Untuk mengatasi The action you have requested is not allowed kita ambil nilai token yang di kirimkan di controller dan kita set nilainya di form inputnya.

    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 Download Codigniter
2. Ubah folder dengan nama sistem. Berikutnya kita akan menyebut folder ini dengan aplikasi sistem
3. Buatlah 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. Buatlah controller dengan nama Form.php, copy paste code berikut ke dalam file tersebut.

<?php
defined('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. Buatlah 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.

Tampilan Form




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;
$config['csrf_protection'] = true;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

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.

Catatan didalam setiap form masukan kode di bawah ini
 <?php echo  form_hidden($this->security->get_csrf_token_name(), $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 …


Tidak ada komentar:

#