在localStorage中存储用户会话令牌是否存在安全风险?

时间:2013-10-19 18:19:17

标签: php security session local-storage token

我正在设计一个身份验证系统,在客户端计算机上将一些哈希字符串存储为“令牌”

localStorage['tokens'] = [username, string1, string2, .... ]

并将这些令牌与数据库表中的行相关联

____________________________________
| Table: current_user_sessions     |
------------------------------------
| username | token1 | token2 | ... |

这样,只要用户尝试完成某个操作,客户端计算机就会查询数据库,询问带有匹配令牌的行和用户名,以验证用户是否登录了有效会话。

我将这些标记作为变量发送到php页面,检查以确保会话有效。

$tokens = $_GET['tokens']
$session_is_valid = query_that_checks_db_for_tokens($tokens)
return $session_is_valid

是否有人可以通过XSS攻击访问其他用户的localStorage,这是一种保护用户会话安全的不安全方法吗?

3 个答案:

答案 0 :(得分:2)

您的浏览器使用相同的源策略保护本地存储,因此在http://a.com托管的页面上运行的Javascript代码无法访问http://b.com页面上运行的Javascript代码存储的本地存储。如果您的网页存在XSS漏洞且人们可以将Javascript代码注入其中,则可以访问您的本地存储。

话虽如此,你的计划似乎是合理的。花一点时间确保您的页面没有任何XSS漏洞似乎很好地利用了时间。

答案 1 :(得分:0)

这种方法的主要问题是本地存储容易受到XSS攻击,因为它可以通过JavaScript访问(当然,拥有一个易受XSS攻击的页面本身就是一个问题)。如果你的tokes足够小以适应饼干,那么这是放置它们的最佳位置。

如果您在Cookie上设置仅HTTP标志,则浏览器将不允许JavaScript访问它。如果您在cookie上设置安全标志,浏览器将仅使用HTTPS请求发送它。如果您要发送与安全相关的令牌,则应该使用两个标志。

答案 2 :(得分:-1)

如果用户数据很小(或可以压缩)并且适合用户cookie,则应使用cookie。这避免了对本地存储的需求以及随之而来的安全问题。

如果不是这种情况,那么您将被迫使用本地/集中存储,当您从http参数读取令牌并直接在mysql查询中使用时,您应该注意的主要项目是sql injection。通常使用mysql_real_escape_string或参数化查询来防止这种情况(详情here)。您还应该转义输入以防止XSS独立于会话存储策略。

需要注意的一些细节:

  • 用户名是唯一标识符(某种guid)。
  • 通常用于存储会话的更快方法是使用memcached群集进行会话数据。
  • 请注意Cross side request forgery并使用crumb,因为您正在更新用户数据。