PHP Session Keamanan

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!

Larutan

Ada beberapa hal yang harus dilakukan dalam rangka untuk menjaga sesi anda aman:

  1. Menggunakan SSL ketika otentikasi pengguna atau melakukan operasi sensitif.
  2. Regenerasi session id kapanpun keamanan tingkat perubahan (seperti masuk). Anda bahkan dapat menumbuhkan id sesi setiap permintaan anda jika anda inginkan.
  3. Memiliki sesi waktu
  4. Don't menggunakan register globals
  5. Toko rincian otentikasi pada server. Artinya, don't mengirim rincian seperti nama pengguna dalam cookie.
  6. Periksa $_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).
  7. Mengunci akses ke sesi pada sistem file atau gunakan kustom sesi penanganan
  8. Untuk operasi sensitif mempertimbangkan memerlukan login pengguna untuk memberikan mereka authenication detail lagi
Komentar (12)

Salah satu pedoman adalah untuk memanggil session_regenerate_id setiap kali sesi's tingkat keamanan perubahan. Ini membantu mencegah pembajakan sesi.

Komentar (0)

Saya dua (atau lebih) sen:

  • Percaya tidak ada
  • Filter input, melarikan diri output (cookie, session data yang anda masukan juga)
  • Hindari XSS (menjaga HTML anda terbentuk dengan baik, lihatlah PHPTAL atau HTMLPurifier)
  • Pertahanan di kedalaman
  • Jangan memaparkan data

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

Komentar (1)

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');
Komentar (3)

Sesi ini fiksasi kertas telah sangat baik pointer di mana serangan yang mungkin datang. Lihat juga sesi fiksasi halaman di Wikipedia.

Komentar (0)

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.

Komentar (0)

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache menambahkan header:

X-XSS-Protection    1
Komentar (3)

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().

Komentar (0)

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.

Komentar (0)

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();     
}
Komentar (0)

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.

Komentar (0)

Aku akan memeriksa kedua IP dan User Agent untuk melihat jika mereka mengubah

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Komentar (6)

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.

Komentar (0)