2017-05-20 9 views
8

Opracowałem aplikację internetową PHP, która używała sesji opartych na plikach cookie i wszystko działało bez zarzutu - dopóki nie zdałem sobie sprawy, że nie będzie działać w przeglądarkach z wyłączonymi plikami cookie stron trzecich (ponieważ skrypt zostanie załadowany w elemencie iframe na innej stronie/domenie).PHP - Zmiana identyfikatora sesji podczas korzystania z session.use_trans_sid

Postanowiłem więc przełączyć się na sesje oparte na adresach URL (które, jak przypuszczam, będą bezpieczne, ponieważ skrypt znajduje się w elemencie iframe, nie będzie widocznego adresu URL dla użytkownika, który mógłby udostępnić lub utworzyć zakładkę itp.).

Jednak z jakiegoś powodu, ponieważ przełączyłem się na sesje oparte na domenie, każda strona w mojej aplikacji internetowej używa innego identyfikatora sesji.

Oto mój 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 

... co jest pierwszą rzeczą, na miano na każdej stronie (bez wcześniejszego wyjścia, że ​​jestem świadomy).

Pierwsza strona w mojej aplikacji internetowej zawiera formularz i widzę, że wymagana ukryte wejście ID sesji jest automatycznie dodawane do niej przez PHP:

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

Ale identyfikator sesji donosi następnej stronie (że forma przedkłada) jest

Session ID: iiovfkrf3hesj1um5orasv7it6

Ponadto, gdy załadować pierwszej strony https: // ( zamiast http: //), przesłanie formularza powoduje przeładowanie tej samej strony (zamiast ładowania następnej strony).

Co ja już próbowałem:

ini_set("session.cookie_secure", 0);

i

ini_set("session.cookie_secure", 1);

i

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

i (na koniec skryptu)

session_write_close();

i usuwanie

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

Od phpinfo():

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 

pomysłów?

+0

Podczas przesyłania formularza jest "iiovfkrf3hesj1um5orasv7it6" wartość posta z ''? – Kzy

+0

Czy masz dostęp do pliku INI, czy jest on na współdzielonym hoście (np. W środowisku cPanel)? Próbowałem tych samych 4 wywołań do 'ini_set()' i moje wartości obciążenia z phpinfo() odzwierciedlają te (np. 'Session.use_trans_sid = 1') - Zastanawiam się, czy * ini_set() * może być wyłączone przez * disable_functions * .. –

+0

@ ban-geoengineering - Niestety sytuacja nie jest dla mnie jasna, ale zakładam, że napisałeś kody ini w części nagłówka. Dwa wspomniane pliki mogą mieć wspólny nagłówek. Tak więc, przekierowując z 1 strony na 2, zmienia ona wartość sesji. Mogę się mylić, ale zakładam, że to jest problem. –

Odpowiedz

3

Myślę, że problem musi wynikać z błędu w moim kodzie gdzieś.Utworzyłem skrypt testowy, poniżej i działa zgodnie z oczekiwaniami (na tym samym serwerze):

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> 

zaksięguje rzeczywisty błąd, raz ja” już znalazł ...

UPDATE

problemem było to, że za pomocą modelu POST-Redirect-Get a ja nie dołączenie wymaganego PHPSESSID Param ter do adresu URL GET!

Powiązane problemy