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中修改如下内容即可。

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=DATECookie的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH将服务器上的文件目标作为Cookie的使用对象(若不指定则默认为文档所在的文件目录)
domain=域名作为Cookie使用对象的域名(若不指定则默认为创建Cookie的服务器域名)
Secure仅在HTTPS安全通信时才会发送Cookie
HttpOnly加以限制,使Cookie不能被JavaScript脚本访问。

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


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页