Javascript 客户端的 REST 基本身份验证的安全缺陷是什么(如果有的话)?
What are (if any) the security drawbacks of REST Basic Authentication with Javascript clients?
我有一个包含 REST back-end 的应用程序,旨在为来自 HTML5/JavaScript 客户端(我也在构建)的请求提供服务。
我计划实施一种使用基本身份验证的身份验证机制,其中 JavaScript 客户端将在 session 期间存储 Base64 编码的用户凭据。这些凭据将与 "Authorization: Basic" header.
中的每个 REST 请求一起发送
JavaScript 客户端和 REST 后端之间的所有对话都将通过 HTTPS 进行。我知道这本身就是一个性能缺陷,因为它会增加每个 request/response 的 encrypting/decrypting 的开销,现在没关系。
此时我真正感兴趣的是它的安全方面。我知道我所描述的模式并不新颖,很多人都在他们的实现中使用过它(至少这是我的理解)。但是,我很想知道是否有人遇到过任何安全漏洞或缺陷。
我唯一能想到的是,如果客户端的恶意代码能够以某种方式访问存储的凭据……我认为那是极不可能的(但黑客是一群有创造力的人,一些 JS 引擎有问题,所以你永远不知道 :-))。想法?
撇开 CORS 问题不谈(假设您正在对同一个域进行休息调用),最大的问题是客户端需要在 javascript 中拥有凭据。任何人都可以阅读您的代码并使用它们(正如您所指出的)。
即使凭据只是用户自己的,您客户端的任何内容都可能面临被跨站点脚本或任何可以操纵 DOM 的浏览器插件暴露的危险(我在想例如硒测试之类的东西 IDE)
“硬”凭据永远不应存储在 Javascript 可访问的区域,否则您将面临 XSS 攻击。
我建议使用访问令牌并将它们存储在仅限 HTTPS 的 cookie 中。您对访问令牌进行硬凭证的初始交换,然后使用令牌(有时间限制)进行后续请求。
我写了一篇关于这个主题的长篇文章,其中详细介绍了我的答案:Token Based Authentication for Single Page Apps
希望对您有所帮助!
基本身份验证是非常基本的 ;-) 您并不真正控制会话,...这是 link 关于 RESTful 的更高级方法(基于令牌的身份验证)服务:https://templth.wordpress.com/2015/01/05/implementing-authentication-with-tokens-for-restful-applications/.
否则我同意之前罗伯特的回答,我们在客户端存储凭据时需要非常小心(XSS 攻击)。
cookie 的问题是您的客户端需要是浏览器才能透明地利用此功能...如果是这样,您可以利用它。如果您对任何 REST 客户端开放,这可能是一个问题,因为客户端需要手动处理 cookie。此外,它确实不是在 RESTful 服务中进行身份验证的更好方法 ;-)
我真的没有看到其他方法(cookie 除外)以方便灵活的方式在 SPA 中实现身份验证。请注意 JavaScript 框架,如 Angular 提供了防止 XSS 攻击的支持。
关于这个问题我在这里给出一个答案:.
希望对您的问题有所提示。
蒂埃里
我有一个包含 REST back-end 的应用程序,旨在为来自 HTML5/JavaScript 客户端(我也在构建)的请求提供服务。
我计划实施一种使用基本身份验证的身份验证机制,其中 JavaScript 客户端将在 session 期间存储 Base64 编码的用户凭据。这些凭据将与 "Authorization: Basic" header.
中的每个 REST 请求一起发送JavaScript 客户端和 REST 后端之间的所有对话都将通过 HTTPS 进行。我知道这本身就是一个性能缺陷,因为它会增加每个 request/response 的 encrypting/decrypting 的开销,现在没关系。
此时我真正感兴趣的是它的安全方面。我知道我所描述的模式并不新颖,很多人都在他们的实现中使用过它(至少这是我的理解)。但是,我很想知道是否有人遇到过任何安全漏洞或缺陷。
我唯一能想到的是,如果客户端的恶意代码能够以某种方式访问存储的凭据……我认为那是极不可能的(但黑客是一群有创造力的人,一些 JS 引擎有问题,所以你永远不知道 :-))。想法?
撇开 CORS 问题不谈(假设您正在对同一个域进行休息调用),最大的问题是客户端需要在 javascript 中拥有凭据。任何人都可以阅读您的代码并使用它们(正如您所指出的)。
即使凭据只是用户自己的,您客户端的任何内容都可能面临被跨站点脚本或任何可以操纵 DOM 的浏览器插件暴露的危险(我在想例如硒测试之类的东西 IDE)
“硬”凭据永远不应存储在 Javascript 可访问的区域,否则您将面临 XSS 攻击。
我建议使用访问令牌并将它们存储在仅限 HTTPS 的 cookie 中。您对访问令牌进行硬凭证的初始交换,然后使用令牌(有时间限制)进行后续请求。
我写了一篇关于这个主题的长篇文章,其中详细介绍了我的答案:Token Based Authentication for Single Page Apps
希望对您有所帮助!
基本身份验证是非常基本的 ;-) 您并不真正控制会话,...这是 link 关于 RESTful 的更高级方法(基于令牌的身份验证)服务:https://templth.wordpress.com/2015/01/05/implementing-authentication-with-tokens-for-restful-applications/.
否则我同意之前罗伯特的回答,我们在客户端存储凭据时需要非常小心(XSS 攻击)。
cookie 的问题是您的客户端需要是浏览器才能透明地利用此功能...如果是这样,您可以利用它。如果您对任何 REST 客户端开放,这可能是一个问题,因为客户端需要手动处理 cookie。此外,它确实不是在 RESTful 服务中进行身份验证的更好方法 ;-)
我真的没有看到其他方法(cookie 除外)以方便灵活的方式在 SPA 中实现身份验证。请注意 JavaScript 框架,如 Angular 提供了防止 XSS 攻击的支持。
关于这个问题我在这里给出一个答案:
希望对您的问题有所提示。 蒂埃里