目录

  • 1 Cookie 理论基础
    • 1.1 Cookie 简介
    • 1.2 Cookie 认证机制
    • 1.3 Cookie 属性
    • 1.4 Cookie的安全性问题
  • 2 Cookie 应用
    • 2.1 Cookie 相关操作命令
    • 2.2 应用案例实验
      • 2.2.1 实验要求
      • 2.2.2 实验环境
      • 2.2.3 案例代码
      • 2.2.4 实验测试
  • 3 威胁与防护
    • 3.1 安全威胁
    • 3.2 安全防护
      • 3.2.1 Web服务器端防护
      • 3.2.2 客户端浏览器防护
      • 3.2.3 主机的安全防护
  • 4 总结
  • 参考文献

1 Cookie 理论基础

1.1 Cookie 简介

  1. Cookie 并不是它的原意“甜饼”的意思,而是一个保存在客户机中的简单的文本文件,这个文件与特定的 Web 文档关联在一起,保存了该客户机访问这个Web 文档时的信息,当客户机再次访问这个 Web 文档时这些信息可供该文档使用。
  2. 作用:由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序 [2] 。

1.2 Cookie 认证机制

在 Web认证中 ,因为HTTP协议本身的局限,必须采用其他技术将相关认证标记以某种方式持续传送,以免客户从一个页面跳转至另一个页面时重新输入认证信息。基于Cookie的认证过程,主要由以下三个阶段组成:

  1. 发布Cookie。
    当用户试图访问某Web站点中需要认证的资源时,Web服务器会检查用户是否提供了认证Cookie,如果没有,则将用户重定向到登录页面。在用户成功登录后,Web服务器会产生认证Cookie,并通过HTTP响应中的Set-Cookie头发送给客户端,用于对用户随后的请求进行检查和验证,接着将用户重定向到初始请求的资源。
  2. 检索Cookie。
    在用户随后的访问请求中,客户端浏览器检索Path和Domain等属性与用户请求资源相匹配的Cookie,并将找到的Cookie通过HTTP请求中的Cookie头提交给Web服务器。
  3. 验证Cookie.
    Web服务器提取客户端浏览器递交的Cookie,验证其中的访问令牌。若合法,则将访问请求的资源发送给客户端浏览器;反之则拒绝用户的访问请求。Cookie 认证技术简化了用户访问 Web 网站资源的过程,即用户只需在初次登录网站时输入身份信息进行认证,随后便可以访问被授权的所有站点资源,不再需要重复手工提交身份信息。

1.3 Cookie 属性

  1. Name/Value:设置Cookie的名称及相对应的值,对于认证Cookie,Value值包括Web服务器所提供的访问令牌。
  2. Expires属性:设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效。
  3. Path属性:定义了Web站点上可以访问该Cookie的目录。
  4. Domain属性:指定了可以访问该 Cookie 的 Web 站点或域。Cookie 机制并未遵循严格的同源策略,允许一个子域可以设置或获取其父域的 Cookie。当需要实现单点登录方案时,Cookie 的上述特性非常有用,然而也增加了 Cookie受攻击的危险,比如攻击者可以借此发动会话定置攻击。因此,浏览器禁止在 Domain 属性中设置.org、.com 等通用顶级域名、以及在国家及地区顶级域下注册的二级域名,以减小攻击发生的范围。
  5. Secure属性:指定是否使用HTTPS安全协议发送Cookie。
    使用HTTPS安全协议,可以保护Cookie在浏览器和Web服务器间的传输过程中不被窃取和篡改。该方法也可用于Web站点的身份鉴别,即在HTTPS的连接建立阶段,浏览器会检查Web网站的SSL证书的有效性。但是基于兼容性的原因(比如有些网站使用自签署的证书)在检测到SSL证书无效时,浏览器并不会立即终止用户的连接请求,而是显示安全风险信息,用户仍可以选择继续访问该站点。由于许多用户缺乏安全意识,因而仍可能连接到Pharming攻击所伪造的网站。
  6. HTTPOnly 属性:用于防止客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HTTPOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;此外大多数浏览器仍允许通过XMLHTTP对象读取HTTP响应中的Set-Cookie头。

1.4 Cookie的安全性问题

通过Cookie在客户端与服务器端进行交互,最终实现对用户身份的认证,Cookie成了用户整个身份的代替,其安全性决定了整个系统的安全性,Cookie的安全性问题主要有以下几方面:

  • Cookie被用户非法篡改,如篡改其中的expire项,可将Cookie的有效期延长;篡改path项可使用户能够访问服务器上不被授权的内容;或修改domain项,使用户能够访问不被授权的服务器从而获得合法用户的信息等;
  • 被非法用户非法截获,然后在有限期内重放,则非法用户将享有合法用户的合法权益,可能会损害网站方的利益;
  • 若Cookie被服务器加密,而非法用户通过强力攻击或其他手段获得了相应的加密密钥,则非法用户可以伪造任何合法Cookie,从而可以访问合法用户的所有个性化信息,甚至是账户信息等。

2 Cookie 应用

2.1 Cookie 相关操作命令

  1. 设置Cookie属性命令:setcookie()
  2. 接受Cookie信息命令:$_COOKIE,利用预定义全局变量获取。
  3. 注销命令:setcookie("name", $_COOKIE['name'], time()-3600),修改设置命令并将有效期设置为当前时刻之前。
  4. setcookie()函数说明,该函数返回值为布尔类型,可以使用isset()函数判断是否成功设置Cookie。
setcookie(string $name,string $value = "",int $expires = 0,string $path = "",string $domain = "",bool $secure = false,bool $httponly = false
): bool

2.2 应用案例实验

2.2.1 实验要求

  1. 编写网站首页。当客户访问首页时,验证请求是否含有Cookie,如果有则显示“详细信息”并显示注销按钮(跳转至注销页面),如果没有则要求登录并显示登录按钮(跳转至登录页面)。
  2. 编写登录页面。假设已有注册用户libai,密码为123456。登录页面利用HTML表单收集客户端输入信息,利用PHP语句判断账户密码是否正确,正确则设置Cookie并返回首页,错误则要求继续输入账号密码。
  3. 编写注销页面。注销后返回首页。

2.2.2 实验环境

  1. 服务端:本实验基于虚拟机win2008系统的WAMP环境进行,该环境相关配置过程参考文章《win2008R2SP1+WAMP环境部署》
  2. 客户端:浏览器通过IP地址访问所编写网页。
  3. 服务端与客户端处于同一个局域网下。

2.2.3 案例代码

index.php 首页代码:

<meta charset="utf-8">
<h1>COOKIE学习应用示例</h1>
<?php
if (isset($_COOKIE['name'])){echo "欢迎测试代码,{$_COOKIE['name']}<br>";echo "<a href='./logout.php'>注销</a>";}else{echo "<a href='./login.php'>请登录</a>";}
?>

login.php 登录页面代码:

<html>
<meta charset="utf-8">
<?php
if (isset($_GET[ 'userSubmit' ])){if (isset($_GET[ 'userName' ]) && $_GET[ 'userName' ] == "libai"&& isset($_GET[ 'userPass' ]) && $_GET[ 'userPass' ] == "123456"){setcookie("name","libai");if(isset($_COOKIE)){echo "登录成功,<a href='./index.php'>返回首页</a>";}else {echo "COOKIE设置失败";}}else{echo "用户名或密码错误,请重新登录";}}
//else
//{echo "Error!<a href=''>请通过表单登录</a>";}
?>
<h1>用户登录<h1>
<form action = ""method = "get"target = "_blank"
>
用户名:<input type = "text" name = "userName"><br>
密码:<input type = "password" name = "userPass"><br>
<input type="submit" name="userSubmit" value="登录">
</form>
</html>

2.2.4 实验测试

  1. 使用浏览器访问首页。
  2. 点击“请登录”进入登录页面。
  3. 输入用户名:libai,密码123456。点击登录,提示登录成功,点击返回首页。
  4. 登录后的首页显示内容与未登录不一样,因为代码根据是否有COOKIE进行判断并分支执行。
  5. 点击注销进入注销页面。

3 威胁与防护

3.1 安全威胁

  1. Cookie捕获/重放
    攻击者可以通过木马等恶意程序,或使用跨站脚本攻击等手段偷窃存放在用户硬盘或内存中的Cookie。借助网络攻击手段,包括在不安全的局域网中被动地监听网络通信;通过攻击网络用户的路由器,或通过搭建恶意的无线路由器等手法,控制路由基础设施,将网络流量重定向到攻击者控制的主机;发动DNSPharming(域欺骗)攻击,通过DNS缓存中毒、DNS应答欺骗、或修改用户端的本地域名解析文件等方法攻击DNS系统,导致用户对合法网站的访问请求被重定向到恶意网站等等,同样可能窃取Cookie。对于捕获到的认证Cookie,攻击者往往会猜测其中的访问令牌,试图获取会话ID、用户名与口令、用户角色、时间戳等敏感信息;或者直接重放该Cookie,假冒受害者的身份发动攻击。
  2. 恶意 Cookies
    Cookies 是文本文件, 一般情况下认为它不会造成安全威胁。 但是,如果在 Cookies 中通过特殊标记语言,引入可执行代码,就很可能给用户造成严重的安全隐患。HTML 为区别普通文本和标记语言,用符号“<>”来指示HTML 代码。 这些 HTML 代码或者定义 Web 网页格式,或者引入 Web 浏览器可执行代码段。 Web 服务 器可以使用Cookies 信息创建动态网页。假使 Cookies 包含可执行恶意代码段,那么在显示合成有该 Cookies 的网页时,就会自动执行这段恶意代码。当然,恶意代码能否真正造成危害,还取决于Web 站点的安全配置策略 [4] 。
  3. 会话定置
    会话定置(Session Fixation)攻击是指,攻击者向受害者主机注入自己控制的认证Cookie等信息,使得受害者以攻击者的身份登录网站,从而窃取受害者的会话信息。注入Cookie的方法包括:使用跨站脚本或木马等恶意程序;或伪造与合法网站同域的站点,并利用各种方法欺骗用户访问该仿冒网站,从而通过HTTP响应中的Set-Cookie头将攻击者拥有的该域Cookie发送给用户等。
  4. CSRF攻击
    跨站请求伪造(Cross-Site Request Forgery,简称CSRF)是指,攻击者可能利用网页中的恶意代码强迫受害者浏览器向被攻击的Web站点发送伪造的请求,篡夺受害者的认证Cookie等身份信息,从而假冒受害者对目标站点执行指定的操作。Firefox、Opera等浏览器使用单进程机制,多个窗口或标签使用同一个进程,共享Cookie等会话数据。IE则混合使用单进程与多进程模式,一个窗口中的多个标签,以及使用“CTRL+N” 或单击网页中的链接打开的新窗口使用同一进程,共享会话数据;只有直接运行IE可执行程序打开窗口时,才会创建新的进程。Chrome虽然使用多进程机制,然而经测试发现,其不同的窗口或标签之间仍会共享会话数据,除非使用隐身访问方式。因而,用户同时打开多个浏览器窗口或标签访问互联网资源时,就为CSRF攻击篡夺用户的会话Cookie创造了条件。另外,如果一个Web站点提供持久化Cookie,则CSRF攻击将更直接、更容易。

3.2 安全防护

3.2.1 Web服务器端防护

  1. 加入MAC以进行完整性校验;
  2. 防止非法用户非法截获后的重放,可以让用户对相关信息进行数字签名,加强有效性验证;
  3. 对Cookie本身进行随机密钥加密,保证Cookie本身的信息安全。

3.2.2 客户端浏览器防护

客户端浏览器为了保证本地的Cookie安全,采取了对不同访问网站的统一Cookie加密,在相应的系统目录下,只可看见一个与Cookie相关的加密文件,而且其中的Cookie文件,已被浏览器加密,用户不可见,在用户访问特定站点的时候,可由浏览器对cookies文件进行调用并进行解密,将特定站点的Cookie发送到指定的站点服务器中,实现对用户的Cookie的认证。

3.2.3 主机的安全防护

在原有的服务器端以及客户端对Cookie的安全性控制下,鉴于不同的客户端浏览器对站点的Cookie控制相互独立,可以采取在客户端浏览器对产生的Cookie文件进行基于主机特征的安全性认证,即在浏览器产生Cookie加密文件时,在Cookie文件中加入一段主机的特征,生成一个双层加密的新的Cookie文件;在调用Cookie的时候,通过对Cookie文件进行主机特征的匹配,选择对内层的文件进行解密调用 [1] 。
然后,对嵌套了主机序列号的内层密文进行二次加密;内层加密保证对源Cookie内容的加密,保证Cookie信息的不可见,外层加密保证对主机特征的保护,以避免对主机特征的替换,通过对Cookie加入主机特征,以及两次对Cookie加密,可以在原有的防护机制下,为Cookie提供更加安全的保护。

4 总结

  1. 掌握Cookie的认证过程;
  2. 掌握Cookie的相关属性作用;
  3. 掌握Cookie的应用方法;
  4. 了解Cookie威胁与防护手段,后续学习如何危险与如何防护。

参考文献

  1. 《Cookie (储存在用户本地终端上的数据)》
  2. 《官方手册setcookie》

【PHP基础】Cookie基础知识、应用案例代码及攻防相关推荐

  1. JavaSE基础知识(附上代码实现)1

    ###01.01_计算机基础知识(计算机概述)(了解) * A:什么是计算机?计算机在生活中的应用举例     * 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动. ...

  2. Java基础知识(一),打好基础才能写出高质量代码

    前沿:不管工作多久,基础永远是最重要的,好多大厂看的就是基础好不好,所以写代码的同时,基础知识还是要去理解和记忆的,坚持每天来看一点 Java基础.语法: java面向对象的特征有哪些方面? 1.抽象 ...

  3. javaScript基础学习 - 14 - JavaScript内置对象 -案例代码

    javaScript基础学习 - 14 - JavaScript内置对象 -案例代码 1. Math对象最大值 2. 封装自己的数学对象 3. Math绝对值和三个取整方法 4. Math对象随机数方 ...

  4. JavaSE基础知识(五)--面向对象代码实现初步(实现一个简单的类类型代码)

    Java SE 是什么,包括哪些内容(五)? 本文内容参考自Java8标准 一.面向对象(代码实现): 首先,在这里我需要说明一个根本性的问题:实际上,面向对象编程包括了两部分,一个是你的编程思想,一 ...

  5. iOS基础——通过案例学知识之UITableView

    iOS基础--通过案例学知识之UITableView 案例一:英雄联盟展示 对于UITableView的知识点特别多,因为它是iOS用得最多控件之一,我会尽我最大努力和语言的组织,将所有知识点介绍到位 ...

  6. 全站最全面的Python 基础入门必备知识大全,学完即就业!【建议收藏仔细学习】

    前言: Python作为21世纪最火的编程语言,市面上各种学习视频层出不穷,关于Python的学习氛围也逐渐浓厚!!最近一段时间越来越多的知友们在私信我,希望我出一期python基础入门的内容,肝了N ...

  7. 拉勾教育大前端就业9期训练营——前端基础CSS重点知识笔记,附3个练习题及感想

    CSS CSS概述 ​ css产生背景: HTML被发明开始,样式就以各种形式存在,最初的HTML只是包含很少的显示属性. 随着HTML的成长,为了满足页面设计者的需求,HTML添加了更多的显示功能, ...

  8. 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)

    原文:图像滤镜艺术--编码基础(Photoshop基础变换的代码实现) 自从上一篇博客写完之后,到现在已经有段时间了,这段时间不是不想接着写,只是想做的更好了在写出来给大家看呵呵. 今天,我将给大家介 ...

  9. IOS开发基础之手势解锁项目案例

    IOS开发基础之手势解锁项目案例 项目最终实现效果. 由于缺少红色的error背景图.我自己从安卓项目找到一个手势解锁,然后通过ps添加粉红色的红圈,才得以解决.为了分享给大家源码,github和本地 ...

最新文章

  1. 移动apn接入点哪个快_移动4g网速最快接入点_2020移动最佳APN接入点
  2. mysql分页的高效算法_mysql_海量数据库的查询优化及分页算法方案
  3. pat天梯赛L1-053. 电子汪
  4. Boost:boost::bimaps::list_of的测试程序
  5. php 利用fsockopen GET/POST 提交表单及上传文件
  6. 高能力成熟度软件企业中软件质量工程师的职责
  7. [js] alert如何让文本换行?
  8. mysql 主机不存在_MySQL 当记录不存在时插入,当记录存在时更新
  9. 干活的不如写ppt的吗_干活的干不过写PPT的?或许只是工作汇报的方式错了……...
  10. Mysql用户访问工作原理
  11. 新胖子公式 (10 分)
  12. Kaldi 语音识别基础教程
  13. 中国计算机管理软件学院,中国管理软件学院官方网站
  14. 逻辑思维训练500题(带答案)
  15. 二项分布 (Binomial Distribution)
  16. 使用jquery完成抽奖图片滚动的效果
  17. bytebuddy之advice详解 注解详解
  18. NB-IoT和eMTC对比
  19. [附源码]Java计算机毕业设计SSM鞍山丘比特房屋租赁管理系统
  20. Vue表格绑定数据、添加数据

热门文章

  1. 抖音账号矩阵系统源码搭建开发部署分析
  2. 注意: C++ 不支持默认 int 问题总结
  3. CC2640R2F学习笔记(7)——自定义服务和特征
  4. 微信 SHA1 签名_个性签名设计制作,多种样式免费一键设计
  5. 【妖精的尾巴win7动漫主题】
  6. 3D立体游戏的起源和目前的发展
  7. 【2017年第2期】大数据的价值发现方法
  8. nyoj 218 dinner
  9. 德国的Duisburger Modellfabrik公司把WorkNC用于精密工程和大型模具制造
  10. 腾讯云直播回调处理方式和流程