Apa saja pedoman untuk menjaga keamanan sesi yang bertanggung jawab dengan PHP? Ada informasi di seluruh web dan sudah waktunya semuanya mendarat di satu tempat!
Apa saja pedoman untuk menjaga keamanan sesi yang bertanggung jawab dengan PHP? Ada informasi di seluruh web dan sudah waktunya semuanya mendarat di satu tempat!
Jawaban:
Ada beberapa hal yang harus dilakukan untuk menjaga keamanan sesi Anda:
$_SERVER['HTTP_USER_AGENT']
. Ini menambah penghalang kecil untuk pembajakan sesi. Anda juga dapat memeriksa alamat IP. Tapi ini menyebabkan masalah bagi pengguna yang mengubah alamat IP karena load balancing pada beberapa koneksi internet dll (yang terjadi di lingkungan kita di sini).Satu pedoman adalah memanggil session_regenerate_id setiap kali tingkat keamanan sesi berubah. Ini membantu mencegah pembajakan sesi.
Dua (atau lebih) sen saya:
Ada sebuah buku kecil tapi bagus tentang topik ini: Essential PHP Security oleh Chris Shiflett .
Essential PHP Security http://shiflett.org/images/essential-php-security-small.png
Di halaman beranda buku Anda akan menemukan beberapa contoh kode menarik dan bab-bab sampel.
Anda dapat menggunakan teknik yang disebutkan di atas (IP & UserAgent), yang dijelaskan di sini: Cara menghindari pencurian identitas
Saya pikir salah satu masalah utama (yang sedang dibahas di PHP 6) adalah register_globals. Saat ini salah satu metode standar yang digunakan untuk menghindari register_globals
adalah menggunakan $_REQUEST
, $_GET
atau $_POST
array.
Cara yang "benar" untuk melakukannya (pada 5.2, meskipun ada sedikit buggy di sana, tetapi stabil pada 6, yang akan segera hadir) adalah melalui filter .
Jadi alih-alih:
$username = $_POST["username"];
Anda akan melakukan:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
atau bahkan hanya:
$username = filter_input(INPUT_POST, 'username');
Makalah fiksasi sesi ini memiliki petunjuk yang sangat baik di mana serangan mungkin datang. Lihat juga halaman fiksasi sesi di Wikipedia .
Menggunakan alamat IP sebenarnya bukan ide terbaik dalam pengalaman saya. Sebagai contoh; kantor saya memiliki dua alamat IP yang digunakan tergantung pada beban dan kami terus mengalami masalah dengan menggunakan alamat IP.
Sebagai gantinya, saya memilih untuk menyimpan sesi dalam database terpisah untuk domain di server saya. Dengan cara ini, tidak ada seorang pun di sistem file yang memiliki akses ke info sesi itu. Ini sangat membantu dengan phpBB sebelum 3.0 (mereka sudah memperbaikinya) tetapi saya kira itu adalah ide yang bagus.
Ini cukup sepele dan jelas, tetapi pastikan untuk session_destroy setelah setiap kali digunakan. Ini bisa sulit untuk diterapkan jika pengguna tidak keluar secara eksplisit, sehingga timer dapat diatur untuk melakukan ini.
Berikut ini adalah tutorial yang bagus tentang setTimer () dan clearTimer ().
Masalah utama dengan sesi PHP dan keamanan (selain pembajakan sesi) hadir dengan lingkungan tempat Anda berada. Secara default, PHP menyimpan data sesi dalam file di direktori temp OS. Tanpa pemikiran atau perencanaan khusus, ini adalah direktori yang dapat dibaca dunia sehingga semua informasi sesi Anda bersifat publik bagi siapa saja yang memiliki akses ke server.
Adapun untuk mempertahankan sesi melalui beberapa server. Pada titik itu akan lebih baik untuk beralih PHP ke sesi yang ditangani pengguna di mana ia memanggil fungsi yang disediakan untuk CRUD (membuat, membaca, memperbarui, menghapus) data sesi. Pada titik itu Anda dapat menyimpan informasi sesi dalam database atau solusi seperti memcache sehingga semua server aplikasi memiliki akses ke data.
Menyimpan sesi Anda sendiri mungkin juga menguntungkan jika Anda berada di server bersama karena itu akan membiarkan Anda menyimpannya di database yang Anda sering kali memiliki kontrol lebih besar daripada sistem file.
Saya mengatur sesi saya seperti ini-
di halaman login:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(frasa yang ditentukan pada halaman konfigurasi)
lalu pada tajuk yang ada di seluruh situs:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
itu tidak terlalu berguna sama sekali. Bahkan, algoritma perlindungan itu sendiri sebenarnya bisa dieksploitasi, membuatnya lebih buruk dari sebelumnya.
Saya akan memeriksa IP dan User Agent untuk melihat apakah mereka berubah
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
Jika Anda menggunakan session_set_save_handler () Anda dapat mengatur pengendali sesi Anda sendiri. Misalnya Anda bisa menyimpan sesi Anda di database. Lihat komentar php.net untuk contoh-contoh penangan sesi basis data.
Sesi DB juga bagus jika Anda memiliki beberapa server sebaliknya jika Anda menggunakan sesi berbasis file, Anda perlu memastikan bahwa setiap server web memiliki akses ke sistem file yang sama untuk membaca / menulis sesi.
Anda harus yakin bahwa data sesi aman. Dengan melihat php.ini Anda atau menggunakan phpinfo (), Anda dapat menemukan pengaturan sesi Anda. _session.save_path_ memberi tahu Anda di mana mereka disimpan.
Periksa izin folder dan orang tuanya. Itu tidak boleh publik (/ tmp) atau dapat diakses oleh situs web lain di server bersama Anda.
Dengan asumsi Anda masih ingin menggunakan sesi php, Anda dapat mengatur php untuk menggunakan folder lain dengan mengubah _session.save_path_ atau menyimpan data dalam database dengan mengubah _session.save_handler_.
Anda mungkin dapat mengatur _session.save_path_ di php.ini Anda (beberapa penyedia memungkinkan) atau untuk apache + mod_php, dalam file .htaccess di folder root situs Anda:
php_value session.save_path "/home/example.com/html/session"
. Anda juga dapat mengaturnya pada saat dijalankan dengan _session_save_path () _.
Lihat tutorial Chris Shiflett atau Zend_Session_SaveHandler_DbTable untuk mengatur dan penangan sesi alternatif.