Apa adalah beberapa panduan untuk menjaga bertanggung jawab sesi keamanan dengan PHP? Ada's informasi di seluruh web dan it's tentang waktu itu semua mendarat di satu tempat!
Ada beberapa hal yang harus dilakukan dalam rangka untuk menjaga sesi anda aman:
$_SERVER['HTTP_USER_AGENT']
. Ini menambahkan penghalang kecil untuk sesi pembajakan. Anda juga dapat memeriksa alamat IP. Tetapi hal ini menyebabkan masalah bagi pengguna yang telah mengubah alamat IP karena load balancing beberapa sambungan internet dll (yang terjadi di lingkungan kita di sini).Salah satu pedoman adalah untuk memanggil session_regenerate_id setiap kali sesi's tingkat keamanan perubahan. Ini membantu mencegah pembajakan sesi.
Saya dua (atau lebih) sen:
Ada yang kecil tapi baik buku tentang topik ini: PHP Penting Keamanan oleh Chris Shiflett.
Pada halaman awal dari buku ini, anda akan menemukan beberapa kode contoh dan sampel bab.
Anda dapat menggunakan teknik yang disebutkan di atas (IP & UserAgent), dijelaskan berikut ini: Cara untuk menghindari pencurian identitas
Saya pikir salah satu masalah utama (yang sedang dibahas dalam PHP 6) adalah register_globals. Sekarang salah satu dari metode standar yang digunakan untuk menghindari register_globals
adalah dengan menggunakan $_REQUEST
, $_GET atau$_POST
array.
"benar" cara untuk melakukan itu (seperti 5.2, meskipun itu's sedikit buggy ada, tapi stabil dari 6, yang akan datang) adalah melalui filter.
Jadi bukan:
$username = $_POST["username"];
anda akan melakukan:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
atau bahkan hanya:
$username = filter_input(INPUT_POST, 'username');
Sesi ini fiksasi kertas telah sangat baik pointer di mana serangan yang mungkin datang. Lihat juga sesi fiksasi halaman di Wikipedia.
Menggunakan alamat IP isn't benar-benar ide yang terbaik dalam pengalaman saya. Misalnya; kantor saya memiliki dua alamat IP yang bisa digunakan tergantung pada beban dan kita terus-menerus mengalami masalah menggunakan alamat IP.
Sebaliknya, saya've memilih untuk menyimpan sesi dalam database yang terpisah untuk domain pada server saya. Dengan cara ini tidak ada pada sistem file yang memiliki akses ke informasi sesi. Ini benar-benar membantu dengan phpBB sebelum 3.0 (mereka've karena tetap ini) tapi itu's masih ide yang baik saya pikir.
Hal ini cukup sepele dan jelas, tetapi pastikan untuk session_destroy setelah setiap penggunaan. Ini bisa sulit untuk menerapkan jika pengguna tidak log out secara eksplisit, sehingga timer dapat diatur untuk melakukan ini.
Berikut ini adalah sebuah tutorial pada setTimer() dan clearTimer().
Masalah utama dengan sesi PHP dan keamanan (selain pembajakan sesi) datang dengan apa lingkungan anda. Secara default PHP toko sesi data dalam sebuah file di OS's direktori temp. Tanpa pemikiran atau perencanaan ini adalah dunia yang dibaca direktori sehingga semua sesi anda informasi publik kepada siapa pun dengan akses ke server.
Sedangkan untuk menjaga sesi selama beberapa server. Pada saat itu akan lebih baik untuk beralih PHP untuk pengguna ditangani sesi di mana itu panggilan anda disediakan fungsi untuk CRUD (create, read, update, delete) data sesi. Pada saat itu anda bisa menyimpan sesi informasi dalam sebuah database atau memcache seperti solusi agar semua aplikasi server memiliki akses ke data.
Menyimpan anda sendiri sesi juga dapat menguntungkan jika anda berada pada server bersama karena ini akan membiarkan anda menyimpannya di database yang anda sering kali memiliki lebih banyak kontrol atas maka filesystem.
Saya set sesi seperti ini-
pada halaman login:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(kalimat yang didefinisikan pada konfigurasi halaman)
kemudian pada header yang sepanjang sisa dari situs:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
Jika anda menggunakan session_set_save_handler() anda dapat mengatur sesi anda sendiri handler. Misalnya anda bisa menyimpan sesi dalam database. Lihat php.net komentar untuk contoh database session handler.
DB sesi juga baik jika anda memiliki beberapa server sebaliknya jika anda menggunakan file berbasis sesi, anda akan perlu untuk memastikan bahwa setiap webserver memiliki akses ke filesystem yang sama untuk membaca/menulis sesi.
Yang perlu anda pastikan data sesi yang aman. Dengan melihat pada php anda.ini atau menggunakan phpinfo() anda dapat menemukan setelan sesi. _session.savepath memberitahu anda di mana mereka disimpan.
Periksa izin dari folder dan dari orang tua. Seharusnya't umum (/tmp) atau dapat diakses oleh situs-situs lain pada server bersama.
Dengan asumsi anda masih ingin menggunakan php session, Anda dapat mengatur php untuk menggunakan folder lain dengan mengubah _session.savepath atau menyimpan data di database dengan mengubah _session.savehandler .
Anda mungkin dapat mengatur _session.savepath di php.ini (beberapa penyedia memungkinkan) atau untuk apache + mod_php, dalam .file htaccess di root folder situs anda:
php_value sesi.save_path "/home/contoh.com/html/sesi"
. Anda juga dapat mengaturnya pada waktu berjalan dengan _session_savepath() .
Check Chris Shiflett's tutorial atau Zend_Session_SaveHandler_DbTable untuk mengatur dan alternatif sesi handler.