在刷新/重新加载(客户端,没有服务器端会话)之间传递数据

时间:2015-05-23 08:39:30

标签: javascript security session reload

在单页面应用程序中,我想在页面重新加载/刷新期间传递敏感数据。

由于数据是敏感的,因此无法恢复,例如

  • 当用户离开域然后返回
  • 当用户关闭用户代理并重新启动它时,恢复上一个会话

历史

  • thirdpartypage.com (搬到此处时丢弃数据)
  • mypage.com
  • thirdpartypage.com (搬到此处时丢弃数据)

我的方法是将其存储在sessionStorage

// On data generation/update
sessionStorage.setItem("data", "DATA");

// ...

// On load (reload)
var data = sessionStorage.getItem("data")

if (data) {
    // Initialize application with data
} else {
    // Start without
}

不幸的是,在sessionStorage中,从我的应用程序域迁移到外部域(以及来回到我的应用程序域)时,数据仍然存在。

我也尝试将其存储在

  • window.name,但对于Chrome而言,这是可以接受的(不会跨域保留),Firefox可以在其他域访问数据(IE未经测试)
  • 一个短命的cookie,但我找不到这个解决方案安全

2 个答案:

答案 0 :(得分:0)

如果您在加载页面后填充了文本输入,则在刷新页面时,浏览器将使用之前的值重新填充该字段。如果用户离开页面并返回(不重新加载),则不再重新填充该字段。

所以你可以做的是将敏感信息放在一个隐藏的文本输入中并从那里获取它,只有当用户刷新页面时它才会存在。

答案 1 :(得分:0)

这里有两个截然不同的问题:

  1. 当用户离开网站而不退出时,敏感数据会留在计算机上,然后稍后其他人访问该网站并绊倒之前用户的数据。

  2. 有权访问同一台计算机的人正在积极尝试获取您的数据,并在浏览器的sqlite数据库中浏览。

  3. 对于第一种情况,以某种方式区分页面重新加载和新访问者就足够了。一旦你知道,你可以为新访问者擦除sessionStorage。 document.referrer会告诉您是否有人通过链接进入,但它无法判断是否有人输入了该地址,或者该网页是否刚重新加载。也许结合一个短命的cookie,你可以提出一个可靠的策略。

    第二种情况比较棘手,我认为您必须考虑相关数据是否 敏感某人会达到这些长度。人们还可以争辩说,用户也应该负责保护他们的数据。一种解决方案可能是将该数据存储在sessionStorage中加密,并在window.onbeforeunload中将密钥存储在短期cookie中。如果在加载页面时cookie仍然存在,您可以解密数据并恢复会话,如果没有,则清除存储。

    我不确定这些方法是否可以接受,但我不知道有更好的方法来实现这一目标。这并不是说一个不存在。但是,如果您选择采用加密方式,crypto-js是我的javascript加密和散列的首选解决方案。

    这是一个伪代码示例:

    global var user
    
    when page loads {
        encryptionKey = getEncryptionCookie()
        if encryptionKey is null {
            // No key found, this is a new user
            eraseSessionStorage()
            user = initNewSession()
        } else {
            // Cookie found
            data = decrypt(getFromStorage('user-data'), encryptionKey)
            if data is valid {
                user = restoreSession(data)
            } else {
                // Wrong key, either an anomaly or a hack attempt
                eraseSessionStorage()
                user = initNewSession()
            }
        }
        user.key = newEncryptionKey()
    
    }
    
    when user does something {
        user.data = getNewData()
        saveToStorage('user-data', encrypt(user.data, user.key))
    }
    
    // ie. window.onbeforeunload in JS
    when user leaving {
        // the validity has to be long enough to last
        // through a refresh, but short enough so no one
        // can re-enter the site without the user noticing
        setEncryptionCookie(user.key, 10 seconds)
    }
    

    这样数据永远不会以未加密的方式保存,所以即使有人设法从sessionStorage中获取数据它也没用,前提是你生成了安全密钥。也许使用鼠标位置作为随机函数函数的种子?