Cookie输出相关的安全隐患

Cookie输出相关问题

Cookie的使用不当:

Web应用中需要存储包含多个网页的信息时,一般会使用PHP或Servlet容器等提供的会话管理机制。通常情况下,会话管理机制仅将会话ID保存至Cookie,而将数据本身保存在Web服务器的内存或者文件、数据库中。如果在Cookie中保存了不该保存的数据,就有可能会产生安全隐患。

不该保存在Cookie中的数据:

外界无法更改会话变量,而应用的而用户则能够更改自己的Cookie值。因此,如果将不希望被用户擅自更改的数据保存在Cookie中,就有可能会导致安全隐患。

像用户名和权限信息等,就是不可以被用户擅自更改的数据的代表性例子。一旦将这些信息保存在Cookie中,就有可能会出现用户越权操作或者越权浏览等现象。

Cookie和会话变量对比:

Cookie 会话变量
易用性 通过API进行取值和赋值 与普通变量的用法基本一致
存储数组或对象 需要在应用中转化为字符串 大多都和变量一样可以直接赋值。
容量限制 有严格限制 使用上没有限制
用户直接查看存储的信息 容易 不可能
漏洞等导致Cookie泄露后的信息泄露情况 Cookie被泄露后信息也会被泄露 可以通过控制使信息不易泄露
数据被用户更改 容易 不可能
数据被第三方更改 如果有XSS或HTTP消息头注入等漏洞就可能被更改 即使有可导致Cookie被更改的漏洞,会话变量也无法被更改
控制信息的有效性 容易 仅限当前会话
不同服务器之间共享信息 域名相同时可能 基本不可能

如上表所示,使用会话变量无法实现而使用Cookie可以实现的项目,只有控制信息有效性期限和不同服务器之间共享信息这两点。除此以外,会话变量既安全又便利,因此,一般来说最好使用会话变量。

Cookie的输出方法不当:

输出Cookie时容易产生的安全隐患,有如下两种。

  • HTTP消息头注入漏洞(通过注入更改Cookie值)
  • Cookie的安全属性设置不完善

Cookie的安全属性设置不完善:

Cookie中有名为Secure的属性(记为安全属性),指定了安全属性的Cookie仅在HTTPS传输的情况下才会被浏览器发送至服务器。而如果Cookie没有指定安全属性,那么即使应用中使用了HTTPS传输,Cookie也仍然有可能以明文的方式传输,这样就有可能会有被监听的风险。

Cookie中通常保存了会话ID等事关安全性的重要信息,因此一旦被窃听就会直接导致伪装攻击。

为了解决Cookie的安全属性设置不完善这一问题,最直接的对策就是设置Cookie的安全属性。然而,有些网站同时使用HTTP与HTTPS两种传输方式,如果在存有会话ID的Cookie中设置了安全属性,应用就可能会运行不正常。这种情况可以采取以下解决方法,即除了使用会话ID,再生成一个令牌作为设有安全属性的Cookie,并在每个HTTPS页面中确认该令牌值。

安全隐患产生的原因:

Cookie的安全属性设置不完善的直接原因就是没有给Cookie设置安全属性,不给Cookie设置安全属性的主要原因有如下两类:

  1. 开发者对安全属性毫不知情
  2. 设置安全属性后应用无法运行

设置Secure属性的方式:

在php.ini中修改如下内容即可。

1
2
session.cookie_secure=on(激活secure属性)
seesion.cookie_httponly=on(推荐设置)

注意:一定要重启Apache服务器。(systemctl Restart httpd)

什么样的应用不能设置安全属性:

有些Web应用同时使用了HTTP和HTTPS,典型的例子为电子商务网站。多数电子商务网站, 用户浏览商品页面时使用HTTP传输,而当用户选择完商品进入支付阶段时使用的是HTTPS。

同时使用这两种方式传输时,为保存会话ID的Cookie设置安全属性是非常困难的。因为设置了安全属性后,HTTP传输的页面就无法接收到Cookie中的会话ID,因此也就无法利用会话管理机制。由于使用HTTP的网页为了实现购物车等功能需要利用会话管理机制,因此当前很多使用HTTPS的网站都没有设置Cookie的安全属性。

解法方案:使用令牌

无法给保存的会话ID的Cookie设置安全属性时,可以采用通过令牌来防止会话劫持的方法。将保存令牌值的Cookie设置安全属性后,HTTP页面与HTTPS页面将会共享会话变量,而即使会话ID被窃听,HTTPS页面也能够防止会话劫持。

使用令牌能确保安全性的原因:

即使没有设置安全属性的会话ID被窃听,但只要令牌值设置了安全属性被加密,HTTPS页面就不会遭到会话劫持,原因如下:

  • 服务器输出令牌的时机只有一次,即认证成功的时候。
  • 令牌在HTTPS的页面被生成(服务器–》浏览器)
  • 令牌被加密后由浏览器发送出去(浏览器–》服务器)
  • 浏览HTTPS的页面必须要有令牌

换言之,令牌值在服务器和浏览器之间传输时都进了可靠的加密,而浏览HTTPS页面时需要的令牌值不可能被第三方得知,因此确保了安全性。

Cookie的其他属性:

属性 说明
NAME=VALUE 赋予Cookie的名称和值(必须项)
expires=DATE Cookie的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目标作为Cookie的使用对象(若不指定则默认为文档所在的文件目录)
domain=域名 作为Cookie使用对象的域名(若不指定则默认为创建Cookie的服务器域名)
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问。

学习过程中笔记的记录与资料整理。


坚持原创技术分享,您的支持将鼓励我继续创作!