Ketika membahas keamanan aplikasi, selain mengamankan hardware dan platform, Anda juga perlu menulis kode yang aman. Artikel ini akan menjelaskan bagaimana untuk menjaga aplikasi Anda aman dan kurang rentan terhadap hacking. Berikut ini adalah kebiasaan terbaik yang bisa dikembangkan programmer untuk melindungi aplikasinya dari serangan:

  • Validasi data masukan
  • Menjaga terhadap serangan XSS
  • Menjaga terhadap serangan CSRF
  • Mencegah serangan SQL Injection
  • Melindungi sistem file
  • Melindungi data session
  • Penanganan kesalahan yang tepat
  • Menjaga file yang disertakan

Validasi Data Masukan

Sementara merancang aplikasi Anda, Anda harus berusaha untuk menjaga aplikasi Anda terhadap masukan yang buruk. Aturan praktis untuk mengikutinya adalah: tidak percaya input pengguna. Meskipun aplikasi Anda ditujukan untuk orang-orang baik, selalu ada kemungkinan bahwa beberapa pengguna yang buruk akan mencoba untuk menyerang aplikasi Anda dengan memasukkan masukan yang buruk. Jika Anda selalu memvalidasi dan menyaring data yang masuk, Anda dapat membangun aplikasi yang aman.

Selalu memvalidasi data dalam kode PHP Anda. Jika Anda menggunakan JavaScript untuk memvalidasi input pengguna, selalu ada kemungkinan bahwa pengguna mungkin telah mematikan JavaScript di browser-nya. Dalam hal ini aplikasi Anda tidak akan dapat memvalidasi input. Memvalidasi di JavaScript tidak apa-apa, tapi untuk menjaga terhadap jenis masalah lain maka Anda harus memvalidasi ulang data di PHP juga.

Menjaga Terhadap Serangan XSS

Serangan Cross-site scripting (XSS attack) adalah serangan berdasarkan injeksi kode ke halaman web yang rentan. Bahayanya adalah menerima data dari input yang tidak divalidasi dan menunjukkannya di browser.

Misalkan Anda memiliki form komentar dalam aplikasi Anda yang memungkinkan pengguna untuk memasukkan data, dan ketika sukses mengirimkan komentar ia akan menunjukkan semua komentar yang lain. Pengguna mungkin bisa memasukkan komentar yang berisi kode JavaScript berbahaya di dalamnya. Bila formulir dikirimkan, data dikirim ke server dan disimpan ke dalam database. Setelah itu, komentar diambil dari database dan ditampilkan dalam halaman HTML dan kode JavaScript akan berjalan. Kode JavaScript yang berbahaya mungkin mengarahkan pengguna ke halaman web yang buruk atau situs web phishing.

Untuk melindungi aplikasi Anda dari jenis-jenis serangan ini, jalankan data input melalui fungsi strip_tags () untuk menghapus tag yang ada di dalamnya. Ketika menampilkan data dalam browser, jalankan fungsi applyhtmlentities () pada data.

Menjaga Serangan CSRF

Dalam serangan Cross Site Request Forgery (CSRF), penyerang mengelabuhi korban untuk memuat informasi sensitif atau melakukan transaksi tanpa sepengetahuan mereka. Hal ini terutama terjadi pada aplikasi web yang buruk kode programnya untuk memicu logika bisnis menggunakan permintaan GET.

Idealnya, permintaan GET  idempoten secara alamiahnya. Idempotency berarti halaman yang sama dapat diakses beberapa kali tanpa menimbulkan efek samping. Oleh karena itu, permintaan GET harus digunakan hanya untuk mengakses informasi dan tidak untuk melakukan transaksi.

Contoh berikut menunjukkan bagaimana aplikasi dibuat menggunakan kode yang buruk sehingga mendukung serangan CSRF:

<?php
if (isset($_REQUEST["name"], $_REQUEST["amount"])) {
    // process the request and transfer the amount from
    // from the logged in user to the passed name.
}

Mari kita asumsikan Bob ingin melakukan serangan CSRF pada Alice, dan membangun sebuah URL seperti berikut dan mengirimkannya ke email Alice :

<a href="http://example.com/process.php?name=Bob&amount=1000">Visit My WebSite</a>

Jika Alice mengeklik link ini, dan sudah login ke website, permintaan ini akan memotong $1.000 dari rekening dan mentransfernya ke Bob! Atau, Bob dapat membuat image link yang mana atribut src  merujuk ke URL.

<img src="http://example.com/process.php?name=Bob&amount=1000"width="1" height="1"/>

Browser tidak dapat menampilkan gambar apapun seperti yang diharapkan, tetapi masih akan membuat permintaan menggunakan URL yang akan melakukan transaksi tanpa memberitahu Alice.

Solusinya adalah untuk memproses fungsi yang mengubah keadaan database dalam permintaan POST, dan hindari menggunakan $_REQUEST. Gunakan $_GET untuk mengambil parameter GET, dan menggunakan $_POST untuk mengambil parameter POST.

Selain itu, harus ada token acak disebut token CSRF terkait dengan setiap permintaan POST. Ketika user login ke akunnya, aplikasi harus menghasilkan token acak dan menyimpannya dalam sesi. Setiap kali form apapun akan ditampilkan kepada pengguna, token harus hadir di halaman sebagai field input tersembunyi. Logika aplikasi harus memeriksa token dan memastikan bahwa itu cocok dengan yang yang ada dalam session saat ini.

Mencegah Serangan SQL Injection

Untuk melakukan query database Anda, Anda harus menggunakan PDO. Dengan query yang disertai parameter dan prepared statement, anda dapat mencegah SQL injection.

Lihatlah contoh berikut:

<?php
$sql = "SELECT * FROM users WHERE name=:name and age=:age";
$stmt = $db->prepare($sql);
$stmt->execute(array(":name" => $name, ":age" => $age));

Pada kode di atas kami menyediakan parameter bernama :name dan :age untuk fungsi prepare(), yang menginformasikan mesin database pembersihan dari karakter yang tidak diijinkan harus dilakukan pada parameter ini. Ketika panggilan execute() dibuat, query dijalankan dengan nilai-nilai parameter yang sebenarnya. Jika Anda membuat kode dengan cara ini, penyerang tidak dapat menyuntikkan SQL berbahaya dan database Anda akan aman.

Melindungi File System

Sebagai pengembang Anda harus selalu menulis kode Anda sedemikian rupa sehingga tidak ada operasi yang menempatkan sistem file Anda beresiko. Pertimbangkan kode PHP berikut yang mendownload file sesuai dengan parameter yang diberikan pengguna:

<?php
if (isset($_GET['filename']) {
    $filename = $_GET['filename'];
    header('Content-Type: application/x-octet-stream');
    header('Content-Transfer-Encoding: binary');
    header('Content-Disposition: attachment; filename="' . $filename .'";');
    echo file_get_contents($filename);
}

Script ini sangat berbahaya karena dapat melayani file dari sembarang direktori yang dapat diakses, seperti direktori session dan direktori sistem. Solusinya adalah untuk memastikan script tidak mencoba untuk mengakses file dari direktori yang tidak di inginkan.

Melindungi Data Session

Secara default, informasi session ditulis ke direktori temp. Dalam kasus server shared hosting, orang lain selain Anda dapat menulis file dan membaca data session dengan mudah. Oleh karena itu, Anda tidak harus menyimpan informasi sensitif seperti password atau nomor kartu kredit dalam session.

Cara yang baik untuk menjaga data sesi Anda adalah untuk mengenkripsi informasi yang disimpan dalam sesi. Ini tidak memecahkan masalah sama sekali karena data terenkripsi tidak sepenuhnya aman, tapi setidaknya informasi tersebut tidak dapat dibaca. Anda juga harus mempertimbangkan menjaga data session disimpan di tempat lain, misalnya database. PHP menyediakan metode yang disebut session_set_save_handler() yang dapat digunakan untuk menyimpan data dalam session dengan cara Anda sendiri.

Pada PHP 5.4 Anda dapat melewatkan sebuah objek dari tipe SessionHandlerInterface ke method session_set_save_handler(). Memeriksa dokumentasi PHP untuk belajar tentang pelaksanaan kustomisasi persistensi session dengan menerapkan SessionHandlerInterface.

Penanganan Kesalahan Secara Tepat

Ada baiknya untuk mengetahui tentang semua kesalahan yang terjadi ketika kami sedang mengembangkan sebuah aplikasi, tetapi ketika kita membuat aplikasi yang dapat diakses oleh pengguna akhir kita harus berhati-hati untuk menyembunyikan kesalahan. Jika kesalahan ditampilkan kepada pengguna, mungkin membuat aplikasi kita rentan. Jadi, pendekatan yang terbaik adalah mengkonfigurasi server Anda secara berbeda untuk pengembangan dan lingkungan produksi .

Dalam mode produksi kita perlu mematikan pengaturan display_errors dan display_start_up_errors. error_reporting dan log_errors harusnya diaktifkan sehingga kita dapat mencatat log kesalahan sambil menyembunyikan mereka dari pengguna akhir .

Anda dapat menggunakan set_error_handler untuk menentukan penangan kesalahan. Namun, ia memiliki keterbatasan. Penangan error yang sudah dikustomisasi memotong standar mekanisme penanganan error PHP . Hal ini tidak dapat menangkap kesalahan seperti E_CORE_ERROR , E_STRICT atau E_COMPILER_ERROR dalam file yang didefinisikan untuk mencatat log error. Selain itu, akan gagal untuk menangani kesalahan yang mungkin terjadi dalam file penanganan error yang kita buat sendiri itu.

Untuk menangani kesalahan secara elegan Anda harus melakukan penanganan eksepsi melalui blok try/catch. Eksepsi diwakili oleh class Exception dan subclassnya. Jika kesalahan terjadi di dalam blok try Anda dapat melemparkan sebuah eksepsi dan mengolahnya dalam blok catch .

Menjaga File yang Disertakan

Script PHP sering menyertakan file PHP lain yang berisi kode untuk hal-hal seperti koneksi ke database, dll. Beberapa pengembang memberikan file untuk disertakan dengan ekstensi seperti .inc. File dengan ekstensi ini tidak diurai oleh PHP secara default jika dipanggil secara langsung dan akan dianggap sebagai teks biasa kepada pengguna. Jika penyerang langsung mengakses include file yang berisi data penting pada database ia sekarang memiliki akses ke semua data aplikasi Anda. Selalu menggunakan ekstensi php. Untuk file kode yang disertakan dan menjaga mereka agar selalu di luar direktori yang secara langsung dapat diakses oleh pengguna.

Ringkasan

Dengan menjaga atas 8 poin itu menjadi memungkinkan untuk mengamankan aplikasi PHP untuk sebagian besarnya. Bagian terbaik sejauh ini adalah tidak percaya input pengguna, tetapi juga jangan lupa untuk menjaga sistem file Anda dan database juga.

Advertisements

About phpgeek programmer

pemimpi yang berharap menjadi the best programmer di zamannya

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