XSS merupakan singkatan yang digunakan untuk istilah cross site scripting. XSS merupakan salah satu jenis serangan injeksi code (code injection attack).

XSS dilakukan oleh penyerang dengan cara memasukkan kode HTML atau client script code lainnya ke suatu situs. Serangan ini akan seolah-olah datang dari situs tersebut.

Akibat serangan ini antara lain penyerang dapat mem-bypass keamanan di sisi klien, mendapatkan informasi sensitif, atau menyimpan aplikasi berbahaya.

Alasan singkatan yang digunakan XSS bukan CSS karena CSS sudah digunakan untuk cascade style sheet. – id.wikipedia.org

Masih bingung?

Saya akan perjelas lagi dengan cerita.

Begini ceritanya,

Ada sebuah form dan di sana kita diminta untuk mengisi nama, nip, dan jabatan.

Akan tetapi, karena ada seorang yang usil. Dia tidak mengisi nama, melainkan mengisi kode HTML dan Javascript.

Maka yang akan tersimpan ke dalam database adalah skrip di atas.

Secara otomatis, ketika data ditampilkan, browser akan mengekekusi skrip tersebut.

Si admin sepertinya akan panik.

Nah, itulah salah satu bentuk serangan XSS. Penyerang sangant leluasa memasukan skrip ke website kita.

Lalu, bagaimana cara mengatasi ini di CodeIgniter?

CodeIgniter sebenarnya sudah menyediakan fitur Global XSS Filtering.

Cara mengaktifkannya, tinggal mengganti nilai FALSE menjadi TRUE pada application/config/config.php.

Dengan demikian, semua input dari pengguna atau penyerang akan dikonversi dulu sebelum di simpan ke database.

Akan tetapi fitur ini sudah tidak tersedia lagi.

The ‘global_xss_filtering’ setting is DEPRECATED and kept solely for backwards-compatibility purposes. XSS escaping should be performed on output, not input!

dokumentasi CI

Sepertinya pengembang CI sudah menyadari, kalau XSS itu masalah pada output, bukan input.

Cara mengatasi XSS yang lain adalah dengan melakukan validasi input (xss_clean). Namun, seperti yang disebutkan tadi. XSS masalah pada output bukan input.

Lalu bagaimana?

Mau tidak mau, kita harus merubah dulu data yang akan ditampilkan agar tidak dieksekusi oleh browser.

Misalnya seperti berikut ini.

echo htmlentities($data->nama, ENT_QUOTES, 'UTF-8');

fungsi htmlentities() akan merubah kode html menjadi bentuk yang tidak akan dieksekusi.

Kita harus mengetik fungsi tersebut setiap mau menampilkan data.

Karena terasa cukup panjang, sebaiknya dijadikan helper.

Buatlah sebuah helper pada direktori application/helpers.

Berikan nama xss_helper.php, kemudian isi kodenya seperti berikut ini.

<?php

function cetak($str){
    echo htmlentities($str, ENT_QUOTES, 'UTF-8');
}

Setelah itu,masukan helper ini ke dalam autoload. Buka, application/config/autoload.php, kemudian tambahkan xss pada autoload helper.

/*
| -------------------------------------------------------------------
| Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = array('url','cookie','form','xss');

Sekarang fungsi echo, kita ganti dengan fungsi cetak().

Cara penggunaanya, tinggal kita panggil fungsi cetak() pada tempat atau view yang mungkin bisa terkena XSS.

<?php foreach($pejabat as $pjb){?>
<tr>
<td><?php cetak($pjb->nama) ?></td>
<td><?php cetak($pjb->nip) ?></td>
<td><?php cetak($pjb->jabatan) ?></td>
</tr>
<?php } ?>

Maka, teks akan ditampilkan apa adanya, tidak lagi dieksekusi oleh browser. 😊

Hasil output XSS Filtering

Referensi: