Php oturum kimliği ne kadar benzersiz


90

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:


39

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.


4
Birçok çarpışma vakası olan sitelerin raporlarını duydum.
ColinM

20
Soru yaklaşık 4 yıl önce soruldu. Oturum kimliği algoritmasının o zamandan beri doğaçlama
yapıp yapmadığını

@ColinM: ve bu siteler günde 1 milyon tekil ziyaretçiye sahipti.
e-satis

1
Açıkça şu anda temel alır (MD5 / SHA1 hash) kullanıcının uzak adresine, yerel saatine ve bazı rastgele sayılara (LCG) dayanır .
Caramiriel

2
Mobili kırmaya ihtiyacım yok, mobil sürekli kendini kırıyor. :)
hakre

67

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


1
Evet, düşman savaşçılara karşı son derece güvenli olması gereken bir web sitesi için sözleşme yaptığımda, aslında kendi oturum yöneticimi yarattım ve entropi verilerini doğrudan random.org'dan besledim. Ama bu sistemin Reqs farkla en ölümlüler / ;-) w başa ötesinde idi
Theodore R. Smith

1
@ Thomas-Jensen, gettimeofday olup bu usaniye (bazen) olarak ifade ediyor dışında unix zaman. Yukarıda bağlantısı verilen php_session_create_id yöntemini okuyun.
djsadinoff

4
Entropi uzunluğunun değiştirilmesi rastgeleliği iyileştirir, ancak hash hala aynı uzunlukta olduğundan bir çarpışma olasılığını önemli ölçüde etkilemez. Ancak, session.hash_function değiştirmek, örneğin sha512 gibi daha uzun karmalar kullanmanıza izin verir.
ColinM

2
Çarpışmalar olmasını tuhaf buluyorum. Elbette PHP, bu kimlik altında geçerli bir oturum olup olmadığını kontrol etmek ve ardından farklı bir kimlik oluşturmak için yapılmalıdır ..
Luke

1
@ theodore-r-smith, kamuya açık bir kaynaktan entropiyi almak gerçekten kötü bir uygulamadır. "Düşman savaşçılarınızın" da random.org'a erişebileceğini varsaymalısınız ...
avri

12

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):

  1. Müşterinin IP adresi
  2. Şimdiki zaman
  3. PHP Linear Congruence Generator - sözde rastgele sayı üreteci (PRNG)
  4. İşletim Sistemine özgü rastgele kaynak - İşletim sisteminin rastgele bir kaynağı varsa (ör. / Dev / urandom)

İş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:

  1. aynı değere sahip iki oturum kimliği oluşturma olasılığını en aza indirin
  2. rastgele anahtarlar oluşturmayı ve kullanımda olanı vurmayı hesaplama açısından çok zorlaştırır .

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.


11

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 .


2
Tam olarak belirtmek gerekirse, PHP 5.3 için "session.hash_function = sha512" ve 512bit karma değerine kadar ayarlayın. Bu hile yapmalı. Varsayılanlarla, yüksek trafikli sitelerde çarpışmalar yaygındır.
ColinM

5

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.


3
Ben matematikçi değilim, ama doğum günü problemini unuttuğunuzu düşünüyorum, bu yüzden hala küçükken çarpışma şansı önerdiğinizden çok daha fazla. Ayrıca, djsadinoff'un önerdiği gibi, PHP'nin varsayılan olarak rastgele sayılar üretmek için iyi bir yöntem kullanması gerekmez.
ColinM

Aslında tahmin geçerli değil. Yukarıdaki hesaplama basitleştirilmiş bir tahmindir, burada oturum_kimliği nr i için bir çarpışma olasılığının = 1/2 82 (1/2 olmalıdır yukarıda 92 olsa da = yazım hatası olmalıdır). Gerçekte, daha önceki çarpışmalar olmadığı sürece olasılık (i-1) / 2 128'dir. 1/2 92 yalnızca son session_id için tutulur.
MrJ

3

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


2
... ancak bir çok bankada sadece bir php sunucusu iseniz, sunucunun sesssionID'nin henüz kullanılıp kullanılmadığını bilmek için yeterli bilgiye sahip olacağının garantisi yoktur.
djsadinoff

Aynı oturum kimliğini 2 farklı php sunucusunda alırsam neden önemli olsun? 2 farklı etki alanı varsayıldığında, oturum çerezine yalnızca her etki alanından erişilebilir ...?
daremon

3
Çok sunuculu bir ortamda çiftleri önlemenin en kolay yolu, oturumları memcached oturum işleyicisi aracılığıyla memcached içinde depolamaktır. sorun çözüldü ve kullanıcılarınız, eşyalarını kaybetmeden farklı sunuculardan geri dönebilirler.
Theodore R. Smith

@daremon bir alan adı için birden fazla sunucudan bahsediyor.
gtd

Bu tamamen yanlıştır. PHP, yenilerini oluştururken mevcut oturum kimliklerini kontrol etmez. Herhangi bir PHP oturum işleyici koduna bakın ve bu amaç için uygulanan hiçbir yöntem yoktur.
ColinM

2

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.


2
Muhtemelen sunucu tarafı depolaması hiçbir şekilde benzersizliği garanti etmediği için. Benzersizlik bir şeydir - eğer bir çarpışma varsa, oturumun nerede saklandığına bakılmaksızın çarpışacaktır.

Benim tarafımdan değil, cevabınızı (ve diğerlerini) takdir ediyorum. - Jalov
Jalov

2
Oturum kimliği hem sunucu hem de istemci tarafında saklanır. Oturum içerikleri sunucu tarafında saklanır. Gerçek şu ki, oturum kimliğinin benzersizliğiyle pek ilgili değil.
YudhiWidyatama

0

Ç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.


Stackoverflow'a hoş geldiniz. Cevabınız maalesef soruyu cevaplamaya çalışmıyor. OP, oturum kimliğinin ne kadar benzersiz olduğunu sordu. Verileri veritabanında depolamak ve sonra onu almak için bir oturum değişkeni kullanmak, soruna yalnızca daha fazla karmaşıklık katar, değil mi?
Nuh Boegli

@NoahBoegli diğer çözümler çok daha karmaşık bir yöntem önerdi.
Pernicious

-4
<?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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.