Bob使用Web应用程序来实现某些目标。和
一些重要说明:
现在,我们如何对Bob进行身份验证(在每个请求中)? 哪个是合理的方式来实现这样的事情?
对于任何先前描述的想法,您是否会想到任何网络/安全问题?例如,
非常感谢您花时间阅读本文:)
答案 0 :(得分:73)
啊,我喜欢这些问题 - 在没有会话的情况下维持会话。
在应用程序评估期间,我已经看到了多种方法来执行此操作。其中一种流行的方式是你提到的打网球方式 - 在每个请求中发送用户名和密码来验证用户身份。在我看来,这是不安全的,特别是如果应用程序不是单页面。它也是不可扩展的,特别是如果你想在未来的身份验证中添加授权给你的应用程序(虽然我猜你也可以根据登录构建一些东西)
一种流行的,虽然不是完全无状态的机制(假设你有JavaScript执行)是将会话cookie嵌入到JavaScript中。我这里的安全人员正在为此尖叫,但它实际上可以工作 - 每个请求都有一个X-Authentication-Token
标题或者类似的东西,然后你将它映射到后端的数据库,内存中的文件存储等验证用户。此令牌可以在您指定的任何时间超时,如果超时,则用户必须再次登录。它具有相当的可扩展性 - 如果将其存储在数据库中,执行一个SQL语句,并且使用正确的索引,即使有多个并发用户,也只需要很少的时间来执行。这里负载测试肯定会有所帮助。如果我正确地阅读了这个问题,这将是你的加密令牌机制 - 尽管如此,我强烈建议你使用一个32字符的加密随机令牌,而不是使用用户名+密码+其他任何东西的组合 - 这样,它就会停留不可预测,但您仍然可以将其与用户ID或某些此类事物相关联。
无论您最终使用哪种方式,请确保将其安全发送给您。 HTTPS通过网络保护您,但如果您通过URL泄漏会话令牌(或者更糟糕的是,通过URL凭据),它不会保护您。我建议使用标头,或者如果这不可行,每次都通过POST请求发送令牌(这将意味着用户浏览器上的隐藏表单字段。)后一种使用POST请求的方法应该使用CSRF防御,只是如果我怀疑使用令牌本身可能是某种CSRF防御。
最后,但并非最不重要,请确保后端有一些机制来清除过期的令牌。这是过去许多应用程序的祸根 - 一个快速增长的身份验证令牌数据库,似乎永远不会消失。如果您需要支持多个用户登录,请确保限制数量,或者对每个令牌设置更短的时间限制。正如我之前所说,负载测试可能就是答案。
我还可以考虑其他一些安全问题,但它们太宽泛,无法在此阶段解决 - 如果您记住所有使用(和滥用)案例,您应该可以做到公平很好地实施了这个系统。
答案 1 :(得分:1)
关于登录选项 - 我认为通常您也希望为来宾支持会话。
因此,如果要强制执行登录,则加密令牌选项可能会很好。某种方式对于客人会话也许也不错。 在另一个方向,我会在将令牌附加到URL和网球选项之间进行组合。
请注意,仅在URL中发送凭据可能很危险。例如,您可能会通过HTTP referer标头泄漏令牌,甚至可能只是检查您的流量或观看您的计算机的人。
另外,即使你可以使用cookies,我也会建议你添加随机令牌或随机verifer,以保护自己免受跨站点请求伪造(CSRF)攻击。