cookie
En 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 cadrephp
. Par conséquent, toutes les méthodes d’écriture sont natives, sachez-le. cookie
Avant 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 dephp
pour les débutants : lorsque le fichierphp
est enregistré sousutf8
, il doit êtrenobom
.
Recommandations associées : "cookie php (sujet spécial) "
Option 1 : setcookie
function
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
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 utiliserisset($_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 :
setcookie("cookie_name", "cookie_value", time() + 3600, "/", $_SERVER['SERVER_NAME'], isset($_SERVER["HTTPS"]), true);
Option 2 : setrawcookie
Fonction
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
设置的中文。即使中文中带有空格,也能正常读取。这也是最正常,表现最好的组合。
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.