PHP
Sessions
Zoeken…
Syntaxis
- void session_abort (void)
- int session_cache_expire ([string $ new_cache_expire])
- void session_commit (void)
- string session_create_id ([string $ prefix])
- bool session_decode (string $ data)
- bool session_destroy (nietig)
- string sessie_code (ongeldig)
- int session_gc (nietig)
- array session_get_cookie_params (ongeldig)
- string session_id ([string $ id])
- bool session_is_registering (string $ name)
- string session_module_name ([string $ module])
- string session_name ([string $ name])
- bool session_regenerate_id ([bool $ delete_old_session = false])
- void session_register_shutdown (void)
- bool session_register (gemengde $ name [, gemengde $ ...])
- void session_reset (void)
- string session_save_path ([string $ path])
- void session_set_cookie_params (int $ lifetime [, string $ pad [, string $ domein [, bool $ secure = false [, bool $ httponly = false]]]))
- bool session_set_save_handler (opvraagbaar $ open, opvraagbaar $ close, opvraagbaar $ lees, opvraagbaar $ schrijf, opvraagbaar $ vernietig, opvraagbaar $ gc [, opvraagbaar $ create_sid [, opvraagbaar $ validate_sid [, opvraagbaar $ update_timestamp]]))
- bool session_start ([array $ options = []])
- int session_status (nietig)
- bool session_unregister (string $ name)
- void session_unset (void)
- void session_write_close (void)
Opmerkingen
Merk op dat het aanroepen van session_start()
zelfs als de sessie al is gestart, zal resulteren in een PHP-waarschuwing.
Sessiegegevens manipuleren
De variabele $_SESSION
is een array en u kunt deze ophalen of manipuleren als een normale array.
<?php
// Starting the session
session_start();
// Storing the value in session
$_SESSION['id'] = 342;
// conditional usage of session values that may have been set in a previous session
if(!isset($_SESSION["login"])) {
echo "Please login first";
exit;
}
// now you can use the login safely
$user = $_SESSION["login"];
// Getting a value from the session data, or with default value,
// using the Null Coalescing operator in PHP 7
$name = $_SESSION['name'] ?? 'Anonymous';
Zie ook Een array manipuleren voor meer informatie over het werken aan een array.
Houd er rekening mee dat als u een object in een sessie opslaat, het alleen netjes kan worden opgehaald als u een klasse-autoloader hebt of als u de klasse al hebt geladen. Anders verschijnt het object als het type __PHP_Incomplete_Class
, wat later tot crashes kan leiden. Zie Namespacing en Autoloading over autoloading.
Waarschuwing:
Sessiegegevens kunnen worden gekaapt. Dit wordt uiteengezet in: Pro PHP Security: van applicatiebeveiligingsprincipes tot de implementatie van XSS-verdediging - Hoofdstuk 7: sessiekaping voorkomen Dus het kan ten zeerste worden aanbevolen om nooit persoonlijke informatie op te slaan in $_SESSION
. Dit zou vooral kritiek zijn voor creditcardnummers , door de overheid uitgegeven ID's en wachtwoorden ; maar zou zich ook uitstrekken tot minder veronderstelde gegevens zoals namen , e-mails , telefoonnummers , enz. waardoor een hacker zich kan voordoen als een legitieme gebruiker. Gebruik in het algemeen waardeloze / niet-persoonlijke waarden, zoals numerieke identificatiegegevens, in sessiegegevens.
Vernietig een hele sessie
Als je een sessie hebt die je wilt vernietigen, kun je dit doen met session_destroy()
/*
Let us assume that our session looks like this:
Array([firstname] => Jon, [id] => 123)
We first need to start our session:
*/
session_start();
/*
We can now remove all the values from the `SESSION` superglobal:
If you omitted this step all of the global variables stored in the
superglobal would still exist even though the session had been destroyed.
*/
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
//Finally we can destroy the session:
session_destroy();
Het gebruik van session_destroy()
is iets anders dan het gebruiken van zoiets als $_SESSION = array();
waarmee alle in de SESSION
superglobal opgeslagen waarden worden verwijderd, maar de werkelijke opgeslagen versie van de sessie niet wordt vernietigd.
Opmerking : we gebruiken $_SESSION = array();
in plaats van session_unset()
omdat de handleiding bepaalt:
Gebruik alleen session_unset () voor oudere verouderde code die geen $ _SESSION gebruikt.
session_start () Opties
Te beginnen met PHP Sessions kunnen we een array met pas -sessie op basis php.ini
opties om de session_start
functie.
Voorbeeld
<?php
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
// php >= 7 version
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
} else {
// php < 7 version
session_start();
}
?>
Deze functie introduceert ook een nieuwe php.ini
instelling genaamd session.lazy_write
, die standaard op true
en betekent dat sessiegegevens alleen worden herschreven als deze veranderen.
Verwijzing: https://wiki.php.net/rfc/session-lock-ini
Naam sessie
Controleren of sessiecookies zijn gemaakt
Sessienaam is de naam van de cookie die wordt gebruikt om sessies op te slaan. U kunt dit gebruiken om te detecteren of cookies voor een sessie voor de gebruiker zijn gemaakt:
if(isset($_COOKIE[session_name()])) {
session_start();
}
Merk op dat deze methode over het algemeen niet nuttig is, tenzij u echt niet onnodig cookies wilt maken.
Naam sessie wijzigen
U kunt de sessienaam bijwerken door session_name()
aan te roepen.
//Set the session name
session_name('newname');
//Start the session
session_start();
Als er geen argument wordt opgegeven in session_name()
wordt de huidige sessienaam teruggegeven.
Het mag alleen alfanumerieke tekens bevatten; het moet kort en beschrijvend zijn (dwz voor gebruikers met ingeschakelde cookiewaarschuwingen). De sessienaam kan niet alleen uit cijfers bestaan, er moet minimaal één letter aanwezig zijn. Anders wordt elke keer een nieuwe sessie-ID gegenereerd.
Sessie vergrendelen
Zoals we allemaal weten, schrijft PHP sessiegegevens in een bestand aan serverzijde. Wanneer een aanvraag wordt gedaan om php script dat de sessie start via session_start()
, PHP vergrendelt deze sessie bestand heeft geleid tot block / wachten andere inkomende verzoeken voor dezelfde session_id
om volledige, waardoor de andere verzoeken zal vast komen te zitten op session_start()
totdat of tenzij het vergrendelde sessiebestand niet wordt vrijgegeven
Het sessiebestand blijft vergrendeld totdat het script is voltooid of de sessie handmatig is gesloten. Om deze situatie te voorkomen, dat wil zeggen om te voorkomen dat meerdere aanvragen worden geblokkeerd , kunnen we de sessie starten en de sessie sluiten, waardoor het slot van het sessiebestand wordt vrijgegeven en de resterende aanvragen kunnen worden voortgezet.
// php < 7.0
// start session
session_start();
// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked
// close the session, release lock
session_write_close();
Nu zal men denken dat als sessie gesloten is hoe we de sessiewaarden zullen lezen, verfraaien zelfs nadat sessie is gesloten, sessie nog steeds beschikbaar is. We kunnen dus nog steeds de sessiegegevens lezen.
echo $_SESSION['id']; // will output 123
In php> = 7.0 kunnen we read_only sessie, read_write sessie en lazy_write sessie hebben, dus het is misschien niet nodig om session_write_close()
Veilige sessie Start zonder fouten
Veel ontwikkelaars hebben dit probleem wanneer ze aan grote projecten werken, vooral als ze werken aan een aantal modulaire CMS op plug-ins, add-ons, componenten enz. Hier is een oplossing voor het veilig starten van een sessie waarbij als eerst de PHP-versie werd aangevinkt om alle versies te dekken en daarna wordt gecontroleerd als sessie is gestart. Als de sessie niet bestaat, start ik de sessie veilig. Als sessie bestaat, gebeurt er niets.
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
if(session_status() == PHP_SESSION_NONE) {
session_start(array(
'cache_limiter' => 'private',
'read_and_close' => true,
));
}
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
else
{
if(session_id() == '') {
session_start();
}
}
Dit kan je veel helpen om een session_start
fout te voorkomen.