cookieAls 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 Rahmen php. Daher sind alle Schreibmethoden original, bitte beachten Sie.
  • cookieBitte 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 von php für Neulinge: Wenn die php-Datei als utf8 gespeichert wird, muss sie nobom sein.

Verwandte Empfehlungen: „PHP-Cookie (Sonderthema)

Option 1: setcookie Funktion

PHP
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
Nach dem Login kopieren

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 mit isset($_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:

PHP
setcookie("cookie_name", "cookie_value", time() + 3600, "/", $_SERVER['SERVER_NAME'], isset($_SERVER["HTTPS"]), true);
Nach dem Login kopieren

Option 2: setrawcookieFunktion

PHP
bool setrawcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool$ httponly = false ]]]]]] )
Nach dem Login kopieren

setrawcookiesetcookie,基本一致,区别就在于对$value的处理。下面的两条语句是一致的效果:

PHP
setcookie($name,$value);setrawcookie($name,urlencode($value));
Nach dem Login kopieren

特别说明:

  • urlencoderawurlencode是有区别的,两者的区别不在本篇文章中叙述。需要明确的就是,两者是有区别的。
  • setrawcookie$value,不进行encode操作的话,如果里面含有空格的话,整条语句都是失效的。并且不会报错!所以,setrawcookie必须联合urlencode才能保证其正确性。但是这个时候,就不如使用setcookie了。

方案三:header输出cookie

set cookie函数,如果想要生效,也是通过header设置浏览器端进而生效的。所以通过header输出也是可行的。那么关于写出几条等价的header操作,大家对比学习一下:

PHP
header("Set-Cookie:cookie_name1_cp=" . urlencode("浏览器关闭失效"));setcookie("cookie_name1", "浏览器关闭失效");
Nach dem Login kopieren

PHP setzt Cookies [drei Optionen]

PHP
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);
Nach dem Login kopieren

PHP setzt Cookies [drei Optionen]

需要注意的是:

  • 设置内容的时候,会对特殊字符进行转义。setcookie的转义是自动的,header的转义是主动的。
  • 使用header的时候,过期时间是个gmt时间字符串,而setcookie是个时间戳。
  • 设置域名的时候,两者都直接写的域名,但是生效的时候,生效的是.域名,就是说生效范围包括二级域名。
  • headersetcookie好的地方在于:它可以跳过哪些过期时间/域名/path等参数,直接设置httponly

最后对比

下面来个phpcookie相关函数的终极对决:

PHP
<?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(&#39;cookie_normal&#39;);  var cookie_raw=$.cookie(&#39;cookie_raw&#39;);  var cookie_raw2=$.cookie(&#39;cookie_raw2&#39;);  var cookie_header=$.cookie(&#39;cookie_header&#39;);
  document.write(document.cookie+"<br/><br/>normal:"+cookie_normal+",<br/>raw:"+cookie_raw+",<br/>raw2:"+cookie_raw2+",<br/>header:"+cookie_header);</script>
Nach dem Login kopieren

PHP setzt Cookies [drei Optionen]

这些cookie值使用了不同的方法进行了设置。里面含有空格和加号。从结果中,我们得出如下结论:

  • setcookiesetrawcookie中的中文,用document.cookie不能顺利读出,但是用jquery.cookie可以顺利读出。
  • jquerycookie插件,均正确读取了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.