跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP Cookie安全
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP Cookie安全 = Cookie是Web开发中用于在客户端存储数据的常用技术,PHP提供了便捷的Cookie操作函数。然而,不正确的Cookie使用可能导致严重的安全问题,如会话劫持、跨站脚本攻击(XSS)等。本章将全面讲解PHP Cookie的安全实践。 == 基本概念 == '''Cookie'''是由服务器发送到用户浏览器并保存在本地的小型数据片段,浏览器会在后续请求中自动携带这些数据。PHP通过<code>setcookie()</code>函数设置Cookie: <syntaxhighlight lang="php"> // 设置一个简单Cookie setcookie("username", "john_doe", time() + 3600, "/"); </syntaxhighlight> == 主要安全风险 == {| class="wikitable" |+ 常见Cookie安全风险 ! 风险类型 !! 描述 !! 潜在影响 |- | 会话劫持 || 攻击者窃取用户Cookie || 冒充用户身份 |- | 跨站脚本(XSS) || 恶意脚本读取Cookie || 数据泄露 |- | 跨站请求伪造(CSRF) || 利用用户Cookie发起请求 || 未授权操作 |} == 安全防护措施 == === 1. HttpOnly属性 === 防止JavaScript访问Cookie,缓解XSS攻击: <syntaxhighlight lang="php"> setcookie("session_id", "abc123", [ 'expires' => time() + 3600, 'path' => '/', 'httponly' => true ]); </syntaxhighlight> === 2. Secure属性 === 仅通过HTTPS传输Cookie: <syntaxhighlight lang="php"> setcookie("auth_token", "xyz456", [ 'expires' => time() + 3600, 'path' => '/', 'secure' => true, 'httponly' => true ]); </syntaxhighlight> === 3. SameSite属性 === 控制跨站请求时是否发送Cookie: <syntaxhighlight lang="php"> setcookie("csrftoken", "789def", [ 'expires' => time() + 3600, 'path' => '/', 'samesite' => 'Strict' ]); </syntaxhighlight> {| class="wikitable" |+ SameSite属性取值 ! 值 !! 描述 |- | Strict || 完全禁止跨站发送 |- | Lax || 允许部分安全跨站请求 |- | None || 允许所有跨站请求(需配合Secure) |} === 4. 内容加密 === 敏感数据应加密存储: <syntaxhighlight lang="php"> $data = "sensitive_info"; $iv = openssl_random_pseudo_bytes(16); $encrypted = openssl_encrypt($data, 'AES-256-CBC', 'secret_key', 0, $iv); setcookie("enc_data", base64_encode($iv.$encrypted), [ 'expires' => time() + 3600, 'path' => '/', 'httponly' => true ]); </syntaxhighlight> == 实际应用案例 == '''用户登录系统安全实现''' <mermaid> sequenceDiagram participant User participant Browser participant Server User->>Browser: 输入凭据 Browser->>Server: POST登录请求 Server->>Server: 验证凭据 Server->>Browser: 设置安全Cookie Browser->>Server: 后续请求携带Cookie Server->>Server: 验证Cookie Server->>Browser: 返回受保护内容 </mermaid> 对应PHP实现代码: <syntaxhighlight lang="php"> // 登录验证成功时 if ($login_success) { $token = bin2hex(random_bytes(32)); setcookie('auth_token', $token, [ 'expires' => time() + 86400, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]); // 服务器端存储token关联用户 $_SESSION['token'] = $token; $_SESSION['user_id'] = $user_id; } </syntaxhighlight> == 高级安全实践 == === 1. Cookie签名 === 防止篡改: <syntaxhighlight lang="php"> function setSignedCookie($name, $value, $secret) { $signature = hash_hmac('sha256', $value, $secret); setcookie($name, $value.'|'.$signature, [ 'expires' => time() + 3600, 'path' => '/', 'httponly' => true ]); } function verifySignedCookie($name, $secret) { if (!isset($_COOKIE[$name])) return false; list($value, $signature) = explode('|', $_COOKIE[$name], 2); $expected = hash_hmac('sha256', $value, $secret); return hash_equals($expected, $signature) ? $value : false; } </syntaxhighlight> === 2. 动态Cookie === 定期更换Cookie值: <syntaxhighlight lang="php"> function rotateCookie() { if (isset($_COOKIE['session'])) { $new_value = substr(md5($_COOKIE['session'].microtime()), 0, 16); setcookie('session', $new_value, [ 'expires' => time() + 1800, // 30分钟有效期 'path' => '/', 'httponly' => true ]); return $new_value; } return false; } </syntaxhighlight> == 数学基础 == Cookie安全性可以量化为: <math> S = \frac{\sum_{i=1}^{n} (A_i \times W_i)}{T} </math> 其中: * <math>A_i</math> = 安全措施强度(0-1) * <math>W_i</math> = 措施权重 * <math>T</math> = Cookie有效期(小时) == 最佳实践总结 == * 始终设置HttpOnly和Secure属性 * 对敏感数据使用SameSite=Strict * 加密存储敏感信息 * 实现短有效期和自动过期 * 使用签名防止篡改 * 定期轮换Cookie值 * 避免在Cookie中存储敏感数据 通过遵循这些实践,可以显著提高PHP应用中使用Cookie的安全性。 [[Category:编程语言]] [[Category:PHP]] [[Category:PHP会话与cookie]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)