我正在设计一个身份验证系统,在客户端计算机上将一些哈希字符串存储为“令牌”
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,这是一种保护用户会话安全的不安全方法吗?
答案 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独立于会话存储策略。
需要注意的一些细节: