2017-05-20 16 views
8

Çerez tabanlı oturumları kullanan bir PHP web uygulaması geliştirdim ve üçüncü parti çerezleri devre dışı bırakılmış tarayıcılarda çalışmaz hale gelene kadar iyi çalışıyordum. (çünkü betik başka bir web sitesinde/etki alanında iframe yüklenecek).PHP - session.use_trans_sid kullanırken oturum kimliği değişiyor

Bu yüzden, URL tabanlı oturumlara geçmeye karar verdim (bu, komut dosyasının bir iframe içerdiği için güvenli olacağını varsayıyorum, kullanıcının paylaşacağı veya yer işareti vb. Için görünür bir URL olmayacaktır).

Ancak, bir nedenle, etki alanına dayalı oturumlara geçtiğim için, web uygulamasındaki her sayfa farklı bir oturum kimliği kullanıyor. ilk şey olduğunu

İşte benim kod

...

ini_set("session.use_cookies", 0); 
ini_set("session.use_only_cookies", 0); 
ini_set("session.use_trans_sid", 1); 
ini_set("session.cache_limiter", ""); 
session_start(); 
echo "<p>Session ID: " . session_id() . "</p>"; // Test output 

... (Bildiğim kadarıyla daha önce çıkışı ile) her sayfada çağrılacak.

benim web uygulaması ilk sayfa bir form içerir ve ben gerekli gizli oturum kimliği girişi otomatik olarak PHP tarafından kendisine eklenir görüyoruz:

<input type="hidden" name="PHPSESSID" value="m4jbeec47uplnf95ue2h244a02" />

Fakat sonraki sayfada tarafından bildirilen oturum kimliği (form gönderen bir)

Oturum kimliği geçerli: iiovfkrf3hesj1um5orasv7it6 Ayrıca

, ben https kullanarak ilk sayfayı yüklediğinizde: // ((http: //) yerine, formun gönderilmesi, yeniden yüklenmekte olan aynı sayfaya (yüklenmekte olan bir sonraki sayfadan ziyade) sonuçlanır.

Daha önce de denedim Ne:

ini_set("session.cookie_secure", 0);

ve

ini_set("session.cookie_secure", 1);

ve

ini_set('session.gc_maxlifetime', 30 * 60); // expires in 30 minutes

ve (script sonunda)

session_write_close();

ve phpinfo() itibaren

ini_set("session.cache_limiter", "");

çıkarma:

session.auto_start Off Off 
session.cache_expire 180 180 
session.cache_limiter nocache nocache 
session.cookie_domain no value no value 
session.cookie_httponly Off Off 
session.cookie_lifetime 0 0 
session.cookie_path//
session.cookie_secure Off Off 
session.entropy_file no value no value 
session.entropy_length 0 0 
session.gc_divisor 1000 1000 
session.gc_maxlifetime 1440 1440 
session.gc_probability 1 1 
session.hash_bits_per_character 5 5 
session.hash_function 0 0 
session.name PHPSESSID PHPSESSID 
session.referer_check no value no value 
session.save_handler files files 
session.save_path /tmp /tmp 
session.serialize_handler php php 
session.upload_progress.cleanup On On 
session.upload_progress.enabled On On 
session.upload_progress.freq 1% 1% 
session.upload_progress.min_freq 1 1 
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS 
session.upload_progress.prefix upload_progress_ upload_progress_ 
session.use_cookies On On 
session.use_only_cookies On On 
session.use_strict_mode Off Off 
session.use_trans_sid 0 0 

bir fikir?

+0

Formu gönderirken 'iiovfkrf3hesj1um5orasv7it6', '? – Kzy

+0

INI dosyasına erişiminiz var mı, yoksa paylaşılan bir bilgisayarda mı (ör. CPanel ortamında)? Ini_set() 'e aynı 4 çağrıyı denedim ve phpinfo()' dan yük değerlerimi yansıttığım (örneğin 'session.use_trans_sid = 1') - * ini_set() * * disable_functions * ile devre dışı bırakılabileceğini merak ediyorum. –

+0

@ ban-jeomühendislik - Üzgünüm durum bana çok açık değil, ama ini kodlarını başlık kısmında yazdığını varsayalım. Bahsettiğiniz iki dosya, ortak üstbilgiyi paylaşıyor olabilir. Böylece, 1. sayfadan 2. sayfaya yönlendirildiğinde, oturum değerini değiştirir. Yanılıyor olabilirim ama bu sorunun üstlenilmesi. –

cevap

3

Sorunun bir yerde kodumdaki bir hata nedeniyle olması gerektiğini düşünüyorum.Aşağıda, test komut dosyası oluşturduk ve beklendiği gibi (aynı sunucuda) çalışır:

url-session-test.php

<?php 

$page_title = "URL Session Test (v11)"; 

ini_set("session.use_cookies", 0); 
ini_set("session.use_only_cookies", 0); 
ini_set("session.use_trans_sid", 1); 
//ini_set("session.cache_limiter", ""); 
ini_set('session.gc_maxlifetime', 30 * 60); // expires in 30 minutes 
session_start(); 
$session_id = session_id(); 

$is_new_session = !isset($_SESSION["existing"]); 
$_SESSION["existing"] = true; 
if ($is_new_session) { 
    $_SESSION["my_key"] = "MY PRIVATE KEY"; 
} 
$my_session_key = $_SESSION["my_key"]; 

$timezone = $_SESSION["timezone"]; 
if ($timezone) { 
    date_default_timezone_set($timezone); 
} 

if ($_POST['PHPSESSID']) { 
    $session_id_received = $_POST['PHPSESSID']; 
} 
else { 
    $session_id_received = ""; 
} 

?><!DOCTYPE html> 
<html> 
    <head> 
     <title><?php echo $page_title; ?></title> 
    </head> 
    <body> 
     <h1><?php echo $page_title; ?></h1> 
     <p>Is new session: <?php echo $is_new_session; ?></p> 
     <p>My session key: <?php echo $my_session_key; ?></p> 
     <p>Received session ID: <?php echo $session_id_received; ?></p> 
     <p>Actual session ID: <?php echo $session_id; ?></p> 
     <form method="POST"> 
      <input type="submit" value="Click this form submit button to see how if the above session ID is received by the next page" /> 
     </form> 
     <a href="url-session-test.php">Hover over this link to check the session ID parameter</a> 
    </body> 
</html> 

kez fiili hatayı yayınlayın Will I'

GÜNCELLEME

sorun POST-Yönlendirme-GET modeli kullanılarak ve ben gerekli PHPSESSID parametrelerle eklemediğinizden olmasıydı ... bunu bulduk GET URL'ye ter!

İlgili konular