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.