v2.5.2
Giriş yap

Aynı anda farklı cihazlardan oturum açmayı engelleme

bayburt
509 defa görüntülendi

yapmış olduğum bir projede siteye aynı anda farklı cihazdan girişin engellenmesi isteniyor site paylaşımımı hostingde olduğu için nod js kullanamıyorum bu konu hakkında fikirlerinizi bekliyorum teşekkür ler

Cevap yaz
Cevaplar (6)
bmathers
513 gün önce

Üye girişi yapan kullanıcının giriş bilgilerini çerezlerde ve aynı zamanda veritabanında saklayarak istediğin işlem yapılabilir. Aşağıda örneğini verdiğim sistem üye formlarında bulunan "Beni Hatırla" seçeneği için de kullanılabilir.

Örnek

2 adet tablomuz olsun;

  • users (Kullanıcı bilgilerinin saklandığı)
  • remember_token (Kullanıcının giriş bilgilerinin saklandığı)
Kullanıcı bilgilerini veritabanına kayıt etme ve çerez oluşturma

Kullanıcı users tablosundaki username, password değerleri ile giriş yaptığı zaman kullanıcı için çerez oluşturalım. Oluşturacağımız çerezin içerisinde sadece token bilgisi yer alacak.

Oluşturacağımız çerezi önce veritabanına kayıt ediyoruz. Kayıt ettikten sonra çerez oluşturma işlemini gerçekleştiriyoruz. Veritabanı işlemleri için düz PDO yerine BasicDB sınıfını kullandım.

/*
 * 32 Karakter uzunluğunda rastgele token oluşturuyoruz.
 */
$token = bin2hex(random_bytes(32)); 

/*
 * Oluşturacağımız çerezin oluşturulduğu tarihten itibaren +7 gün geçerli olmasını sağlıyoruz.
 */
 
$time = time() + 604800; 

/*
 * Giriş yapan kullanıcının tarayıcı ve IP bilgisi
 */
$useragent = $_SERVER['HTTP_USER_AGENT'];
$ip = $_SERVER['REMOTE_ADDR'];

$insert = $db->insert('remember_token')
->set(array(
    'user' => $buraya_user_id, # Giriş yapan kullanıcını users tablosunda bulunan id değeri
    'token' => $token, # Çerezi oluşturmak için kullandığımız token
    'ip' => $ip,
    'useragent' => $useragent,
    'time' => $time
));

if($insert){

    /*
     *
     * Çerezi Oluşturuyoruz
     *
     * 1. Parametre: Anahtar
     * 2. Parametre: Değer
     * 3. Parametre: Çerezin ne kadar süreyle geçerli olacağını belirler.
     * 4. Parametre: Çerezin hangi URL yolları altında erişilebilir olduğunu belirler.
     *
     */
     
    setcookie("Auth", $token, $time, '/');

}
Oluşturulan bilgilerin kontrol edilmesi

Oluşturduğumuz çerezi şimdi kontrol ettirmemiz gerekiyor. Kullanıcı girişi sırasında eğer kullanıcının bilgileri doğru ise "remember_token" tablosunda kullanıcıya ait bir veri olup olmadığını kontrol etmemiz gerek. Eğer "remember_token" tablosunda kullanıcıya ait bir veri var ise kullanıcı girişini yapmasını engelleyeceğiz.

$query = $db->from('remember_token')
->where('user', $buraya_user_id)
->first();

if($query):
    die("Aktif oturumunuz bulunduğu için girişiniz engellendi");
else:
    # Giriş işlemine devam
endif;
Kullanıcı oturumunu kontrol etme

Şimdi yaptığımız sistemde kullanıcının giriş yaptığını sisteme bildirmiş olduk ve kullanıcının aktif oturumu var ise giriş yapmasını engellemiş olduk. Şimdi ise kullanıcının giriş yaptığı tarayıcıda oluşturduğumuz çerezi veritabanına kontrol etmemiz ve çerezdeki bilgiler veritabanında mevcut ise oturumuna devam etmesini sağlamamız gerekiyor.
Aşağıdaki kontrol kodlarını projenizin sürekli çağırılan bir dosyasına entegre edebilirsiniz veya kullanıcı oturumlarını belirli aralıklarla kontrol edilmesini sağlayabilirsiniz.

if(isset($_COOKIE['Auth'])){ 

    # Oluşturduğumuz çerezi kontrol ediyoruz, eğer mevcut ise işlemlere devam.
    
    $Cookie = $_COOKIE['Auth']; # Çerezi değişkene aktarıyoruz

    $query = $db->from('remember_token')
    ->where('token', $Cookie)
    ->first();
    
    if ($query) {

        # Token eğer veritabanında mevcut ise süresini kontrol ediyoruz

        if(time() > $query['time']){

            # Mevcut tarih eğer veritabanında bulunan tarihten büyük ise veritabanındaki tokeni siliyoruz
	    $delete = $db->delete('remember_token')->where('token', $Cookie)->done();

            # Daha sonrasında çerezi de silmemiz gerekiyor.
            setcookie('Auth', '');

            # Burada kullanıcı session kontrolleri yapılabilir.
            # Eğer session mevcut ise kaldırılabilir.

        }else{

            # Burada kullanıcı sessionları kontrol edilir.
            # Session mevcut değil ise kullanıcının girişi için sessionlar oluşturulur.

        }

    } else {

        # Token eğer veritabanında mevcut değil ise user id ile sorgulama yapıyoruz.

        # Eğer veritabanında veri var ise sileceğiz, eğer oluşturduğumuz çerez yok ise
        # kullanım süresi dolmuş demektir.

	$user = $db->from('remember_token')->where('user', $buraya_user_id)->first();
        
        if($user){

            # Eğer veritabanında user id ile eşleşen veri bulunduysa siliyoruz.
            $delete = $db->delete('remember_token')->where('user', $buraya_user_id)->done();

        }

    }

} else {

    # Eğer çerez tarayıcıda bulunmuyor ise yapılacak işlemler.
    echo "Auth çerezi bulunmuyor.";
    
}

Yukarıdaki kontrol kodlarında ayrıca tarayıcı bilgilerini, ip adresini vb. bilgileri kontrol ettirerek detaylandırabilirsiniz.

Aklıma bu şekilde bir çözüm geldi umarım yanlış bir mantık kurmamışımdır :D Ancak bu sistem biraz daha detaylandırılırsa birden fazla oturumun yönetimi için de kullanılabilir diye düşünüyorum.

bayburt
509 gün önce

teşekkürler üstadım

frexx
520 gün önce

Php ile aynısını yapmak basit ama database alanında iyi değilim.

$ip = $_SERVE["REMOTE_ADDR"];//KULLANICININ AKTİF İPSİ

if($ip == "1.124.234.23"){
echo "Siteye girişiniz engellendi.";
file_get_contents("404.php");
}

frexx
520 gün önce

Önceden girilen ip adresini kayıt etmen gerek databaseye. Ben sadece algoritmayı söylüyorum. Databaseden ip listesini çekip sorgu yapacaksın. Eğer if oncekiİP == suankiİP ise siteyi display none yapıp databaseye bir html kodu kaydedip onu çektirip yansıtabilirsin.

batuhanal
521 gün önce

platform.js kullanarak cihaz bilgilerini giriş yaparken gönder databasede kayıtlı olsun başka bir giriş olursa kontrol et eşit mi diye değilse kod göndersin maile client-side ne kadar güvenli olur bilemem ama aklıma bu geldi ip de ekleyebilirsin aklıma birşey gelmedi

cenap
521 gün önce

bence user-agent ile yapıyolar ya da token ile yapıyolardır user-agent ileyse token'e bağlaman lazım yoksa oturumdan atamazsın diye düşünüyorum yoksa atabiliyorsan at user-agent ile yapmıyorlarsa cihaz ipsi ile olabilir eğer yapabilirsen buraya örnek kod atarsan mutlu olurum.
user-agent
token
cihaz ip'si
bunları kullanabilirsin.