保护 javascript 前端/REST 后端架构网站的最佳方式?

Posted

技术标签:

【中文标题】保护 javascript 前端/REST 后端架构网站的最佳方式?【英文标题】:Best way to secure javascript front end/REST back end architecture web site? 【发布时间】:2012-01-22 16:21:59 【问题描述】:

我想构建以下项目:

任何经过身份验证的客户端都可以访问的公共 REST API 后端 带有 html/CSS/javascript 静态文件的前端,带有 Backbone.js 对 REST 后端的 jQuery 调用

实际上,我的架构中有三方:前端,它是后端的客户端,后端和要在前端登录页面上进行身份验证的用户。

保护此架构中涉及的三方的最佳方法是什么?

事实上,如果我在 javascript 中做所有事情,我认为在前端做一个安全的应用程序是不可能的,所以我打算将身份验证/授权委托给我的服务器前端的代理层。你怎么看?

我打算使用 OAuth 来保护我的 REST 后端,但我不确定是否必须使用 2 或 3 腿实现。在这种情况下,正确的做法是什么?

更新:在 SO 网站上进行更深入的搜索时,我发现了这个 thread,这正是我想做的,除了我想在服务器端使用 Java 而不是 DotNet。如果我理解得很好,实际上我的网站就像我的 REST API 的任何客户端,除了它是唯一有权创建新用户帐户的客户端。因为,如果我的 REST API 只能通过 OAuth 访问(如 Twitter 的 API),那么之前谁能执行用户帐户创建?我说的对吗?

【问题讨论】:

您是正确的,在 js 中完成的任何身份验证/授权都是毫无价值的,因为用户可以将其关闭或欺骗它。 @rico 仅供参考,您也许可以在security.stackexchange.com 获得更多答案。 @Thomas,它和客户端表单验证一样毫无价值。 事实上,我的问题是我不知道如何通过简单的用户名/密码(或openid)执行身份验证并在客户端执行授权(使用OAuth?)。 【参考方案1】:

与此架构的安全性有关的一个主要问题是测试。自动化工具将无法测试该系统的常见漏洞,例如 SQL 注入,Direct Object Reference。测试奇怪架构的有用工具是 OWASP 的开源 Zed Attack Proxy 或专有的 BURP 代理。测试将非常耗时,并且需要对 Web 应用程序漏洞有深入了解的人。我们经常将这些人称为Pentesters

保持会话状态的 RESTful 形式是使用 HMAC 来保护值不被修改。然而,这是对密码学的滥用,因为它为攻击打开了大门。攻击者可以暴力破解 HMAC 中使用的密钥,然后修改其会话 id 等值或以其他方式访问系统上的另一个帐户。只有在没有其他选择时才应使用密码术。通过将会话状态存储在非 RESTful 数据库中,可以完全防止此漏洞。

【讨论】:

感谢您的测试目的,但我的问题更多是关于如何在我的网站客户端上对用户进行身份验证以及在我的后端进行授权 @rico,为什么会改变?这与具有普通旧 get/post 的 html 应用程序有何不同?只需在后端使用会话。浏览器会跟踪 cookie。在会话数据中,您跟踪他们的会话 ID,并将其包含在所有 sql 查询中以防止不安全的直接对象引用。就像 HTML 一样,你仍然需要担心 CSRF、sql 注入、xss 等...... 后端会话是什么意思?它是一个 REST 后端,所以我想你的意思是可以扮演会话角色的东西,你的意思是一个令牌吗? 我不确定是否理解。你想在后端数据库中存储什么?您认为 Google、Twitter 等使用的 OAuth 不安全吗?您如何看待亚马逊的 S3 REST API 身份验证规则?谢谢你,鲁克。 我自己刚刚遇到了直接对象引用问题。似乎没有正确的答案。使用一些 HMAC 可能是蛮力的。否则会话信息会破坏 REST。还有其他选择吗?

以上是关于保护 javascript 前端/REST 后端架构网站的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Keycloak 保护前端和 REST API

如何使用 CORS 保护 REST API?

如何在没有弹簧安全的情况下使用 api 密钥保护 rest api

如何使用CORS保护REST API?

如何将 CSRF 令牌从 AngularJS 前端发送到 Spring REST 服务后端?

Angular 2 前端 django 2 REST 框架后端用户身份验证