cookie
Als Cookies ist die Internetwelt voll davon. Ohne cookie
werden schätzungsweise die meisten Website-Authentifizierungsfunktionen deaktiviert. Dies zeigt die Bedeutung von cookie
. Heute bringe ich euch ein paar Kleinigkeiten zu php
und cookie
. - Die Versuchsthemen in diesem Artikel sind rein
php
ohne jeglichen Rahmenphp
. Daher sind alle Schreibmethoden original, bitte beachten Sie. cookie
Bitte stellen Sie vor der Ausgabe sicher, dass keine Seiten ausgegeben werden. Selbst ein einzelnes Leerzeichen funktioniert nicht. Onkel Sunan erinnerte sich an die klassische Falle vonphp
für Neulinge: Wenn diephp
-Datei alsutf8
gespeichert wird, muss sienobom
sein.
Verwandte Empfehlungen: „PHP-Cookie (Sonderthema) “
Option 1: setcookie
Funktion
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
Die Funktionsbeschreibung finden Sie hier: https://doc.php.sh/zh/function.setcookie.html.
$name
Es versteht sich von selbst, dass der Projektname eines Cookies normalerweise ein String ähnlich „str“ ist, er liegt aber auch in Form eines Arrays vor, wie zum Beispiel „arr[one ]".$value
wird während des Übertragungsprozesses maskiert, beispielsweise werden Leerzeichen zu Pluszeichen usw. Die Escape-Funktion sollte laut Onkel Sunans Schlussfolgerung URL-Code sein.$expire
Der Zeitstempel, Sekunden statt Millisekunden, ist ein bestimmter Zeitpunkt, kein Zeitraum. PHP wird ihn weiter in das GMT-Format konvertieren. . Im Allgemeinen wird diese Zeit auf einen vergangenen Zeitpunkt zum Löschen von Cookies gesteuert. Wenn es leer bleibt oder mit 0 gefüllt wird, wird es während der Browsersitzung wirksam und wird ungültig, wenn der Browser geschlossen wird. Bei der Angabe der Ablaufzeit gibt es im http-Protokoll zwei Möglichkeiten: Expire und Max-Age. Derzeit ist die Ablaufzeit noch in PHP festgelegt, aber aus Sicht des http-Protokolls wird Expire bereits durch Max-Age ersetzt. Expire bezieht sich auf den Zeitpunkt des Ablaufs und max-age ist die Anzahl der Sekunden, nach denen es abläuft.$path
Das effektive Verzeichnis von Cookies wird normalerweise mit $domain konfiguriert und ist im Allgemeinen auf/
eingestellt.$domain
Dieser Parameter erfordert besondere Aufmerksamkeit. Wenn er nicht ausgefüllt ist, wird standardmäßig der aktuelle Domänenname verwendet. Wenn ausgefüllt, handelt es sich im Allgemeinen auch um einen Domainnamen, den Sie selbst über$_SERVER['SERVER_NAME']
erhalten müssen. Und wenn Sie es aktiv ausfüllen, umfasst der endgültige Cookie-Bereich alle ausgefüllten Subdomains. Wenn Sie „newsn.net“ eingeben, lautet der endgültige Wert bei der Anzeige im Browser „.newsn.net“. Beachten Sie, dass das Hinzufügen eines „.“ davor den Ausdrucksbereich erweitert.$secure
Ein weiterer sehr seltsamer Parameter, der是否仅仅通过安全的 HTTPS 连接传给客户端
bedeutet. Wenn es auf „true“ gesetzt ist und die aktuelle Website-Umgebung nicht https ist, ist das gesamte Cookie vollständig ungültig. Durch die Paketerfassung können wir jedoch feststellen, dass dieses Cookie von PHP gesetzt, aber auf der Browserseite ungültig gemacht wurde. In PHP können Sie mitisset($_SERVER["HTTPS"])
feststellen, ob https unterstützt wird.$httponly
Die Position dieses Parameters ist ebenfalls sehr umständlich, er ist der letzte aller optionalen Parameter. Um es festzulegen, müssen Sie zunächst$domain
und$secure
festlegen, zwei Werte, die unnötig erscheinen. In der aktuellen Netzwerkumgebung sollte $httponly ein dringend empfohlener Einstellungswert sein. Einzelheiten finden Sie im folgenden httponly-Artikel von Onkel Sunan: https://newsn.net/tag/httponly/.
Es ist also sehr wahrscheinlich, dass die php
-Anweisung, die Sie benötigen, so lautet:
setcookie("cookie_name", "cookie_value", time() + 3600, "/", $_SERVER['SERVER_NAME'], isset($_SERVER["HTTPS"]), true);
Option 2: setrawcookie
Funktion
bool setrawcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool$ httponly = false ]]]]]] )
setrawcookie
和setcookie
,基本一致,区别就在于对$value的处理。下面的两条语句是一致的效果:
setcookie($name,$value);setrawcookie($name,urlencode($value));
特别说明:
urlencode
和rawurlencode
是有区别的,两者的区别不在本篇文章中叙述。需要明确的就是,两者是有区别的。- 当
setrawcookie
的$value
,不进行encode
操作的话,如果里面含有空格的话,整条语句都是失效的。并且不会报错!所以,setrawcookie
必须联合urlencode
才能保证其正确性。但是这个时候,就不如使用setcookie
了。
方案三:header
输出cookie
set cookie
函数,如果想要生效,也是通过header
设置浏览器端进而生效的。所以通过header
输出也是可行的。那么关于写出几条等价的header
操作,大家对比学习一下:
header("Set-Cookie:cookie_name1_cp=" . urlencode("浏览器关闭失效"));setcookie("cookie_name1", "浏览器关闭失效");
header("Set-Cookie:cookie_name=" . urlencode("设置有效域名/https/httponly") . "; expires=" . gmstrftime("%a, %d-%b-%Y %H:%M:%S GMT", time() + 3600*24) . "; Max-Age=3600; path=/; domain= ".$_SERVER['SERVER_NAME']."; httponly");setcookie("cookie_name3", "设置有效域名/https/httponly", time() + 3600*24, "/", $_SERVER['SERVER_NAME'], isset($_SERVER["HTTPS"]),true);
需要注意的是:
- 设置内容的时候,会对特殊字符进行转义。
setcookie
的转义是自动的,header
的转义是主动的。 - 使用
header
的时候,过期时间是个gmt
时间字符串,而setcookie
是个时间戳。 - 设置域名的时候,两者都直接写的域名,但是生效的时候,生效的是.域名,就是说生效范围包括二级域名。
header
比setcookie
好的地方在于:它可以跳过哪些过期时间/域名/path等参数,直接设置httponly
。
最后对比
下面来个php
的cookie
相关函数的终极对决:
<?php $val="我是中文 newsn.net";setcookie("cookie_normal",$val);setrawcookie("cookie_raw",urlencode($val));setrawcookie("cookie_raw2",rawurlencode($val));header("Set-Cookie:cookie_header=带 空 + 格 的中文",false);?><script src="js/jquery-3.2.1.min.js"></script><script src="js/jquery.cookie.js"></script><script> var cookie_normal=$.cookie('cookie_normal'); var cookie_raw=$.cookie('cookie_raw'); var cookie_raw2=$.cookie('cookie_raw2'); var cookie_header=$.cookie('cookie_header'); document.write(document.cookie+"<br/><br/>normal:"+cookie_normal+",<br/>raw:"+cookie_raw+",<br/>raw2:"+cookie_raw2+",<br/>header:"+cookie_header);</script>
这些cookie
值使用了不同的方法进行了设置。里面含有空格和加号。从结果中,我们得出如下结论:
-
setcookie
和setrawcookie
中的中文,用document.cookie
不能顺利读出,但是用jquery.cookie
可以顺利读出。 -
jquery
的cookie
插件,均正确读取了php
端的各种cookie
值。但是读取header
中的值时,对加号的处理似乎有些问题。 -
document.cookie
,只能正常读取header
设置的中文。即使中文中带有空格,也能正常读取。这也是最正常,表现最好的组合。
Zusammenfassung
Oberflächlich betrachtet kann die Verwendung von header
zum Festlegen von cookie
und die Verwendung der Funktion setcookie
zum Festlegen von cookie
den gleichen Effekt erzielen. Onkel Sunan glaubt, dass die Verwendung von header
zum Festlegen von cookie
besser ist als setcookie
. Verwandte Themen werden im nächsten Artikel fortgesetzt. Bleiben Sie dran.
Im tatsächlichen Betrieb kommt es immer noch zu unerwarteten Dingen.