Seberapa unik id sesi php? Saya mendapat kesan dari berbagai hal yang saya baca bahwa saya seharusnya tidak mengandalkan dua pengguna yang tidak pernah mendapatkan sessionid yang sama. Bukankah itu GUID?
90
Session_id memang bisa diduplikasi, tapi kemungkinannya sangat rendah. Jika Anda memiliki situs web dengan lalu lintas yang adil, itu mungkin terjadi sekali dalam kehidupan situs web Anda, dan hanya akan mengganggu satu pengguna untuk satu sesi.
Hal ini tidak perlu diperhatikan kecuali jika Anda berharap untuk membangun situs web dengan lalu lintas yang sangat tinggi atau layanan untuk industri bank.
Ini tidak terlalu unik saat dikirim. Dalam konfigurasi default, ini adalah hasil dari hash dari berbagai hal termasuk hasil gettimeofday (yang tidak terlalu unik), tetapi jika Anda khawatir, Anda harus mengkonfigurasinya untuk menarik beberapa entropi dari / dev / urandom, seperti itu
ini_set("session.entropy_file", "/dev/urandom"); ini_set("session.entropy_length", "512");
cari "php_session_create_id" di kode untuk algoritma sebenarnya yang mereka gunakan.
Diedit untuk menambahkan: Ada generator nomor acak DFA yang diunggulkan oleh pid, dicampur dengan waktu di usec. Ini bukan kondisi keunikan yang tegas terutama dari segi keamanan . Gunakan konfigurasi entropi di atas.
Memperbarui:
sumber
Jika Anda ingin tahu bagaimana PHP menghasilkan ID sesi secara default, periksa kode sumber di Github . Ini tentu saja tidak acak dan didasarkan pada hash (default: md5) dari bahan-bahan ini (lihat baris 310 potongan kode):
Jika OS memiliki sumber acak, maka kekuatan ID yang dihasilkan untuk tujuan menjadi ID sesi tinggi ( / dev / urandom dan sumber acak OS lainnya (biasanya) PRNG yang aman secara kriptografis ). Namun jika tidak, maka itu memuaskan.
Tujuan dengan pembuatan identifikasi sesi adalah untuk:
Ini dicapai dengan pendekatan PHP untuk pembuatan sesi.
Anda tidak dapat benar-benar menjamin keunikan , tetapi probabilitasnya sangat rendah untuk mencapai hash yang sama dua kali sehingga, secara umum, tidak perlu dikhawatirkan.
sumber
Anda dapat menginstal fungsi pembuatan hash alternatif jika Anda ingin menyesuaikan cara ID dibuat (ini adalah angka 128bit yang dihasilkan melalui MD5 secara default). Lihat http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function
Untuk informasi lebih lanjut tentang sesi PHP, coba artikel luar biasa ini http://shiflett.org/articles/the-truth-about-sessions yang juga menautkan ke artikel lain tentang fiksasi dan pembajakan sesi.
sumber
Size of session_id
Asumsikan seeion_id didistribusikan secara seragam dan memiliki size = 128 bits. Asumsikan bahwa setiap orang di planet ini log in sekali sehari dengan sesi baru yang terus-menerus selama 1000 tahun.
num_sesion_ids = 1000*365.25 *7*10**9 < 2**36 collission_prob < 1 - (1-1/2**82)**(2**36) ≈ 1 - e**-(1/2**46) ≈ 1/2**46
Jadi kemungkinan satu atau lebih tabrakan kurang dari satu dalam 70 ribu miliar. Karenanya ukuran 128-bit dari session_id harus cukup besar. Seperti yang disebutkan di komentar lain, session_manager mungkin juga memeriksa bahwa session_id baru belum ada.
Keacakan
Oleh karena itu, pertanyaan besar yang saya pikirkan adalah apakah session_id: s dihasilkan dengan keacakan semu yang baik. Tentang itu Anda tidak pernah bisa yakin, tetapi saya akan merekomendasikan menggunakan solusi standar yang terkenal, dan sering digunakan untuk tujuan ini (seperti yang mungkin sudah Anda lakukan).
Meskipun tabrakan dihindari karena pemeriksaan, keacakan dan ukuran session_id adalah penting, sehingga peretas tidak dapat, entah bagaimana, melakukan tebakan yang memenuhi syarat dan menemukan session_id: s aktif dengan probabilitas besar.
sumber
Saya belum menemukan konfirmasi tentang ini tetapi saya percaya php memeriksa apakah id sesi sudah ada sebelum membuatnya dengan id itu.
Masalah pembajakan sesi yang dikhawatirkan orang adalah ketika seseorang mengetahui id sesi dari pengguna aktif. Hal ini dapat dicegah dengan berbagai cara, untuk info lebih lanjut Anda dapat melihat halaman ini di php.net dan makalah tentang fiksasi sesi ini.
sumber
Tidak, id sesi bukan GUID, tetapi dua pengguna tidak boleh mendapatkan id sesi yang sama karena mereka disimpan di sisi server.
sumber
Anda dapat memilih untuk menyimpan berbagai sesi pada DB bersama dengan aa DB generate unique field; gabungkan keduanya dan simpan dalam variabel sesi, lalu periksa yang itu sebagai gantinya id sesi.
sumber
<?php session_start(); $_SESSION['username']="username"; ?> <!DOCTYPE html> <html> <head> <title>Update</title> </head> <body> <table border="2"> <tr> <th>Username</th> <th>Email</th> <th>Edit</th> </tr> <?php $conn=mysqli_connect("localhost","root","","telephasic"); $q2="select * from register where username = '".$_SESSION['username']."'"; $run=mysqli_query($conn, $q2); while($row=mysqli_fetch_array($run)) { $name=$row[1]; $email=$row[2]; ?> <tr> <td><?php echo $name; ?></td> <td><?php echo $email; ?></td> <td><a href="edit.php"> Edit </a></td> </tr> <?php } ?> </table> </body>
jika nama pengguna Anda berbeda atau unik, Anda dapat menggunakan kode ini untuk sesi
sumber