【发布时间】:2017-07-27 22:56:43
【问题描述】:
我正在使用 angular 4 构建一个新的 spa 应用程序,并且我已经开始寻找不同的选项来实现安全性。随着我深入研究,我发现每个机制都非常容易受到基本攻击。我想知道在不需要深入了解安全领域背景知识的情况下,在小型 Web 应用程序中实现安全性的最有价值的方法是什么。这是我的想法和问题:
- 使用会话,使用简单的 CSRF 可以很容易地窃取 cookie。
-
使用基于令牌的方法,我发现几乎没有选择和缺点。
- 创建一个令牌并将过期时间保存在数据库中,对服务器的每个请求,服务器都会增加 X 时间的过期时间。 这种解决方案非常危险。如果恶意用户窃取了令牌,他可以很容易地让它永远活着。
- OAuth2 - 使用带有 access_token 的 refresh_token。这是一个很好的服务器协议,可以将 refresh_token 保存在服务器端。问题是 access_token 和 refresh_token 都将保存在客户端的同一个地方。窃取 refresh_token 很容易,就像使用简单的 XSS 使用 access_token 一样。
- 未过期的令牌 - 用户通过身份验证后,他将收到一个过期 X 分钟的令牌。到期后,用户将被导航到登录页面。从产品的角度来看,这很糟糕,但在我的非专业意见中,这是最容易实施和最安全的。
-
存储 - 在哪里保存令牌/sessionId?
- 本地存储 - 使用简单的 xss 或有权访问计算机的人很容易窃取。
- 会话存储 - 与上述相同,但生存时间更短。
- cookie - 很容易被简单的 CSRF 或简单的 xss 窃取
- cookie (Http-Only) - 不确定 CSRF 但仅在某些浏览器中阻止 javascript 访问(如果我理解正确的话)
我的建议(非常喜欢反馈) 我考虑在客户端使用某种对称加密。 当我从服务器获取令牌时,我将使用一些可访问的数据(如 browsertpye、操作等)对其进行加密......虽然加密算法将在客户端中,但 javascipt 被混淆了,这将增加一层黑客攻击的难度。
我们以低预算构建了一个 Web 应用程序,因此无法在这方面花费太多时间。有没有优雅的解决方案?
【问题讨论】:
-
如何使用 CSRF 窃取 cookie?
标签: angular security xss csrf csrf-protection