Nasıl PHP web sitesinde birden fazla giriş önlemek için

6 Cevap php

Ben bir php uygulaması birden fazla giriş önlemek istiyoruz.

Öncelikle, ben bir kullanıcı tabloda giriş durumunu (aktif, notactive) oluşturun.

Kullanıcı statüsünde kullanıcı A günlükleri 'etkin' ayarlanır, ve kullanıcı oturum eğer durum 'notactive' ayarlandığında ne zaman. Başka bir istemci aynı kullanıcı acount kullanarak giriş trys zaman, ben kullanıcı tablosunu kontrol. Kullanıcı hala aktif ise hata giriş kullanıcıya gönderilir.

Sorun kullanıcı tarayıcılarla kullanıcı tabloda durumunu kapatır kullanıcı logout tıklayın yoktu çünkü güncelleme olabilir, oluştu.

Bu konuda herhangi bir öneriniz var mı?

6 Cevap

Bunun yerine kullanıcı hareketsiz \ etkin olup olmadığını saklamak, bir işlem başına bazında kullanıcıya karşı kontrol edilebilir bazı özellik depolamak için daha iyidir; kullanıcı kimlik doğrulaması gerektiren bir şey yapmaya çalışır, her zaman olduğu gibi, o devam önce bu nitelik eşleştiğini görmek için kontrol eder.

Ben size şu tavsiye ederiz;

Birincisi, onlar bir sha1 of time() çarpışmaları önlemek için yeterli olacağını hayal ediyorum oturum açtığınızda benzersiz kullanıcıyı tanımlamak için bir karma oluşturmak. Seçtiğiniz ne olursa olsun, bu farklı değil gibi (örneğin, IP adresi ya da tarayıcınızın user-agent karma yok oturum başka bir kullanıcı aynı karma alma inanılmaz derecede düşük bir şans olacak ki yeterince zengindir emin olun yeterli).

Ikinci; karma farklı olması gerektiği gibi, kendi veritabanı ve kullanıcının session Aksi içeri günlüğün zamanda etkili bir 'dışarı log' olacak önceki kullanıcı bu karma saklamak birisi oturum açtığında her zaman

Biz oturumları kullanıyorsanız bu yana, bir çerez otomatik olarak kendi oturum verilerine kullanıcıyı tanımlayan benzersiz bir kimliği içerecek kullanıcının tarayıcısında konulmalıdır. Çerez içeriği endişe gerçekten değildir.

Sonraki, kullanıcı kimlik doğrulaması sağlamak için her komut dosyası başında adı verilecek authenticateUser() veya benzer adlı bir işlev oluşturun. Bu script kullanıcının kimliği ile bir kullanıcının kullanıcı karma eşleşen bir karma olup olmadığını görmek için kontrol, veritabanını sorgulamak gerekir.

Örneğin

function authenticateUser($id, $hash, $databaseLink) {
    # SQL
    $sql = 'SELECT EXISTS(
               SELECT 1
               FROM `tbl_users`
               WHERE `id` = \''.mysql_real_escape_string($id).'\'
               AND `has`h = \''.mysql_real_escape_string($hash).'\'
               LIMIT 1
           );';

    # Run Query
    if ($query = mysql_query($sql, $databaseLink)) {
        # Get the first row of the results
        # Assuming 'id' is your primary key, there
        # should only ever be one row anyway.       
        $result = mysql_fetch_row($query);

        # Casting to boolean isn't strictly necessary here
        # its included to indicate the mysql result should
        # only ever been 1 or 0.
        return (bool)($result[0]);
    } else {
        # Query error :(
        return false;
    }
}

Sonra biz sadece sizden bir veritabanı bağlantısı için ((sizin oturum başına veri) authenticateUser() kullanıcının ID, hash geçmek ve bir database link ) daha önce açılmış olması gerekir.

authenticateUser() döner true, kullanıcı kimlik doğrulaması ise. false, kullanıcı değil VEYA veritabanı kullanılamaz veya bir SQL hata varsa.

Bir veritabanı istek sayfası istek başına bir kez gönderilir gibi, bu sunucu yükü artacak ancak lütfen unutmayın. Bu binlerce insan herhangi bir zamanda giriş olan dev projeler üzerinde bunu yapmak için muhtemelen tüm bu akıllıca değil. Birisi iyileştirmeler önermek eminim.

Çerezleri asla güvenme gibi Ayrıca, süresi dolmak üzere çerez bekliyor, oturum etkin olmuştur insanları zorlamak için en iyi yol değildir. Bunun yerine, kullanıcı kimlik doğrulaması her zaman güncelleyebilirsiniz last_active adında bir sütun ekleyebilirsiniz. Bu da sunucu yük artacak, ancak el, diyelim ki, 3 saat etkin olan kullanıcılar için hash kaldırarak bayat log-in geçersiz sağlayacaktır.

Sadece en son kullanıcı oturum böylece sizin modeli değiştirmek olabilir

Onlar etkin bir şekilde çıkıyor, herhangi bir anda mevcut oturum çökertebilir ikinci kez giriş yaptığınızda, her kullanıcı için görülen en son session id kayıt yaparsanız.

Normal bir kullanıcı için, şeyler "sadece çalışmak" görünür. Onların giriş kimlik bilgilerini dağıtmasını "anormal" kullanıcıların önlemek isteyen ediyorsanız, bu bir engel olarak hizmet etmelidir.

What you should do is check on whether they have been active the last several minutes when trying to login. This could be done with a lastonline stamp and should be set on every page request in the user table.

Kullanıcı son 15 dakika aktif olsaydı, oturum açarken, kontrol edebilir javascript ile yapılabilir değilse. Eğer değilse, yeni kullanıcı olarak giriş yapabilirsiniz.

Ayrıca javascript ile yapabiliriz. Her dakika ya da öylesine patlar bir ajax arama yapın.

<script>
setInterval(function() {
  // do the ajax call
}, 60000);
</script>

Let this call go to a script that will edit the lastonline stamp in the user db. When trying to login you check the user db if the lastonline stamp has exceeded the minute and you have your check if you may login. This will help when you are on the page but you are not active the last 15 minutes and you do not want somebody else to login.

Sen benzersiz bir kimlik oluşturmak ve bir veritabanında o saklamak gerekir. Ne yaptım da oluşturmak oldu. Ben bir oturum değişkeni birini saklamak ve çoklu giriş önlemek için bir veritabanında oturum ele ve başka önlemek için kullanabilirsiniz. Aşağıdaki kodu benzersiz kimliği oluşturmak olacaktır:

$unique_id = sha1('xzr4'.gethostbyaddr($_SERVER['REMOTE_ADDR']).$random_string.$_SERVER['HTTP_USER_AGENT'].'f8k2');

Benzersiz kimlik uymuyorsa, sadece kullanıcı oturumunu.

Kullanıcı giriş izlemek için istemci tarafı javascript kullanarak güvenilmez.

Sadece db bir LastLoginDate alanı oluşturma ve kullanıcı son giriş damgası ile güncelleyerek aynı sonucu elde edebilirsiniz.

Şimdi () ise her giriş denemesinde, - $ LastLoginDate> predefined_timeout, sonra yeni oturum kabul etmelidir, aksi takdirde bunu reddediyorum.

İşte doesn't sabiti database access çalışma gerektiren bir çözüm ...

(Hangi db / sunucu stres giderici, veritabanı değeri karşı) (session_id kontrol etmek için bir sayfayı yenileyin / istemek her zaman gereksinimi önlemek olacaktır) ...

1. giriş, bu kullanıcı için DB saklanan önceden varolan session_id kapmak ve bunu:

session_id("the pre-existing session id in the database goes here");
session_start();
session_destroy();

2. Sonra yeni bir oturum başlatmak ve bir önceki üzerine yazarak, veritabanına bu yeni session_id kaydedin. (Etkili bu hesabı kullanarak diğer adam çıkıyor) aktif bir varsa bu kullanıcı önceki oturumu çıkış olacaktır.

Bir deneyin ve hile yaparsa bana bildirin!

NOT: Ben henüz denemedim gibi bu "teoride" dir. Bu accepted stackoverflow answer dayanıyor.