Kapan dan mengapa saya harus menggunakan session_regenerate_id ()?

95

Mengapa dan kapan saya harus menggunakan session_regenerate_id()fungsi di php? Haruskah saya selalu menggunakannya setelah saya menggunakan session_start()? Saya telah membaca bahwa saya harus menggunakannya untuk mencegah fiksasi sesi, apakah ini satu-satunya alasan?

rvandoni.dll
sumber
karena setelah sesi dimulai, dibuat dan di halaman lain saat Anda memulai sesi, variabel-variabelnya ada: -
HaRsH
@HaRH Oo? Session_regenerate_id menghapus ID sesi lama, dan membuat yang baru untuk menghindari pembajakan sesi dengan XSS misalnya. Itu tidak mempengaruhi visibilitas variabel SESSION di dokumen lain.
Xatenev
ya saya tahu bahwa saya tidak berpengaruh pada variabel lain tetapi jika Anda tidak memulai sesi di halaman sana variabel tidak ada di halaman itu di php inti
HaRsH
1
Tapi ini tentang session_regenerate_id, bukan tentang session_start ...
Xatenev
1
Saya sarankan membaca RFC yang diusulkan: wiki.php.net/rfc/precise_session_management
jankal

Jawaban:

96

Apa session_regenerate_id()?

Seperti namanya fungsi, ini adalah fungsi yang akan menggantikan ID sesi saat ini dengan yang baru, dan menyimpan informasi sesi saat ini.

Apa fungsinya?

Ini terutama membantu mencegah serangan fiksasi sesi. Serangan fiksasi sesi adalah saat pengguna jahat mencoba mengeksploitasi kerentanan dalam sistem untuk menetapkan (mengatur) ID sesi (SID) pengguna lain. Dengan demikian, mereka akan mendapatkan akses penuh sebagai pengguna asli dan dapat melakukan tugas-tugas yang seharusnya memerlukan otentikasi.

Untuk mencegah serangan tersebut, tetapkan pengguna ID sesi baru yang digunakan session_regenerate_id()saat dia berhasil masuk (atau untuk setiap permintaan X). Sekarang hanya dia yang memiliki ID sesi, dan ID sesi lama (terpaku) Anda tidak lagi valid.

Kapan saya harus menggunakan session_regenerate_id()?

Seperti yang ditunjukkan oleh symbecean pada komentar di bawah, id sesi harus diubah pada setiap transisi dalam status otentikasi dan hanya pada transisi otentikasi.

Bacaan lebih lanjut:

Amal Murali
sumber
2
Dan apa yang ditambahkan jika peretas melakukan panggilan ke-20? ID Sesi diubah dan dia adalah satu-satunya yang memiliki sesi;))
fred727
@ fred727 Jika peretas cukup beruntung untuk melakukan panggilan ke-20, maka pengguna akan memiliki id yang tidak valid dan tidak lagi diautentikasi. Tanpa regenerasi sama sekali, baik peretas maupun pengguna akan diautentikasi.
Bradmage
mungkin juga berguna untuk memanggil session_regenerate_id saat menyimpan info sensitif dalam sesi (jadi tidak hanya pada tansitions otentikasi)
Adam
Apakah mungkin untuk memperbaiki sesi jika info sesi tidak ada dalam cookie? Saya menyimpan info sesi dalam file di server saya, apakah ID perlu dibuat ulang?
Gonzalo
"untuk memfiksasi (menetapkan) ID sesi (SID) pengguna lain" .... ini harus diganti dengan "untuk memfiksasi (menetapkan) ID sesi (SID) di komputer pengguna lain, kemudian menggunakannya setelah dia mengautentikasinya "
Akuntan م
25

Anda harus menggunakan session_regenerate_id()untuk menghentikan pembajakan sesi dan fiksasi sesi .

Dari jawaban Security.SE ini :

Pembajakan sesi mengacu pada mencuri cookie sesi. Ini dapat dilakukan dengan paling mudah saat berbagi jaringan lokal dengan komputer lain. Misal di Starbucks. Contoh ... pengguna dengan sesi Y sedang menjelajahi situs web James di Starbucks. Saya mendengarkan lalu lintas jaringan mereka, menyesap latte saya. Saya membawa pengguna dengan cookie sesi Y untuk situs web James dan mengatur browser saya untuk menggunakannya. Sekarang ketika saya mengakses situs James, situs James.

Dari halaman web ini :

Session Fixation adalah teknik serangan yang memaksa ID sesi pengguna ke nilai eksplisit. Bergantung pada fungsionalitas situs web target, sejumlah teknik dapat digunakan untuk "memperbaiki" nilai ID sesi. Teknik ini berkisar dari eksploitasi Cross-site Scripting hingga membumbui situs web dengan permintaan HTTP yang dibuat sebelumnya. Setelah ID sesi pengguna diperbaiki, penyerang akan menunggu pengguna tersebut untuk masuk. Setelah pengguna melakukannya, penyerang menggunakan nilai ID sesi yang telah ditentukan sebelumnya untuk menggunakan identitas online yang sama.

Kapan Menggunakan

Saat pengguna mengedit / memperbarui beberapa input penting (mengubah sandi, kredensial, lupa sandi, dll.) Yang dapat membahayakan keamanan situs atau kebijakan privasi.

Lihat juga:

Panduan Keamanan PHP: Sesi

Fiksasi Sesi (Bacaan bagus)

Dimag Kharab
sumber
22

Saya pikir masalah keracunan sesi telah dibahas dengan cukup baik.

Untuk menjawab pertanyaan "Kapan saya harus menggunakan ini?" bagian, penting untuk mundur dan mempertimbangkan apa yang aplikasi Anda lakukan dengan sesi tersebut. Atau, dengan kata lain, ini adalah pertanyaan keamanan utama yang perlu Anda jawab

Jika seseorang mengikuti sesi ini, apa yang akan mereka peroleh?

Jika yang Anda lakukan hanyalah melacak data anonim (pengguna datang ke situs dan Anda menggunakannya untuk melacak kunjungan mereka) maka ada sedikit alasan untuk membuat ulang sesi. Seorang pembajak tidak akan mendapatkan apa pun yang berharga dengan mengambil sesi itu.

Namun, banyak situs menawarkan login. Sebuah login mengubah banyak hal. Saya dapat mengakses profil saya. Saya dapat mengubah pengaturan. Jadi pembajak mungkin menginginkan akses akun saya, terutama jika pengguna normal dan admin semua menggunakan sesi untuk mengelola login. Jadi, ketika orang datang ke situs saya dan masuk, saya membuat ulang sesi. Ini menambahkan lapisan keamanan ekstra yang kecil kemungkinannya bagi pengguna saya yang baru masuk untuk dibajak.

Setiap kali kami menambahkan data penting ke sesi, Anda harus mempertimbangkan untuk membuat ulang ID sesi. Jika Anda perlu memperkuat aplikasi Anda terhadap fiksasi maka regenerasi acak dapat berguna tetapi saya TIDAK PERNAH membuat ulang pada setiap permintaan. Secara default PHP menyimpan sesi dalam file di disk lokal. Anda menambahkan banyak disk I / O untuk mengurangi vektor serangan yang relatif kecil. Jika Anda benar-benar membutuhkan lebih banyak keamanan, saya akan menganjurkan menggunakan HTTPS penuh daripada regenerasi secara teratur (HTTPS membuat fiksasi sangat sulit dilakukan).

Machavity
sumber
2
HTTPS tidak mengubah apa pun pada fiksasi.
kelunik
4
Tapi itu membuat serangan sniffing lebih sulit yang bisa digunakan untuk mendapatkan id sesi sejak awal.
demonkoryu
aplikasi php saya keluar dalam beberapa detik, saya menggunakan regenerasi, apakah ada batasan file sesi yang dapat dibuat atau adakah batasan pada id yang dibuat ulang yang dapat menyebabkan keluar?
sqlchild
Tidak secara umum, tidak. Anda mungkin ingin memposting pertanyaan terpisah tentang itu
Machavity
17

Mengapa saya harus menggunakan session_regenerate_id?

Anda harus menggunakannya untuk mencegah fiksasi sesi .

Kapan saya harus menggunakan session_regenerate_id?

Setiap kali status otentikasi berubah, itu terutama saat masuk dan keluar.

Contoh

Bob duduk di depan komputer umum dan dengan menjelajahi stackoverflow.com dia membuka sesi baru di sana. ID sesi disimpan dalam cookie (dengan httpOnlybendera untuk mencegah akses melalui javascript). Bayangkan Stack Overflow memiliki HTTPS yang selalu aktif dan juga secureflag yang disetel untuk cookie.

Bagaimana kita bisa mencuri sesi itu sekarang?

Bob menuliskan ID sesi. Dia meninggalkan komputer tanpa menutup browser. Sekarang Alice datang ke komputer ini dan melihat Stack Overflow sudah dimuat. Dia masuk sekarang.

Sekarang kami berada pada tahap di mana Anda harus menggunakan session_regenerate_id. Jika Anda tidak membuat ID sesi baru di sini selama login, Bob dapat menggunakan sesi sebelumnya yang dia tulis untuk mengakses sesi Alice dan akan login sebagai Alice sekarang.

kelunik
sumber
Tetapi sampai saat itu session_regenerate_id()dikeluarkan, Alice dapat mengakses akun bobs? Apakah itu benar?
Akam
2
@akam - Sudah terlambat, tapi pantas untuk ditanggapi ... 1. Bob tidak keluar, Alice dapat menggunakan loginnya - 2. Bob keluar, Alice tidak masuk, Alice dapat menggunakan ID sesinya, tetapi tidak ada login aktif untuk mengakses datanya - 3. Bob log out, Alice login, Bob menggunakan ID sesi, ada login aktif, Bob mengakses data Alice. Tetapi untuk lebih spesifik: bergantung pada keamanan skrip, ID sesi tidak selalu berarti Anda dapat mengakses data pengguna yang telah keluar, tetapi secara umum hal itu mungkin dan berisiko tinggi.
codekandis
15

Anda dapat menggunakannya untuk keamanan yang lebih baik.

Dengan cara ini Anda membuat id sesi untuk satu kali penggunaan.

Katakanlah id sesi pengguna Anda adalah = 3

Beberapa peretas meretas klien Anda dan mendapatkan session_id mereka. Jadi peretas dapat menggunakan cookie itu untuk menggunakan sesi mereka.

Jika Anda memiliki kode suka

session_start();
session_regenerate_id();

Anda dapat mengubah sesinya setiap kali mereka menggunakan situs web Anda.

Sekarang hacker mendapatkan sessionid = 3

tetapi Anda telah mengubah sesi setelah dia menggunakannya jadi milik Anda

pengguna memiliki sessionid = 4 // auth

peretas memiliki sesi = 3 // null

Tetapi ada sedikit gunanya katakanlah Anda menggunakan metode regenerasi dan klien Anda hanya masuk ke situs web dan menutup browser atau tidak aktif. Klien Anda memiliki sessionid = 4 dan jika peretas mendapatkan cookie di bagian itu, mereka akan memiliki sessionid yang sama.

Seperti yang dijelaskan di atas, cara ini Anda dapat melindungi klien Anda dari data sniffing dengan satu cara, tetapi tetap saja tidak akan memperbaiki masalah ini untuk selamanya.

Tapi itu akan jauh lebih aman jika Anda menggunakan SSL enc.

Maaf untuk bahasa Inggris yang buruk.

Hasan Veli Soyalan
sumber
12

Kasus penggunaan sederhana:

// User visits a webshop
$shopcart = new Cart();

Sesi dimulai dan entri dibuat dalam database. Gerobak pengguna diidentifikasi oleh id sesinya.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

Untuk setiap produk yang ditambahkan, catatan dibuat di tabel gerobak toko saya. Juga diidentifikasi oleh id sesi.

// User saves cart in order to use it later
$shopcart->save();

Pengguna memutuskan untuk menyimpan gerobaknya. Sekarang sedang dilampirkan ke id penggunanya.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

Id sesssion dibuat ulang dan pengguna sekarang dapat memulai kembali membuat kereta toko lain.

Peter
sumber
4

session_regenerate_id (): Tidak dapat membuat ulang id sesi - sesi tidak aktif

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Anton
sumber