cookieEn tant que cookies, le monde Internet en regorge. Sans cookie, on estime que la plupart des fonctions d'authentification des sites Web seront désactivées. Cela montre l’importance de cookie. Aujourd'hui je vous apporte quelques petites choses sur php et cookie.
  • Les sujets expérimentaux de cet article sont purs php sans aucun cadre php. Par conséquent, toutes les méthodes d’écriture sont natives, sachez-le.
  • cookieAvant la sortie, veuillez vous assurer qu'aucune page n'est sortie. Même un seul caractère d'espacement ne fonctionnera pas. Oncle Sunan s'est souvenu du piège classique de php pour les débutants : lorsque le fichier php est enregistré sous utf8, il doit être nobom.

Recommandations associées : "cookie php (sujet spécial) "

Option 1 : setcookie function

PHP
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
Copier après la connexion

La description de la fonction est ici : https://doc.php.sh/zh/function.setcookie.html.

  • $name Il va sans dire que le nom de projet d'un cookie est généralement une chaîne similaire à "str", mais il se présente également sous la forme d'un tableau, tel que "arr[one ]".
  • $value sera échappé pendant le processus de transmission, par exemple, les espaces deviendront des signes plus, etc. La fonction d'échappement, selon l'inférence de l'oncle Sunan, devrait être le code urlen.
  • $expire L'horodatage, les secondes au lieu des millisecondes, le délai d'expiration du cookie, est un moment spécifique, pas une période de temps, PHP le convertira ensuite au format GMT. . Généralement, ce délai est contrôlé par un délai passé pour supprimer les cookies. S'il est laissé vide ou rempli avec 0, il prendra effet pendant la session du navigateur et deviendra invalide à la fermeture du navigateur. Lorsqu'on indique le délai d'expiration, il y en a deux dans le protocole http, expire et max-age. Actuellement, le délai d'expiration est toujours défini en PHP, mais du point de vue du protocole http, expire a commencé à être remplacé par max-age. Expire fait référence au moment d'expiration et max-age est le nombre de secondes après lequel il expirera.
  • $path Le répertoire effectif des cookies est généralement configuré avec $domain, et est généralement défini sur /.
  • $domain Ce paramètre nécessite une attention particulière. S'il n'est pas renseigné, il sera par défaut le nom de domaine actuel. S'il est renseigné, de manière générale, il s'agit également d'un nom de domaine que vous devez obtenir vous-même en utilisant $_SERVER['SERVER_NAME']. Et si vous le remplissez activement, la portée finale du cookie couvrira tous les sous-domaines renseignés. Si vous remplissez « newsn.net », alors lorsqu'elle est reflétée dans le navigateur, la valeur finale est « .newsn.net ». Notez que l'ajout d'un "." devant élargit la plage d'expression.
  • $secure Un autre paramètre très bizarre, qui signifie 是否仅仅通过安全的 HTTPS 连接传给客户端. S'il est défini sur true, si l'environnement actuel du site Web n'est pas https, alors l'intégralité du cookie sera complètement invalide. Cependant, nous pouvons constater grâce à la capture de paquets que ce cookie a été défini par PHP, mais a été invalidé du côté du navigateur. En php, vous pouvez utiliser isset($_SERVER["HTTPS"]) pour déterminer si https est pris en charge.
  • $httponly La position de ce paramètre est également très gênante, c'est le dernier de tous les paramètres facultatifs. Pour le paramétrer, vous devez d'abord définir $domain et $secure, deux valeurs qui semblent inutiles. Dans l’environnement réseau actuel, $httponly devrait être une valeur de paramètre fortement recommandée. Pour plus de détails, veuillez vous référer à l'article de suivi httponly d'Oncle Sunan : https://newsn.net/tag/httponly/.

Donc, il est très probable que la déclaration php dont vous avez besoin ressemble à ceci :

PHP
setcookie("cookie_name", "cookie_value", time() + 3600, "/", $_SERVER['SERVER_NAME'], isset($_SERVER["HTTPS"]), true);
Copier après la connexion

Option 2 : setrawcookieFonction

PHP
bool setrawcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool$ httponly = false ]]]]]] )
Copier après la connexion

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

PHP
setcookie($name,$value);setrawcookie($name,urlencode($value));
Copier après la connexion

特别说明:

  • 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", "浏览器关闭失效");
Copier après la connexion

PHP définit les cookies [trois options]

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);
Copier après la connexion

PHP définit les cookies [trois options]

需要注意的是:

  • 设置内容的时候,会对特殊字符进行转义。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>
Copier après la connexion

PHP définit les cookies [trois options]

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

  • setcookiesetrawcookie中的中文,用document.cookie不能顺利读出,但是用jquery.cookie可以顺利读出。
  • jquerycookie插件,均正确读取了php端的各种cookie值。但是读取header中的值时,对加号的处理似乎有些问题。
  • document.cookie,只能正常读取header设置的中文。即使中文中带有空格,也能正常读取。这也是最正常,表现最好的组合。

Résumé

En surface, utiliser header pour définir cookie et utiliser la fonction setcookie pour définir cookie peut obtenir le même effet. Oncle Sunan pense qu'utiliser header pour définir cookie est mieux que setcookie. Les questions connexes seront poursuivies dans le prochain article. Restez à l'écoute.

En fonctionnement réel, il y a encore des choses inattendues.