php bir oturum değişkeni güvenli etkili yolu nedir?

1 Cevap php

Benim web uygulaması kullandığı UserId neredeyse tüm uygulama boyunca ..

  • php bir oturum değişkeni güvenli en etkili yolu nedir?

  • Oturum saldırılara karşı savunmasız mı?

  • I oturumda UserId benim şifrelenmiş değeri tutmak gerekir?

Herhangi bir öneri ...

1 Cevap

Note: my previous answer alınmıştır.

Terminology

  • User: Bir ziyaretçi.
  • Client: belirli bir makinede yüklü bir özellikle web yapabilen yazılım.

Understanding Sessions

Lütfen oturum güvenli hale getirmek için nasıl anlamak için, ilk seans nasıl çalıştığını anlamak gerekir.

Kullanıcının bu kod parçası görelim:

session_start();

En kısa sürede bu çağrı olarak, PHP PHPSESSID (varsayılan) adında bir çerez için bakacağız. Buldum değilse, bir tane oluşturun:

PHPSESSID=h8p6eoh3djplmnum2f696e4vq3

Bu bulunursa, o PHPSESSID değerini alır ve daha sonra karşılık gelen oturum yükler. Bu değer, bir session_id adlandırılır.

Yani müşteri bilecek tek şeydir. Eğer oturum değişkeni içine eklemek ne olursa olsun sunucuda kalır ve müşteriye transfer asla. Eğer $_SESSION içeriğini değiştirmek eğer değişken değişmez. Her zaman onu yok edene kadar aynı kalır ya da zaman aşımına. Bu nedenle, istemci bu bilgileri alır veya gönderir asla gibi karma veya başka yollarla $_SESSION içeriğini karartmak için denemek için işe yaramaz.

Sonra, yeni bir oturum durumda, değişkenleri koyacaktır:

$_SESSION['user'] = 'someuser';

İstemci bu bilgileri görmek asla.


The Problem

Kötü niyetli bir kullanıcı session_id başka bir kullanıcı çalınca bir güvenlik sorunu ortaya çıkabilir. Kontrol çeşit olmadan, o zaman o kullanıcı kimliğine bürünmek için ücretsiz olacak. Biz benzersiz müşteri (kullanıcı değil) tanımlamak için bir yol bulmalıyız.

Bir strateji (en etkili) oturumu başlatan istemci IP oturumu kullanan kişinin IP olarak aynı olup olmadığını kontrol içerir.

if(logging_in()) {
    $_SESSION['user'] = 'someuser';
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}

// The Check on subsequent load
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
    die('Session MAY have been hijacked');
}

Bu strateji ile sorunu bir istemci (uzun süreli oturum) bir yük dengeleyici veya kullanıyorsa kullanıcı dinamik IP var, bu yanlış bir uyarı tetikleyecek olmasıdır.

Başka bir strateji, istemci ve kullanıcı kontrol maddesi içerir:

if(logging_in()) {
    $_SESSION['user'] = 'someuser';
    $_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];
}

// The Check on subsequent load
if($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT']) {
    die('Session MAY have been hijacked');
}

Bu stratejinin olumsuz istemci (bazı kullanıcı aracısı) ekler tarayıcı bulunuyor veya bir addon yükler yükseltmeleri durumunda, kullanıcı aracısı dizesi değişecek ve bunun yanlış bir uyarı tetikleyecek olmasıdır.

Başka bir strateji, her 5 istekleri session_id döndürmektir. Bu şekilde, session_id teorik kaçırıldı olmak için yeterince uzun kalmak değil.

if(logging_in()) {
    $_SESSION['user'] = 'someuser';
    $_SESSION['count'] = 5;
}

// The Check on subsequent load
if(($_SESSION['count'] -= 1) == 0) {
    session_regenerate_id();
    $_SESSION['count'] = 5;
}

Dilediğiniz gibi bu stratejilerin her birleştirmek olabilir, ama aynı zamanda downsides birleştirir.

Ne yazık ki, hiçbir çözüm aptal kanıtıdır. Lütfen session_id tehlikeye ise, hemen hemen için yapılır. Yukarıdaki stratejileri sadece stop-boşluk önlemlerdir.