Php oturum kimliği ne kadar benzersiz? Okuduğum çeşitli şeylerden, iki kullanıcının asla aynı oturum kimliğini almadığına güvenmemem gerektiği izlenimini edindim. Bu bir GUID değil mi?
Yanıtlar:
Session_id gerçekten kopyalanabilir, ancak olasılık çok düşüktür. Adil bir trafiğe sahip bir web siteniz varsa, bu web sitesi yaşamınızda bir kez olabilir ve yalnızca bir kullanıcıyı bir oturum için rahatsız eder.
Çok yüksek trafikli bir web sitesi veya banka endüstrisi için bir hizmet oluşturmayı beklemediğiniz sürece bu umursamaya değmez.
Gönderildiği gibi çok benzersiz değil. Varsayılan yapılandırmada bu, gettimeofday'ın sonucu da dahil olmak üzere çeşitli şeylerin bir karmasının sonucudur (bu son derece benzersiz değildir), ancak endişeleniyorsanız, bunu / dev / urandom'dan biraz entropi çekecek şekilde yapılandırmalısınız.
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
Kullandıkları gerçek algoritmanın kodunda "php_session_create_id" için arama yapın .
Eklenecek şekilde düzenlendi: pid tarafından tohumlanan ve usec cinsinden zamanla karıştırılmış bir DFA rastgele sayı oluşturucu var. Özellikle güvenlik açısından kesin bir benzersizlik koşulu değil . Yukarıdaki entropi yapılandırmasını kullanın.
Güncelleme:
PHP 5.4.0'dan itibaren session.entropy_file öntanımlı olarak / dev / urandom veya mevcutsa / dev / arandom şeklindedir. PHP 5.3.0'da bu yönerge varsayılan olarak boş bırakılmıştır. PHP Kılavuzu
PHP'nin varsayılan olarak nasıl bir oturum kimliği oluşturduğunu öğrenmek istiyorsanız, Github'daki kaynak koduna bakın . Kesinlikle rastgele değildir ve bu bileşenlerin bir karmasına (varsayılan: md5) dayanır (kod parçacığının 310 satırına bakın):
İşletim sisteminin rastgele bir kaynağı mevcutsa, oluşturulan kimliğin oturum kimliği olma amacıyla gücü yüksektir ( / dev / urandom ve diğer işletim sistemi rastgele kaynakları (genellikle) kriptografik olarak güvenli PRNG'lerdir ). Ancak olmuyorsa tatmin edicidir.
Oturum tanımlama oluşturmanın amacı şudur:
Bu, PHP'nin oturum oluşturmaya yaklaşımı ile elde edilir.
Benzersizliği kesinlikle garanti edemezsiniz , ancak aynı hash'i iki kez vurma olasılığı o kadar düşüktür ki, genel olarak konuşursak, endişelenmeye değmez.
Kimliğin oluşturulma şeklini özelleştirmek istiyorsanız, alternatif bir karma oluşturma işlevi yükleyebilirsiniz (varsayılan olarak MD5 aracılığıyla oluşturulan 128 bitlik bir sayıdır). Bkz. Http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function
PHP oturumları hakkında daha fazla bilgi için, oturum sabitleme ve kaçırmayla ilgili diğer makalelere de bağlantı veren bu mükemmel makaleyi http://shiflett.org/articles/the-truth-about-sessions deneyin .
Session_id boyutları
bu seesion_id homojen olarak dağıtılır ve boyutu = 128 bit sahip olduğunu varsayalım. Gezegendeki herkesin 1000 yıl boyunca sürekli yeni bir oturumla günde bir kez oturum açtığını varsayın.
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
Yani bir veya daha fazla çarpışma olasılığı 70 bin milyarda birden az. Dolayısıyla, session_id'nin 128 bitlik boyutu yeterince büyük olmalıdır. Diğer yorumlarda belirtildiği gibi, session_manager ayrıca yeni session_id'nin halihazırda var olmadığını kontrol edebilir.
Rastgelelik
Bu nedenle, bence en büyük soru, session_id: lerin iyi sözde rastgelelikle oluşturulup oluşturulmadığıdır. Bundan asla emin olamazsınız, ancak bu amaç için iyi bilinen ve sıklıkla kullanılan standart bir çözümü kullanmanızı tavsiye ederim (muhtemelen zaten yaptığınız gibi).
Kontrol, rastlantısallık ve oturum_kimliği nedeniyle çarpışmalardan kaçınılsa bile, bilgisayar korsanlarının yapamayacağı şekilde, bir şekilde nitelikli tahminler yapın ve büyük olasılıkla etkin oturum kimlikleri bulun.
Bununla ilgili bir onay bulamadım, ancak php'nin bu kimlik ile bir tane oluşturmadan önce bir oturum kimliği zaten var olup olmadığını kontrol ettiğine inanıyorum.
İnsanların endişelendiği oturum kaçırma sorunu, birisinin aktif bir kullanıcının oturum kimliğini bulmasıdır. Bu, birçok şekilde önlenebilir, bu sayfayı php.net'te ve bu makaleyi oturum sabitleme konusunda görebileceğiniz hakkında daha fazla bilgi için
Hayır, oturum kimliği bir GUID değildir, ancak iki kullanıcı sunucu tarafında depolandıkları gibi aynı oturum kimliğini almamalıdır.
Çeşitli oturumları DB'de depolamayı ve bir DB benzersiz alan oluşturmayı seçebilirsiniz; ikisini birleştirin ve bir oturum değişkenine kaydedin, ardından bunun yerine oturum kimliğini kontrol edin.
<?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>
kullanıcı adınız farklı veya benzersizse oturum için bu kodu kullanabilirsiniz