Séances en PHP. Comment définir une limite de session de connexion sur un routeur TP-Link ? Séance de connexion

    Texte/html 19/10/2017 7:51:00 Vecteur BCO 0

    Il y a 13 à 15 clients installés sur le serveur de terminaux WS2012. Le terminal de la machine virtuelle tourne. Sur une machine virtuelle distincte DNS, AD et DHCP.

    Question n°1 : comment configurer le délai de déconnexion lors d'une session inactive ?

    Dans gpedit.msc Configuration ordinateur -> Composants Windows -> Services Bureau à distance -> Hôte de session Bureau à distance -> Sessions à durée limitée. Tous les paramètres n'y sont pas spécifiés. Et en même temps, avec un temps d'inactivité d'environ 20 à 30 minutes. jette tout le monde dehors.

    J'ai parcouru beaucoup d'informations sur RUNet, mais je ne les ai trouvées nulle part pour WS2012, elles ne sont disponibles que pour WS2003.

    Question n°2 : comment puis-je m'assurer qu'après la déconnexion de la session, tous les logiciels ouverts pour l'utilisateur ne se ferment pas ?

    Ceux. Par exemple, un utilisateur doit être expulsé après 20 minutes, tandis que toute sa session est interrompue et lorsqu'il se reconnecte, tous ses programmes ouverts et ses docks sont fermés. En fait, lorsqu'il y aura une réponse à la question n°1, je réglerai l'heure, mais j'aimerais quand même que l'utilisateur ne rouvre pas tout après chaque fausse couche... Je comprends que cela est lié à la vie du session, mais quand même, existe-t-il un mode dans lequel la session meurt, mais son état est préservé ? Et si oui, comment le configurer ?

    Question n°3 : Est-il possible de limiter les droits d'arrêt du serveur dans WS2012 ?

    Sinon, lorsque les utilisateurs appuient sur Démarrer, le panneau est en mosaïque et il y a un bouton « power », c'est-à-dire n'importe quel utilisateur peut éteindre le serveur de terminaux par erreur et tout le travail s'arrête.

    Modérateur

    Texte/html 19/10/2017 11:30:36 Avksentyev Sergueï 1

    1 Donc, dans les propriétés de la collection, il y a un onglet « Session ». Là, vous pouvez voir ce que vous devez configurer.. Ou est-ce que je n'ai pas compris ?

    2 Cela dépend de la manière dont l'utilisateur ferme la session.. Si vous désactivez et configurez pour ne pas fermer le capteur désactivé, les programmes ouverts resteront.. MAIS il me semble que ce n'est pas du tout une très bonne idée... Je redémarrez les terminaux lourds tout le temps la nuit afin que toutes ces ordures ouvertes restantes soient fermées.

    3 Si vos utilisateurs ne sont pas des administrateurs, alors... ce bouton par défaut se désactive et se ferme uniquement.

  • Texte/html 23/10/2017 10:51:31 Ivan et KO 0

    >>Comment avez-vous configuré le serveur de terminaux ? Si vous avez configuré le rôle RDS, et jusqu'à la fermeture complète de la session (avec tous les programmes utilisateur de cette session).

    >>Si vous avez configuré un rôle RDS

    Vous ne savez pas où chercher ?

    >>dans la configuration de la collecte il y a une durée de vie de session jusqu'à la déconnexion

    Vous ne savez pas où chercher ?

    >>Avez-vous des utilisateurs sur le serveur qui sont des administrateurs ?

    Oui, les administrateurs.

    >>Par défaut, les utilisateurs réguliers ne peuvent pas arrêter le serveur. Mais vous pouvez masquer complètement ce bouton dans la stratégie.

  • Texte/html 23/10/2017 11:00:12 Ivan et KO 0

    >>Donc, dans les propriétés de la collection, il y a un onglet « Session ». Là, vous pouvez voir ce que vous devez configurer.. Ou est-ce que je n'ai pas compris ?

    Peut-être avez-vous bien compris, mais je ne sais pas comment faire, c'est pourquoi j'écris ici... pour une raison quelconque, dans RuNet, je ne trouve pas vraiment d'instructions pour configurer un serveur de terminaux, pour les rôles et les sessions.

    Vous avez écrit dans les propriétés de la collection : où est-il ?

    >>En regardant comment l'utilisateur ferme la session.. Si vous vous déconnectez et configurez pour ne pas fermer la session désactivée, alors les programmes ouverts resteront.. MAIS il me semble que ce n'est pas du tout une très bonne idée... Je redémarrez les terminaux lourds tout le temps la nuit, juste pour que toutes ces ordures ouvertes restantes soient fermées.

    J'augmenterais simplement la durée de vie des sessions, pour commencer... Je comprends parfaitement de quoi vous parlez, les sessions suspendues ne sont pas la question. J'aimerais juste savoir où exactement tout cela est configuré... ?

    Je n'ai aucune expérience dans la mise en place d'un serveur de terminaux (auparavant j'y travaillais uniquement en tant que client), même si je suis dans la structure informatique depuis longtemps, mais je n'ai jamais effectué cette tâche particulière. Et je n'écrirais pas la question ici si je pouvais trouver des instructions détaillées sur la façon de le faire sur Internet...

  • Texte/html 23/10/2017 11:13:30 Vecteur BCO 0

    >>Comment avez-vous configuré le serveur de terminaux ? Si vous avez configuré le rôle RDS dans la configuration de la collection, il existe une durée de vie de session jusqu'au moment de la déconnexion, et jusqu'au moment où la session est complètement fermée (avec tous les programmes utilisateur de cette session).

    Ma question préférée, mais très étrange pour moi, est la suivante : comment l'avez-vous configuré ? Je pense qu'il ressort clairement des questions que ce n'est pas moi qui l'ai organisé. Sinon, c'est très difficile d'expliquer ce que j'ai mis en place, et maintenant je ne sais pas comment le changer... amnésie, etc.

    Encore une fois, ce n’est pas moi qui l’ai mis en place. Et parce que Je ne l'ai pas fait, alors les compétences dans ces contextes font clairement défaut. Alors je demande aux professionnels : comment faire, dites-moi s'il vous plaît ?

    >>Si vous avez configuré un rôle RDS

    Vous ne savez pas où chercher ?

    >>dans la configuration de la collecte il y a une durée de vie de session jusqu'à la déconnexion

    Vous ne savez pas où chercher ?

    >>Avez-vous des utilisateurs sur le serveur qui sont des administrateurs ?

    Oui, les administrateurs.

    >>Par défaut, les utilisateurs réguliers ne peuvent pas arrêter le serveur. Mais vous pouvez masquer complètement ce bouton dans la stratégie.

    Comment supprimer les droits d'administrateur des utilisateurs ? Est-ce configuré dans AD ou ailleurs sur le serveur de terminaux ? Comment élaborer une politique pour masquer le bouton d’alimentation ?

    Merci d'avance pour votre compréhension et j'attends avec impatience vos réponses...

    Vous disposez d'un méga outil progressif sur votre serveur appelé " Gestionnaire de serveur"Des rôles/fonctionnalités y sont ajoutés/supprimés et configurés. Découvrez les fonctionnalités de cet outil. Sur la gauche, il y a des paramètres pour certains rôles (installés). S'il y a un élément RDS là-bas, allez-y, puis dans la collection Paramètres. Google comment configurer un serveur de terminaux sur WS 2012 r2. Vous pouvez effectuer une recherche comme ceci : Google -> "Guide étape par étape de Terminal Server 2012 r2".

    Sur le serveur (et pas seulement sur le serveur) il existe également un méga outil appelé Gestion d'ordinateur(à ne pas confondre avec Server Manager), vous pouvez le trouver en cliquant avec le bouton droit sur Démarrer.

    Dans Gestion de l'ordinateur, accédez à Utilisateurs et groupes locaux, puis aux groupes, puis aux administrateurs, et voyez qui est là et pourquoi. Vous expulsez tous ceux qui n’ont pas besoin de ces droits. et redémarrez le serveur (assurez-vous de ne pas vous avoir retiré vos droits, sinon il y aura une quête pour les récupérer plus tard).

    Comment masquer le bouton Google -> "Masquer le bouton d'arrêt GPO"

    L'opinion exprimée par moi n'est pas une position officielle de Microsoft

    Modérateur

    Texte/html 25/10/2017 7:51:20 Ivan et KO 0

    >>Il était difficile de deviner que vous ne savez pas gérer un serveur, car en règle générale, ceux qui viennent ici commencent au moins par rechercher leur question sur Google.

    J'ai cherché la question sur Google plus d'une fois, je l'ai écrite ci-dessus. Seulement j'ai cherché sur Google des ressources en langue russe... Il n'y a pratiquement pas d'articles sensés là-bas. J'ai moi-même vu qu'il existe des sources en anglais, mais mes compétences techniques en anglais ne sont pas assez bonnes pour comprendre correctement à 100 % de gros articles sur la configuration d'un système à partir de zéro, ce que je n'ai jamais fait auparavant.

    >>Vous pouvez effectuer une recherche comme ceci : Google -> "Guide étape par étape de Terminal Server 2012 r2. Google -> "Masquer le bouton d'arrêt GPO

    Je sais utiliser Google, mais je n’ai pas besoin de formation pour utiliser un moteur de recherche. Pourquoi n'ai-je pas regardé dans les sources en anglais - j'ai écrit ci-dessus... S'ils vous disent qu'ils ne savent pas comment configurer un serveur de terminaux, cela ne veut pas dire que la personne ne sait pas comment utiliser Google. . Mais vous n'avez pas manqué l'occasion, comme 99 % des informaticiens, de commencer par moraliser et enseigner Google à une personne. Quant à moi, cela a toujours été et reste un problème dans la compréhension des personnes disposant d'une infrastructure informatique. Une bonne démonstration vaut plus que de l’argent. Et cela ne manque à aucun informaticien, comme le montre la pratique, même lorsqu'il communique avec des collègues, pour ainsi dire.

    La question a été posée : comment configurer un serveur de terminaux ? Et c'est expliqué en détail ce qui doit être configuré et où... et vous m'écrivez à propos des requêtes Google. J'ai interrogé un homme sur les mathématiques, et il a commencé par parler de la météo... voilà comment ça s'est passé. Au lieu de tout ce que vous avez écrit ci-dessus, vous pourriez donner une réponse courte en russe, point final. Oui, vous me direz que rechercher sur Google la question qui nécessite une solution concerne des sujets plus connexes. Oui, et c'est vrai, mais si vous aviez lu attentivement le premier message, alors ce terme ne serait pas nécessaire.

    >>Vous disposez d'un méga outil progressif sur votre serveur appelé « Server Manager ».

    On peut lire ici un ton moralisateur, plus disposé à se mesurer à un lieu célèbre, devant une personne. C'est comme le prof. un boxeur va montrer à un débutant comment faire un KO, sur son visage et sans préparation... une méthode bien étrange, pour aider la personne et répondre à ses questions.

    Votre formulaire est en russe, la question était en russe et vous souhaitez recevoir la réponse en russe.

    Sans moraliser, pourquoi n'avez-vous pas utilisé Google ? Et il y a un tel atout, Google, etc.

    Il est beaucoup plus productif de travailler dans le style questions-réponses.

    Question : Comment configurer ceci et cela ? Réponse : allez-y et faites telle ou telle chose.

  • Texte/html 25.10.2017 8:25:04 Vecteur BCO 0

    Sur " question - comment configurer un serveur de terminaux"Vous pouvez répondre avec des articles de 10 à 15 pages - ce n'est pas un format de forum. Je vous ai posé des requêtes spécifiques dans un moteur de recherche qui vous mèneront à un résultat garanti. Il y a aussi beaucoup d'informations sur les ressources en langue russe, par exemple sur Habré et des sites similaires, si vous ne le trouvez pas, alors regardez, vous vous en sortez toujours mal.

    Pour donner une réponse claire, vous devez poser une question claire. je t'ai demandé pas prêcheur question dans le premier message, à laquelle j'ai reçu une réponse du style " Pourquoi tu me demandes une connerie, c'est clairement écrit que je ne sais pas ce qui se passe".

    L'opinion exprimée par moi n'est pas une position officielle de Microsoft

Une session (du latin - sessio - meeting, anglais - session) est une période de temps couvrant le travail de l'utilisateur sur Internet depuis l'ouverture du premier lien jusqu'au dernier. Calculé comme le décalage horaire entre les demandes initiales et finales. Cependant, la dernière page peut mettre un temps différent à être visualisée par l'utilisateur, ce qui rend par conséquent plus difficile la mesure du temps entre deux requêtes.

Comment se déroule une session par rapport au protocole HTTP et aux COOKIES ?

Ce qu'est une session peut être expliqué sur la base du protocole HTTP. En soi, ce protocole ne permet pas de sauvegarder l’état entre deux opérations. Autrement dit, en ouvrant une page puis en passant de celle-ci à une autre, HTTP ne pourra pas établir que les deux requêtes appartiennent au même utilisateur. Et ici, une méthode de suivi spéciale vient à la rescousse : la gestion des sessions (nos sessions).
Ainsi, en répondant à la question de savoir ce qu'est une session, nous pouvons dire qu'il s'agit d'un objet logique auxiliaire qui facilite le transfert de données entre les requêtes HTTP successives d'un utilisateur.
Les cookies, comme les sessions, stockent des informations sur l'utilisateur au fur et à mesure qu'il navigue sur différentes pages et améliorent les performances du protocole. Mais contrairement au second, où les données sont stockées dans des fichiers temporaires sur le serveur, ils les sauvegardent sur l'ordinateur de l'utilisateur sous forme de petits fragments.

A quoi servent les séances ?

L'utilisation de sessions devient indispensable lorsque l'on travaille avec des sites tels que des forums, des forums de discussion et des boutiques en ligne, car dans ce cas, il est nécessaire de sauvegarder les données de l'utilisateur sur plusieurs pages.

Étapes de la séance

L'ensemble de la séance peut être divisé en trois étapes :

  • ouverture de session (lorsque l'utilisateur commence à travailler avec un site spécifique),
  • comptabilisation des variables de session (lors du passage sur différentes pages),
  • fin de la séance.

Étant donné que les données de session sont enregistrées sur un serveur tiers, il est préférable de ne pas y stocker de grandes quantités d'informations, mais d'utiliser des cookies.

Le serveur web n'entretient pas de connexion permanente avec le client, et chaque requête est traitée comme une nouvelle, sans aucune connexion avec les précédentes.
Autrement dit, vous ne pouvez ni suivre les demandes du même visiteur ni enregistrer des variables pour lui entre les vues de pages individuelles. C’est pour résoudre ces deux problèmes que les séances ont été inventées.
En fait, les sessions, en un mot, sont un mécanisme qui vous permet d'identifier de manière unique un navigateur et de créer un fichier pour ce navigateur sur le serveur dans lequel les variables de session sont stockées.

Je ne décrirai pas en détail la nécessité d'un tel mécanisme. Il s'agit de cas d'école comme le panier d'achat dans une boutique en ligne, l'autorisation, mais aussi des problèmes pas tout à fait anodins, comme la protection des parties interactives d'un site contre le spam.

En principe, il est assez simple de créer votre propre analogue de sessions, pas aussi fonctionnel que celui intégré à PHP, mais similaire en substance. Sur les cookies et la base de données.
Lors de la demande d'un script, nous regardons si un cookie portant un nom spécifique a été reçu. S'il n'y a pas de cookie, définissez-le et écrivez une nouvelle ligne avec les données utilisateur dans la base de données. S'il existe un cookie, nous lisons les données de la base de données. Avec une autre demande, nous supprimons les anciens enregistrements de la base de données et nous disposons désormais d'un mécanisme de session prêt. Ce n'est pas difficile du tout. Mais certaines nuances rendent préférable l'utilisation du mécanisme de session intégré.

Si seul le premier est activé, alors au début de la session (à chaque fois que session_start() est appelé), un cookie est défini pour le client. Le navigateur renvoie correctement ce cookie à chaque requête ultérieure et PHP dispose d'un identifiant de session. Les problèmes commencent si le navigateur ne renvoie pas de cookies. Dans ce cas, sans recevoir de cookie avec un identifiant, PHP démarrera toujours une nouvelle session et le mécanisme ne fonctionnera pas.

Si seul le second est activé, alors le cookie n'est pas défini. Et c'est ce qui se passe, pour lequel, en fait, il vaut la peine d'utiliser le mécanisme de session intégré. Une fois que le script a fait son travail et que la page est complètement formée, PHP analyse la page entière et ajoute un identifiant de session à chaque lien et à chaque formulaire. Cela ressemble à ceci :
Indice se transforme en
Indice
et un champ caché est ajouté aux formulaires

Et le navigateur, lorsque vous cliquez sur un lien, ou lorsque vous cliquez sur un bouton du formulaire, enverra dans la requête la variable dont nous avons besoin - l'identifiant de session !
Pour des raisons évidentes, l'identifiant n'est ajouté qu'aux liens relatifs.

Théoriquement, dans nos sessions maison sur les cookies et la base de données, nous pouvons attribuer manuellement un transfert d'identifiant à tous les liens - et nos propres sessions fonctionneront alors quels que soient les cookies. Mais seriez-vous d’accord : c’est plus agréable quand quelqu’un d’autre fait ce travail ? ;-)

Par défaut, les deux options sont activées dans les versions récentes de PHP. Comment PHP gère-t-il cela ? Cook est toujours exposé. Et les liens ne sont complétés automatiquement que si PHP n'a pas détecté de cookie avec un identifiant de session. Lorsqu'un utilisateur visite le site pour la première fois au cours de cette session, un cookie est déposé et les liens sont complétés. Lors de la requête suivante, si les cookies sont pris en charge, PHP voit le cookie et arrête de compléter les liens. Si les cookies ne fonctionnent pas, PHP continue d'ajouter correctement l'identifiant aux liens et la session n'est pas perdue.
Les utilisateurs dont les cookies sont activés ne verront le lien long avec l’identifiant qu’une seule fois.

Phew. Le transfert d'identité est terminé.
Il ne reste plus qu'à y lier le fichier de données côté serveur.
PHP fera cela pour nous. Il suffit juste d'écrire
session_start();
$_SESSION["test"]="Bonjour tout le monde !";

Et PHP écrira la variable de test dans le fichier associé à cette session.
Il y a ici une remarque très importante.
Le tableau $_SESSION est spécial.
En fait, il contient les variables que nous souhaitons rendre disponibles dans différents scripts.
Pour placer une variable dans une session, affectez-la simplement à l'élément de tableau $_SESSION.
Pour obtenir sa valeur, accédez simplement au même élément. Un exemple sera ci-dessous.

PHP gère également le garbage collection – en supprimant les fichiers obsolètes. Ainsi que l'encodage des données et bien d'autres choses nécessaires. Grâce à ces soins, travailler avec des séances est très simple.
Nous arrivons ici en fait à l'exemple du fonctionnement des sessions.
Un tout petit exemple :
session_start();

echo "Vous avez mis à jour cette page ".$_SESSION["counter"]++." fois.";
écho "
mise à jour";
?>

Nous vérifions si nous avons une variable compteur dans la session ; sinon, nous la créons avec la valeur 0, puis affichons sa valeur et l'augmentons de un. La valeur augmentée sera écrite dans la session, et lors du prochain appel du script, la variable aura la valeur 1, et ainsi de suite.
Tout est très simple.

Afin d'avoir accès aux variables de session sur n'importe quelle page du site, vous devez écrire UNE SEULE (!) ligne au tout début de CHAQUE fichier dans lequel nous avons besoin de sessions :
session_start();
Et puis accédez aux éléments du tableau $_SESSION. Par exemple, une vérification d'autorisation ressemblerait à ceci :
session_start();
si ($_SESSION["autorisé"]<>1) {
header("Emplacement : /auth.php");
sortie;
}

Suppression de variables d'une session.
Si vous avez register_globals=off , écrivez simplement
unset($_SESSION["var"]);
Si non, alors près Je dois écrire avec elle
session_unregister("var");

Les erreurs les plus courantes produites par PHP lors de la tentative de travail avec des sessions sont les suivantes :
Deux d'entre eux
Avertissement : Impossible d'envoyer le cookie de session - en-têtes déjà envoyés
Avertissement : Impossible d'envoyer le limiteur de cache de session - en-têtes déjà envoyés

causé par la même raison, la solution est décrite dans ce fil
Troisième,
Avertissement : échec de l'ouverture (/tmp\sess_SID, O_RDWR) : aucun fichier ou répertoire de ce type (2) dans full_script_path sur le numéro de ligne(auparavant, elle ressemblait à Avertissement : Échec de l'écriture des données de session (fichiers). Veuillez vérifier que le paramètre actuel de session.save_path est correct (/tmp)),
s'il est traduit de l'anglais, il explique le problème en détail : le chemin vers le répertoire spécifié dans php.ini où les fichiers de session sont écrits n'est pas disponible. Cette erreur est la plus simple à corriger. Enregistrez simplement un répertoire qui existe et est accessible en écriture, par exemple,
session.save_path = c:\windows\temp
Et n'oubliez pas de redémarrer Apache après cela.

Il s’avère que l’intelligence humaine n’a pas de limites, et je suis donc obligé d’expliquer :
un message concernant la troisième erreur (le répertoire est introuvable) entraînera INÉVITABLEMENT l'apparition des deux premières, car le message d'erreur est affiché sur le navigateur et les en-têtes suivants ne peuvent pas être utilisés. Par conséquent, ne vous précipitez pas pour chercher une conclusion prématurée, mais écrivez d’abord le bon chemin !

Le deuxième problème le plus courant lors du travail avec des sessions est le lourd héritage de register_globals. NE donnez PAS de noms de variables de script qui correspondent aux indices du tableau $_SESSION !
Avec register_globals=on, les valeurs s'écraseront et vous serez confus.
Et si register_globals=off, une autre erreur apparaîtra : « Votre script s'appuie peut-être sur un effet secondaire de session qui existait jusqu'à PHP 4.2.3. », si le script a une variable de session qui n'a aucune valeur, et une variable globale avec le même nom . Pour s'en débarrasser, vous devez toujours initialiser les variables avant utilisation (ou au moins vérifier leur existence) et ne pas donner de noms de variables globales qui coïncident avec les index du tableau $_SESSION.

Si cela ne fonctionne pas, mais qu'aucun message ne s'affiche, ajoutez deux lignes au tout début du script chargées d'afficher TOUTES les erreurs à l'écran - il est fort possible qu'il y ait des erreurs, mais vous ne les voyez tout simplement pas.
ini_set("display_errors",1);
rapport d'erreur (E_ALL);

ou consultez les erreurs dans error_log. En général, le sujet de l'affichage des messages d'erreur dépasse le cadre de cet article, alors assurez-vous simplement que vous pouvez au moins les voir. Vous pouvez en savoir un peu plus sur la recherche d'erreurs dans cette section.

Si vous êtes sûr qu'il n'y a pas d'erreurs, mais que l'exemple donné ne fonctionne pas de toute façon, alors peut-être que PHP n'autorise pas la transmission d'identifiant via une URL, et les cookies pour une raison quelconque ne fonctionnent pas.
Regardez ce qui ne va pas avec vos cookies.
De manière générale, si vos sessions ne fonctionnent pas, essayez d'abord de transmettre l'identifiant de session manuellement, c'est-à-dire de créer un lien et de lui attribuer un identifiant :
session_start();
if (!isset($_SESSION["counter"])) $_SESSION["counter"]=0;
echo "Vous avez mis à jour cette page ".$_SESSION["counter"]++." fois.

mise à jour";
?>

Cependant, vous devez vous assurer que la directive session.use_only_cookies n'est pas activée, ce qui empêche PHP d'accepter l'ID de session s'il a été transmis via une URL.

Si cet exemple ne fonctionne pas, alors le problème est soit trivial fautes de frappe(la moitié des "problèmes" avec les sessions proviennent d'un nom de variable mal orthographié), ou dans une version trop ancienne de PHP : le support des sessions est apparu dans la version 4.0, et le tableau $_SESSION - dans la 4.1 (Avant cela, $HTTP_SESSION_VARS était utilisé ).
Si cela fonctionne, le problème vient des cookies. Surveillez le type de cookie que le serveur définit sur le navigateur et si le navigateur le renvoie. Il est très utile d'effectuer une recherche en observant l'échange d'en-têtes HTTP entre le navigateur et le serveur.
Une explication du fonctionnement des cookies dépasse le cadre de ce texte déjà trop long, mais assurez-vous au moins que le serveur envoie un cookie avec un identifiant et que le navigateur le renvoie. Et en même temps les identifiants coïncident les uns avec les autres =)
La définition du cookie devrait ressembler à
Set-Cookie : PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6 ;
ou comment
Set-Cookie : PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6 ; chemin=/
(si vous demandez le script hors du répertoire racine)
La réponse du serveur devrait ressembler à
Cookie : PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6
ou
Cookie : PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6 ; b = b
si le navigateur renvoie des cookies autres que l'identifiant de session.

Si le navigateur ne renvoie pas de cookies, vérifiez si les cookies fonctionnent.
Assurez-vous que le domaine auquel vous accédez porte un nom normal (avec au moins un point et aucun caractère illégal tel que des traits de soulignement) et videz le cache de votre navigateur - ce sont deux raisons principales pour lesquelles les cookies peuvent ne pas fonctionner.

Si l'exemple d'ici fonctionne, mais pas votre propre code, alors le problème ne vient évidemment pas des sessions, mais de l'algorithme. Recherchez où vous avez perdu la variable, transférez l'exemple d'ici étape par étape et déboguez votre script.

Un autre problème peut survenir si vous utilisez la redirection d'en-tête ou la navigation JavaScript.
Le fait est que PHP ajoute automatiquement l'identifiant de session uniquement aux liens comme
, mais ne le fait pas pour les en-têtes, JavaScript et les balises méta.
Par conséquent, vous devez ajouter l'identifiant manuellement, par exemple, comme ceci :
header("Emplacement : /script.php?".session_name()."=".session_id());

De plus, un problème très rare, et dont on ne sait absolument pas d'où il vient, est que le paramètre session.save_handler a une valeur différente de celle des fichiers. Si ce n'est pas le cas, corrigez-le.

Sécurité
La sécurité des sessions est un vaste sujet. Je me concentrerai donc sur quelques points principaux.
Le plus classique est de ne pas passer l'identifiant via la barre d'adresse. Ceci est écrit même dans php.ini, mais cela limite la fonctionnalité des sessions. Si vous décidez de suivre ce conseil, alors en plus de session.use_trans_sid = 0, n'oubliez pas session.use_only_cookies = 1
Il est conseillé de lier la session à une adresse IP : ainsi, si l'identifiant est volé, le méchant ne pourra toujours pas l'utiliser dans la plupart des cas.
Il est recommandé d'utiliser la directive session.save_path, qui vous permet de définir votre propre répertoire pour enregistrer les fichiers de session. C'est plus sécurisé que de les stocker dans le répertoire temporaire partagé par défaut du serveur.

Informations Complémentaires:

  • En plus des cookies, le mécanisme de session envoie également des en-têtes qui interdisent la mise en cache des pages (le même limiteur de cache). Pour le HTML, c'est correct et nécessaire. Mais lorsque vous essayez d'envoyer un fichier à l'aide d'un script qui vérifie l'autorisation, Internet Explorer refuse de le télécharger. C'est à cause de ce titre. Appel
    session_cache_limiter("privé");
    doit résoudre le problème avant de commencer la séance.
  • Aussi étrange que cela puisse paraître, vous ne pouvez pas utiliser d'index numériques dans le tableau $_SESSION - $_SESSION, $_SESSION["10"] - les sessions ne fonctionneront pas.
  • Quelque part entre les versions 4.2 et 5.0, il n'était pas possible de définir session.use_trans_sid en utilisant ini_set() . À partir de la version 5.0, cela est déjà à nouveau possible.
  • Avant la version 4.3.3 du cookie, PHP envoyait un cookie uniquement s'il n'y avait aucun identifiant dans la requête au démarrage de la session. Désormais, le cookie est envoyé à chaque fois que session_start() est appelé

    Exemple d'autorisation utilisant des sessions
    Illustrons tout ce qui précède avec un petit exemple :
    Créons le fichier auth.php :
    if (isset($_POST [ "auth_name" ]))
    {
    $sql = "SELECT * FROM utilisateurs WHERE nom=?s";
    $row = $db -> getRow($sql, $_POST["auth_name"]);
    if ($row && password_verify ($_POST [ "auth_pass" ], $row [ "pass" ])) (
    $_SESSION [ "id_utilisateur" ] = $row [ "id" ];
    }
    header("Emplacement : http://" . $_SERVER [ "HTTP_HOST" ]. $_SERVER [ "REQUEST_URI" ]);
    sortie;
    }

    if (isset($_GET [ "action" ]) AND $_GET [ "action" ]== "déconnexion" ) (
    session_start();
    session_destroy();
    header("Emplacement : http://" . $_SERVER [ "HTTP_HOST" ]. "/" );
    sortie;
    }

    if (!isset($_SESSION [ "id_utilisateur" ])) (
    ?>








    sortie;
    }

    Il ne vous reste plus qu'à écrire la ligne dans tous les scripts protégés
    nécessite "auth.php" ;
    Cet exemple suppose que la session a déjà démarré et qu'une connexion à la base de données a été créée à l'aide de la classe pour un travail sûr et pratique avec MySQL. Cela suppose également que le mot de passe est haché à l’aide de la fonction password_hash recommandée.
    Exemple de fichier protégé :

    session_start();
    inclure "safemysql.class.php" ;
    $db = nouveau safemysql ([ "db" => "test" ]);
    inclure "auth.php" ;
    ?>
    secrète

    Se déconnecter

    OPS ! Liens très utiles :
    http://www.php.net/manual/ru/ref.session.php - les informations les plus récentes et les plus récentes sur la prise en charge des sessions en PHP dans la documentation officielle, ainsi que de nombreux commentaires d'utilisateurs. Lecture fortement recommandée.
    http://phpclub.ru/manrus/f/ref.session.html - Une traduction TRÈS obsolète de ce chapitre en russe, à partir de la documentation traduite par Alexander Pyramidin.
    http://phpclub.ru/detail/article/sessions
    Un article au titre pathétique « La vérité sur les sessions ». Laisse une impression ambivalente. Au début, l'auteur parle TRÈS clairement du mécanisme de session, mais les méthodes qu'il propose à la fin de l'article sont totalement floues.

    Un article de manuel de Dmitri Borodine du site
    http://php.spb.ru/ n'est fortement PAS recommandé.
    Les gars, c'est terriblement dépassé. Non seulement il contient des inexactitudes factuelles, mais les sessions en PHP n'ont tout simplement pas été utilisées depuis longtemps.
    Un grand merci à Dima pour cela, c'était le premier article sur les séances en russe, je l'ai étudié moi-même, mais maintenant je dois l'envoyer à un repos bien mérité.
    Malheureusement, de nombreux autres articles sur Internet qui n’ont pas été mis à jour depuis des années sont également obsolètes.

  • Les sessions en PHP sont un mécanisme permettant de stocker des informations sur l'ordinateur du client côté serveur. En fait, les sessions en PHP ne sont pas un sujet si complexe, mais pour le comprendre, vous devez savoir comment fonctionnent les cookies en PHP. Donc, si vous ne savez pas comment fonctionnent les cookies en PHP, lisez d'abord l'article correspondant, puis revenez ici.

    Le mot session est traduit de l'anglais par session, donc la signification même des sessions en PHP devient plus claire, mais les programmeurs ont adopté le terme « sessions », et nous l'utiliserons dans cet article.

    Les sessions en PHP sont très similaires au mécanisme des cookies, les mêmes paires clé => valeur, seulement elles sont stockées côté serveur.

    Fonction session_start()

    Nous devons démarrer la session, pour cela il y a la fonction session_start(). Cette fonction démarre une session, ou une session, quel que soit le nom que vous voulez lui donner.

    Il est conseillé d'appeler la fonction session_start() au tout début de la page, mais dans mes exemples je ne le fais pas.

    Tableau $_SESSION

    Les sessions sont des groupes de variables stockées sur le serveur mais faisant référence à un visiteur unique. Encore une fois, c'est le point clé : les sessions sont stockées sur le serveur.

    Afin de garantir que chaque visiteur interagit avec ses données de sa session, un cookie est utilisé, la commande pour créer que PHP se donne, vous n'avez pas à vous en préoccuper. Ce cookie concerne uniquement le serveur et ne peut pas être utilisé pour obtenir des données utilisateur.

    Sur le serveur, les données de session sont stockées dans un fichier texte et sont disponibles dans le programme PHP dans le tableau $_SESSION. Pour enregistrer une variable dans une session, vous devez lui attribuer une valeur dans ce tableau.

    Commençons enfin par utiliser des exemples. Tout est très simple.

    Séances en PHP sens."; ?>

    Essayons maintenant d'obtenir la valeur du tableau $_SESSION dans un autre exemple.

    Séances en PHP

    Veuillez noter que si dans le deuxième exemple nous supprimons la fonction session_start() alors nous n'aurons pas accès aux données du tableau $_SESSION.

    Fonction session_id()

    Une fois une session créée, vous avez automatiquement accès à l'identifiant unique de la session grâce à la fonction session_id(). Cette fonction vous permet à la fois de définir et d'obtenir la valeur de l'ID de session.

    Séances en PHP

    Vous pouvez regarder dans la barre d'outils développeur de votre navigateur (sous Chrome, appuyez sur Ctrl + Shift + I, puis Ressources, et vous y trouverez un cookie), ce domaine a installé un cookie pour votre navigateur avec le nom PHPSESSID et approximativement ce qui suit valeur : « 7g5df9rkd1hhvr33lq1k6c72p7 ».

    C'est par la valeur PHPSESSID que le serveur déterminera votre navigateur et travaillera avec l'ensemble de variables correspondant qui sera disponible pour le script via le tableau $_SESSION, comme écrit précédemment.

    fonction nom_session()

    Alors que la fonction session_id() vous permet d'obtenir la valeur de l'ID de session, la fonction session_name() vous permet d'obtenir le nom de la session.

    Séances en PHP

    Encore une fois à propos de la fonction session_start()

    Nous en savons maintenant plus sur le fonctionnement des sessions en PHP et nous devons à nouveau revenir à la fonction session_start(). Cette fonction initialise le mécanisme de session pour l'utilisateur actuel. Comment cela se passe-t-il exactement :

    • Si l'utilisateur a lancé le site pour la première fois, alors session_start() définit un cookie sur le client et crée un stockage temporaire sur le serveur associé à l'ID utilisateur.
    • Spécifie le magasin associé à l'ID actuel transmis.
    • S'il y a des données dans le stockage sur le serveur, elles sont placées dans le tableau $_SESSION.
    • Si register_globals du fichier php.ini est activé, alors tous les éléments du tableau $_SESSION sont transformés en variables globales.

    Exemple d'utilisation de session

    Nous allons maintenant regarder un exemple qui nous permettra de mener de petites expériences avec des sessions.

    Séances en PHP

    Comptoir

    Vous avez ouvert une page dans la session en coursune fois.

    Ouvrez l'exemple dans "> cet onglet.

    Tout le travail de session est basé sur le tableau $_SESSION, cela est clairement visible dans cet exemple.

    Si vous fermez la fenêtre du navigateur, la session se terminera et notre compteur sera remis à zéro. Ce comportement des sessions en PHP peut être modifié, nous reviendrons sur cette problématique un peu plus loin dans l'article.

    Terminer une session

    Pour terminer la séance, nous avons besoin de :

    1. Effacez le tableau $_SESSION.
    2. Supprimez le stockage temporaire sur le serveur.
    3. Supprimez les cookies de session.

    Vous pouvez effacer le tableau $_SESSION à l'aide de la fonction session_unset().

    La fonction session_destroy() supprime le stockage temporaire sur le serveur. D’ailleurs, elle ne fait rien d’autre.

    Vous devez supprimer un cookie de session à l'aide de la fonction setcookie(), que nous avons apprise dans la leçon sur l'utilisation des cookies en PHP.

    Exemple de fin de session :

    Terminer une session

    La séance est terminée.

    Vous pouvez maintenant mener une expérience : exécutez un exemple avec un compteur dans une fenêtre, augmentez le compteur, puis exécutez l'exemple avec suppression de session et actualisez à nouveau la page avec le compteur.

    Vous pouvez supprimer un fichier cookie comme ceci :

    setcookie(session_name(), "", time() - 60*60*24*32, "/")

    Encore une fois sur les fonctions session_name() et session_id()

    Les fonctions session_name() et session_id() sont rarement utilisées dans la pratique, mais j'écris à leur sujet car l'article doit révéler le mécanisme même du fonctionnement des sessions en PHP.

    Vous pouvez utiliser ces fonctions pour définir vos propres noms et identifiants de session, mais cela n'est pas recommandé. Si vous souhaitez les définir, écrivez ces fonctions avec des arguments avant la fonction session_start(), comme dans l'exemple ci-dessous :

    Séances en PHP

    En utilisant cet exemple, tous les utilisateurs se verront attribuer le même ID de session.

    Regardons de plus près ici : si vous exécutez l'exemple de la section sur la fonction session_name() (voici le lien) dans différents navigateurs (par exemple, Chrome et Internet Explorer), alors chaque navigateur aura son propre identifiant de session unique. . Les navigateurs stockent les cookies chacun dans leur propre dossier, donc la fonction session_start() permettra à chaque navigateur de créer son propre identifiant unique et, par conséquent, un stockage unique sera créé pour chaque navigateur sur le serveur. Par conséquent, le contre-exemple (celui-ci) fonctionnera indépendamment dans chaque navigateur.

    Si vous définissez le même ID de session pour tous les utilisateurs, ils travailleront avec le même stockage sur le serveur. Voici un exemple de compteur qui comptera les visites provenant de différents navigateurs :

    100) ( session_unset(); session_destroy(); ) ?> Séances en PHP

    Compteur n°2

    Ouvert la page dans différents navigateursune fois.

    Ouvrez l'exemple dans "> cet onglet.

    Si vous exécutez cet exemple, ce n’est pas un fait que vous en verrez un ici. D'autres visiteurs ont peut-être déjà modifié les valeurs dans le magasin de sessions sur le serveur. Je ne sais pas quand le serveur supprime le stockage dans ce cas, donc si le compteur dépasse 100, je mettrai fin à la session.

    Régler le temps d'attente

    Par défaut, la session "en direct" jusqu'à ce que le visiteur ferme la fenêtre du navigateur. Cela est dû au fait que la fonction session_start() place un tel cookie sur le client.

    La durée de vie de la session peut être modifiée à l'aide de la fonction session_set_cookie_params(), voici sa syntaxe.

    session_set_cookie_params (int durée de vie [, chemin de chaîne [, domaine de chaîne [, bool secure]]])

    En pratique, il suffit d'utiliser uniquement le premier paramètre (durée de vie), ici vous notez le temps en secondes, qui détermine combien de temps le serveur doit mémoriser l'état de la session après la fermeture du navigateur.

    L'effet de la fonction session_set_cookie_params() s'applique uniquement à la période pendant laquelle le script est en cours d'exécution.

    Voici un exemple d'utilisation de cette fonction :

    Séances en PHP

    Compteur n°3

    Valeur de compteur:.

    Ouvrez le compteur dans ">cet onglet.

    Remontez le compteur et fermez le navigateur, après 30 secondes, ouvrez à nouveau cet exemple. Votre session sera enregistrée.