Heim > php教程 > PHP开发 > Hauptteil

So verhindern Sie, dass SESSION in PHP abläuft. Prinzip und Lösungseinführung

高洛峰
Freigeben: 2016-12-24 09:29:58
Original
1282 Leute haben es durchsucht

Wie man SESSION in PHP verwaltet und einige Gedanken, die sich daraus ergaben, enthielt ein relativ großes Formular. Viele Benutzer haben viel Zeit damit verbracht, es fertigzustellen. Sie entdeckten die SESSION, sobald sie abgelaufen war und das System beendet wurde, sodass es notwendig wurde, zu untersuchen, wie SESSION eingerichtet und online gehalten werden kann.

Was ist SITZUNG?
Laut WIKI-Erklärung handelt es sich bei SESSION um die interaktiven Informationen, die zwischen zwei Kommunikationsgeräten vorhanden sind. Sie werden zu einem bestimmten Zeitpunkt erstellt und verfallen nach einer bestimmten Zeitspanne. Zu den gängigen Sitzungen gehören: TCP-Sitzung, Web-Sitzung (HTTP-Sitzung), Anmeldesitzung usw.

Je nach den verschiedenen Standorten der Sitzungsimplementierung im OSI-Modell wird SESSION hauptsächlich in verschiedene Arten von Sitzungen unterteilt, einschließlich WEB-SESSION (HTTP-SESSION) und Telnet-Remote-Login-Sitzung Die Implementierung umfasst Session Initiation Protocol (SIP) und Internet Phone Call; TCP SESSION wird auf der Transportschicht implementiert.

In diesem Artikel geht es hauptsächlich um WEB-SESSION. Es gibt im Allgemeinen zwei Arten: clientseitige SESSION und serverseitige SESSION. Letztere ist die am häufigsten von Java Beans bereitgestellte.

Was macht SESSION?
Im Computerbereich, insbesondere im Netzwerk, wird SESSION besonders häufig verwendet. Es kann auch als Dialog (Dialog), Konversation usw. bezeichnet werden. Es bezieht sich im Allgemeinen auf den zwischen zwei Kommunikationsgeräten gespeicherten Zustand zwischen dem Benutzer und zwischen Computern (Anmeldesitzung).

Im Gegensatz zur zustandslosen Kommunikation wird SESSION normalerweise zum Speichern des Kommunikationsstatus verwendet. Daher muss mindestens eine der beiden Kommunikationsparteien den Verlauf von SESSION speichern, um eine Kommunikation zwischen beiden zu erreichen.

Wie wird SESSION (WEB SESSION) implementiert?
Wenn eine HTTP-Kommunikation zwischen dem Browser und dem Server durchgeführt wird, ist normalerweise ein HTTP-Cookie enthalten, um den Status zu identifizieren. Normalerweise zeichnet SESSION einige Verifizierungsinformationen und Ebenen des Benutzers auf.

Die in mehreren Programmiersprachen am häufigsten verwendeten HTTP-Sitzungstoken sind JSESSIONID (JSP), PHPSESSID (PHP) und ASPSESSIONID (ASP). Diese Kennung wird normalerweise durch eine Hash-Funktion generiert und kann diese eindeutig darstellen Benutzer Die Identität wird auf dem Client als GET- oder POST-Parameter gespeichert, wenn der Server mit dem Client kommuniziert.

Es gibt normalerweise zwei Möglichkeiten, SESSION zu implementieren: serverseitige SESSION und clientseitige SESSION. Beide Methoden haben ihre eigenen Vor- und Nachteile.

Serverseitige SESSION ist einfach zu implementieren und relativ effizient, aber wenn es um Lastausgleich oder Hochverfügbarkeitsanforderungen geht, ist sie schwieriger zu handhaben. Sie ist auch nicht verfügbar, wenn im Endogen kein Speichergerät vorhanden ist System. Der Lastausgleich kann durch die gemeinsame Nutzung von Dateisystemen erreicht werden oder indem Kunden gezwungen werden, sich nur bei einem Server anzumelden. Dies verringert jedoch die Effizienz. Bei Geräten ohne Speicher kann die serverseitige SESSION-Implementierung auch durch die Verwendung von RAM gelöst werden (siehe Referenz 6). Diese Methode ist für Systeme mit begrenzten Client-Verbindungen (z. B. Routing- oder Access Point-Geräte) effektiv.

Die Verwendung einer clientseitigen SESSION kann einige Probleme der serverseitigen SESSION lösen, z. B. die Vermeidung von Lastausgleichsalgorithmen usw., verursacht jedoch auch einige eigene Probleme. Client SESSION verwendet Cookies und Verschlüsselungstechnologie, um den Status zwischen verschiedenen Anforderungen zu speichern. Nach dem Ende jeder dynamischen Seite wird die aktuelle SESSION gezählt und an den Client zurückgesendet. Nach jeder erfolgreichen Anfrage wird das Cookie an den Server gesendet, damit sich der Server die Identität des Benutzers „merkt“. Das wichtigste Problem bei Client SESSION ist die Sicherheit. Sobald das Cookie gekapert oder manipuliert wird, geht die Sicherheit der Benutzerinformationen verloren.

Wie stelle ich SESSION in PHP ein?
Nachdem Sie die PHP-Entwicklungsumgebung eingerichtet haben, können Sie die SESSION-bezogenen Teile über phpinfo() anzeigen, einschließlich:
Das SESSION-Modul verfügt in der PHP-Version V5.2.9 über insgesamt 25 Variablen. Unter ihnen sind einige, die häufig im Alltag verwendet werden:

session.cookie_lifetime 设置存储SESSIONID的cookie过期时间
session.name SESSION的COOKIE名称,默认为PHPSESSID
session.save_handler SESSION的存储方式,默认为FILE
session.save_path Fedora下面默认存储在/var/lib/php/session
session.gc_probability
session.gc_divisor
session.gc_maxlifetime 这三个选项用来处理GC机制发生的机率
session.cache_limiter (nocache,private,private_no_expire,public)
session.cache_expire 这两个选项是用来缓存SESSION的页面
Nach dem Login kopieren

Betrachten wir zunächst die erste Frage: Wie lange dauert es, bis SESSION abläuft, und wie läuft sie ab? Wenn Sie SESSION in einem PHP-Programm verwenden möchten, müssen Sie zuerst auf session_start() verweisen. Sobald diese Funktion ausgeführt wird, wird eine SESSION-Datei im Speicherverzeichnis von SESSION generiert (sofern ein Dateihandler verwendet wird). leer. Gleichzeitig wird beim Durchsuchen des Servers ein Cookie namens PHPSESSID angezeigt, das einen gehashten SESSION-Namen speichert.


Der Ablauf von SESSION hängt von einem Speicherbereinigungsmechanismus (Garbage Collection) ab. Nachdem SESSION erstellt wurde, wird es als Datei auf dem Server gespeichert Variablen in SESSION jedes Mal, wird die Zugriffszeit der SESSION-Datei aktualisiert. Bei jedem Besuch wird die auf dem Server gespeicherte eindeutige SESSION basierend auf der auf dem Client gespeicherten SESSIONID angefordert. Wenn das Cookie des Clients abläuft, ist es unmöglich zu wissen, auf welche SESSION zugegriffen werden soll, obwohl auf die SESSION-Datei auf dem Server noch nicht zugegriffen wurde Der Ablauf führt zu einer Verschwendung von Serverressourcen.

但是同时,如果我们希望用户的session马上过期的话,我们就可以通过设置cookie的办法来实现。SESSION的回收是在每次访问页面的时候进 行的,回收的机率由session.gc_probability,session_gc_divisor指定,默认士1/100。如果设置为1,则每次 超过了SESSION的生存周期去访问的话,SESSION一定会被回收。

两种需求:
1、保持SESSION不过期或延长SESSION过期时间;
2、使SESSION立即过期。

1、保持SESSION不过期和延长SESSION过期时间非常必要,特别是在内部应用系统中或者有很大的表单的时候。想想你的老板在填写一个表单,刚好 碰上午饭时间,留着这个表单等吃饭回来,填写完剩余的内容,提交后他看到什么,一般来说都是一个登录界面。想要提高用户体验,关键是要让老板的表单不出问 题,我们就必须延长SESSION的生存周期。

保持SESSION不过期和延长SESSION过期时间,可以通过设置session.gc_maxlifetime来实现,不过首先需要保证客户端的 cookie不会在gc执行回收之前失效。通过设置一个较长的gc_maxlifetime可以实现延长session的生存周期,可是对于不是所有请求 都会保持很久的应用来说,这么做对于服务器配置显然不是一个最佳的选择。
我们知道SESSION的回收机制是根据SESSION文件的最后访问时间来判断的,如果超过了maxlifetime,则根据回收机率进行回收。所以我们只需要定期的去访问一下SESSION就可以了,而这可以通过刷新页面来实现,根据这个思路,解决的方法就有了。

通过JS定期的去访问页面;
利用Iframe定期的刷新页面;

直接利用程序发送HTTP请求,这样就可以避免在页面中嵌入其他的元素;

下面是利用JS发送请求实现的保持SESSION不过期的实现方法,这样我们就只需要在需要SESSION保持长时间的页面(比如大表单页面)。

<script type=”text/javascript”>
 function keepMeAlive(imgName){
myImg = document.getElementById(imgName);
 if(myImg) myImg.src = myImg.src.replace(/\?.*$/, ‘?&#39; + Math.random());
}
window.setInterval(“keepMeAlive(‘phpImg&#39;);”, 4000);
 </script>
Nach dem Login kopieren


其中URL后加入一个随机数是为了避免这个链接的请求被浏览器缓存。


2、使SESSION立即过期的方法就比较多了,我们可以session_destroy(),也可以用上面的思路,请求一个session_destroy的页面。

SESSION安全吗?
PHP的手册中明确写出:SESSION并不能保证储存在SESSION中的信息一定只能被他的创建者所看到。

如果想要安全的处理一些远程的操作,那么HTTPS是唯一的选择。最基本的,不要认为一个用户信息在SESSION中存在就认为这个用户一定就是他本人, 虽然SESSION中的信息会给你他已经经过了用户名和密码验证的假象。所以,如果需要做一些修改密码或者类似的事情的时候,让用户重新输入密码是一个比 较好的选择。

早期的Apache版本并没有采用COOKIE的方式来存储PHPSESSID,而是采用的URL-rewrite,也就是每个URL后面都会加上 PHPSESSID=来表明它属于那个激活的SESSION,新版的Apache已经将这个属性设置为默认关闭。

session.use_trans_id = 0;
Nach dem Login kopieren

所以从这个意义上来讲,延长SESSION的时间过长或者保持SESSION一直在线对于安全来说始终不是一件好事情。终极的解决办法就是用户提交跳转到 登录窗口,登录后又能够回到填写页面,并且所有的数据都还在。这个的实现方式现在用Ajax来解决应该没什么困难,每隔一定时间就把当前的用户数据 POST到一个存储位置,不管是XML或者JSON。


拾遗:
对于客户端不支持JavaScript的情况可以采用的方法:
1、写一个浮层,显示在最顶层,如果用户未禁用JS,则让浮层消失;
2、将所有的INPUT都设置为disable,然后再用JS设置为enabled;
以上这两种方式都是在JS被禁用的时候,所有功能都不能用,如何在JS被禁用的情况下使我们的应用仍然正常工作,这个貌似就比较困难。实现这个的所花的时间和所收到的效果大家要权衡一下。

更多PHP中怎样保持SESSION不过期 原理及方案介绍相关文章请关注PHP中文网!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage