이 주제에서는 PHP 쿠키의 유래, PHP 쿠키의 속성, PHP 쿠키 기능의 사용법, PHP 쿠키의 실제 적용 사례를 사진, 텍스트, 동영상을 통해 종합적으로 소개합니다. PHP 중국어 웹사이트에서 배우는 학생들을 환영합니다!
One: 쿠키란 무엇인가요?
쿠키는 종종 사용자를 식별하는 데 사용됩니다.
쿠키는 서버가 이용자의 컴퓨터에 남겨두는 작은 파일입니다.
동일한 컴퓨터가 브라우저를 통해 페이지를 요청할 때마다 컴퓨터에서 쿠키가 전송됩니다.
PHP를 사용하면 쿠키 값을 생성하고 검색할 수 있습니다.
관련 주제 추천: php session
II: 쿠키의 탄생
HTTP 프로토콜은 Stateless이므로 서버 측 비즈니스는 Stateful이어야 합니다.
쿠키의 원래 목적은 서버 측 사용을 용이하게 하기 위해 웹에 상태 정보를 저장하는 것이었습니다.
예를 들어 사용자가 웹사이트를 처음 방문하는지 확인합니다. 최신 사양은 RFC 6265로, 브라우저 서버가 함께 작동하여 구현한 사양입니다.
3: 쿠키의 원리
웹사이트를 처음 방문하면 서버가 요청에 응답한 후 브라우저가 요청을 보냅니다. 처음 요청을 하면 쿠키가 전달되며, 서버는 사용자를 식별합니다. 물론 서버는 쿠키 내용을 수정할 수도 있습니다.
4: 쿠키 속성
쿠키는 이름(Name), 값(Value) 및 쿠키 유효 기간, 보안을 제어하는 데 사용되는 여러 가지로 구성된 4KB 이하의 작은 텍스트 데이터입니다. 및 사용법 선택적 속성의 범위입니다.
Name | 은 쿠키의 이름을 나타냅니다. |
Value | 은 쿠키의 가치를 나타냅니다. |
Domain |
쿠키에 액세스할 수 있는 웹사이트 또는 도메인을 지정합니다. 쿠키 메커니즘은 엄격한 동일 출처 정책을 따르지 않으므로 하위 도메인이 상위 도메인의 쿠키를 설정하거나 얻을 수 있습니다. |
Path | 는 쿠키에 액세스할 수 있는 웹사이트의 디렉터리를 정의합니다. |
Expires | 유효 기간은 그림의 Expires 속성입니다. 일반적으로 브라우저 쿠키는 기본적으로 세션을 종료하기 위해 브라우저를 닫으면 삭제됩니다. |
Secure |
쿠키를 보낼 때 HTTPS 보안 프로토콜을 사용할지 여부를 지정하세요. HTTPS 보안 프로토콜을 사용하면 브라우저와 웹 서버 간 전송 중에 쿠키가 도난당하거나 변조되는 것을 방지할 수 있습니다. 이 방법은 웹 사이트의 신원 인증에도 사용할 수 있습니다. 즉, HTTPS 연결 설정 단계에서 브라우저는 웹 사이트의 SSL 인증서의 유효성을 확인합니다. |
HttpOnly | 는 클라이언트 스크립트가 document.cookie 속성을 통해 쿠키에 액세스하는 것을 방지하여 크로스 사이트 스크립팅 공격으로 인해 쿠키가 도난당하거나 변조되는 것을 방지하는 데 사용됩니다. |
다섯 번째: PHP 쿠키 함수
1. setcookie - 쿠키 보내기
setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
setcookie()는 쿠키를 정의하고 나머지 HTTP 헤더와 함께 클라이언트에 전송됩니다.
다른 HTTP 헤더와 마찬가지로 쿠키는 스크립트가 출력을 생성하기 전에 전송되어야 합니다(프로토콜 제한으로 인해).
출력( 및
또는 공백 포함)을 생성하기 전에 이 함수를 호출하세요.쿠키가 설정되면 $_COOKIE를 사용하여 다음에 페이지를 열 때 읽을 수 있습니다.
$_REQUEST에도 쿠키 값이 존재합니다.
Parameters
Parameters | Description |
name | 쿠키 이름입니다. |
value | 쿠키 값. 이 값은 사용자의 컴퓨터에 저장됩니다. 민감한 정보는 저장하지 마세요. |
expire | 쿠키 만료 시간. 이것은 Unix 시대 이후의 초 수인 Unix 타임스탬프입니다. 즉, 기본적으로 time() 함수의 결과와 만료하려는 초 수를 사용할 수 있습니다. |
path | 쿠키 유효한 서버 경로입니다. '/'로 설정하면 쿠키가 전체 도메인 이름 도메인에 대해 유효합니다. '/foo/'로 설정하면 쿠키는 도메인의 /foo/ 디렉터리와 해당 하위 디렉터리에만 유효합니다. 기본값은 쿠키가 설정될 때의 현재 디렉터리입니다. |
domain | 쿠키에 유효한 도메인/하위 도메인입니다. 이를 하위 도메인 이름으로 설정하면 이 하위 도메인 이름과 세 번째 수준 도메인 이름에 대해 쿠키가 유효해집니다. 쿠키가 전체 도메인 이름에 유효하도록 하려면 해당 도메인 이름으로 설정하면 됩니다. |
secure | 이 쿠키가 보안 HTTPS 연결을 통해서만 클라이언트에 전달되는지 여부를 설정하세요. TRUE로 설정하면 보안 연결이 존재할 때만 쿠키가 설정됩니다. 이 요구 사항이 서버 측에서 처리되는 경우 프로그래머는 보안 연결을 통해서만 해당 쿠키를 보내면 됩니다. |
httponly | 이 TRUE로 설정되어 있으면 쿠키는 HTTP 프로토콜을 통해서만 액세스할 수 있습니다. 이는 JavaScript와 같은 스크립트 언어를 통해 쿠키에 접근할 수 없음을 의미합니다. XSS 공격 중 신원 도용을 효과적으로 줄이려면 이 설정을 사용하는 것이 좋지만 이 설명은 종종 논란의 여지가 있습니다. |
返回值
如果在调用本函数以前就产生了输出,setcookie() 会调用失败并返回 FALSE。
如果 setcookie() 成功运行,返回 TRUE。
示例
<?php $value = 'something from somewhere'; setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+3600); /* 1 小时过期 */ setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1); ?>
2、setrawcookie — 发送未经 URL 编码的 cookie
setrawcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
setrawcookie() 和 setcookie() 非常相似,唯一不同之处是发送到浏览器的 cookie 值没有自动经过 URL 编码(urlencode)。
六:PHP Cookie 简单示例
1、基本操作
<?php //添加Cookie setcookie('username', 'phpcn', time() + 3600); //获取Cookie $username = $_COOKIE['username']; //删除Cookie setcookie('username', '', time() - 3600); //修改Cookie setcookie('username', 'phpcn-updated', time() + 3600); ?>
2、面向过程封装
<?php /** * 获取 Cookie * @param string $name Cookie 名称 * @return mixed Cookie 值 */ function cookie_get($name) { return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null; } /** * 删除 Cookie * @param string $name Cookie 名称 */ function cookie_del($name) { setcookie($name, '', time() - 3600); } /** * 设置Cookie * @param string $name Cookie 名称 * @param mixed $value Cookie 值 * @param integer $expire Cookie 过期时间 * @param string $path Cookie 有效路径 * @param string $domian Cookie 有效域名/子域名 */ function cookie_set($name, $value, $expire = 3600, $path = '/', $domian = '') { setcookie($name, $value, time() + $expire); } /** * 检测 Cookie * @param string $name Cookie 名称 * @param boolean $has_empty 检测为空 * @return boolean */ function cookie_has($name) { return isset($_COOKIE[$name]); } ?>
3、面向对象封装
<?php class Cookie { const OPTION_EXPIRE = 'expire'; const OPTION_PATH = 'path'; const OPTION_DOMAIN = 'domain'; const OPTION_SECURE = 'secure'; const OPTION_HTTPONLY = 'httponly'; /** * Cookie 实例 * @var null */ private static $instance = null; /** * Cookie 选项 * @var array */ private $options = [ self::OPTION_EXPIRE => 3600, self::OPTION_PATH => '/', self::OPTION_DOMAIN => 'domain', self::OPTION_SECURE => false, self::OPTION_HTTPONLY => false ]; /** * Cookie constructor. * @param $options */ private function __construct($options) { $this->setOptions($options); } /** * privated __clone */ private function __clone() { } /** * 获取实例 * @param $options * @return Cookie|null */ public static function getInstance($options) { if (is_null(self::$instance)) { self::$instance = new self($options); } return self::$instance; } /** * 设置选项 * @param $name * @param $value */ public function setOption($name, $value) { if (isset($this->options[$name])) { $this->options[$name] = $value; } throw new InvalidArgumentException('Cookie option not exists:{$name}'); } /** * 设置多个选项 * @param $options */ public function setOptions($options) { foreach ($options as $name => $value) { $this->setOption($name, $value); } } /** * 设置 Cookie * @param $name * @param $value * @param array $options */ public function set($name, $value, $options = []) { $this->setOptions($options); if (is_array($value) || is_object($value)) { $value = json_encode($value); } setcookie( $name, $value, $this->options[self::OPTION_EXPIRE], $this->options[self::OPTION_PATH], $this->options[self::OPTION_DOMAIN], $this->options[self::OPTION_SECURE], $this->options[self::OPTION_HTTPONLY] ); } /** * 获取 Cookie * @param $name * @return array|mixed */ public function get($name) { $value = $_COOKIE[$name]; if (is_array($value)) { $arr=[]; foreach ($value as $k => $v) { $arr[$k] = substr($v, 0,1) == '{' ? json_decode($value) : $v; } return $arr; } else { return substr($value, 0,1) == '{' ? json_decode($value) : $value; } } /** * 删除 Cookie * @param $name * @param array $options */ public function del($name, $options = []) { $this->setOptions($options); $value = $_COOKIE[$name]; if ($value) { if (is_array($value)) { foreach ($value as $k => $v) { setcookie( $name . '[' . $k . ']', '', time() - 3600, $this->options[self::OPTION_EXPIRE], $this->options[self::OPTION_PATH], $this->options[self::OPTION_DOMAIN], $this->options[self::OPTION_SECURE], $this->options[self::OPTION_HTTPONLY] ); unset($v); } }else{ setcookie( $name, '', time() - 3600, $this->options[self::OPTION_EXPIRE], $this->options[self::OPTION_PATH], $this->options[self::OPTION_DOMAIN], $this->options[self::OPTION_SECURE], $this->options[self::OPTION_HTTPONLY] ); unset($value); } } } }
4、记住登录账号示例
<?php function cookie_get_username() { return isset($_COOKIE['username']) ? $_COOKIE['username'] : null; } function cookie_get_password() { return isset($_COOKIE['username']) ? $_COOKIE['username'] : null; } function cookie_get_remember() { return isset($_COOKIE['remember']) ? 'checked' : null; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = $_POST['username']; $password = $_POST['password']; if (isset($_POST['remember']) && $_POST['remember'] === '1') { setcookie('username', $username, time() + 3600); setcookie('password', $password, time() + 3600); setcookie('remember', '1', time() + 3600); } else { setcookie('username', '', time() - 3600); setcookie('password', '', time() - 3600); setcookie('remember', '', time() - 3600); } die('登录成功!'); } ?> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <form action="" method="post"> <table width="300" border="1" align="center" cellpadding="5" cellspacing="5"> <thead> <tr> <td colspan="2" align="center"><b>登录</b></td> </tr> </thead> <tr align="center"> <td>用 户 名</td> <td><input type="text" name="username" value="<?=cookie_get_username()?>"></td> </tr> <tr align="center"> <td>密码</td> <td><input type="password" name="password" value="<?=cookie_get_password()?>"></td> </tr> <tr align="center"> <td>记住账号</td> <td> <input type="checkbox" name="remember" value="1" <?=cookie_get_remember()?>> </td> </tr> <tr align="center"> <td colspan="2"><input type="submit" name="Submit" value="提交" /></td> </tr> </table> </form>
6. PHP会话控制:cookie和session区别与用法深入理解
9. JS读取PHP中设置的中文cookie时出现乱码怎么办
10. ThinkPHP6.0:Session和Cookie机制的变化
1. PHP中cookie怎么记录及删除变量?(图文+视频)
2. PHP cookie实现记录用户登陆信息的方法(图文+视频)