【问题标题】:Secure Ajax call On Rest ApiRest Api 上的安全 Ajax 调用
【发布时间】:2015-09-25 07:40:52
【问题描述】:

这个问题是在一次采访中被问到的。我在网络上搜索,但找不到以对我有意义的方式解释它的线程。

假设我有一个 Web 服务,它返回一个可用的列表 在公共领域(任何机构都可以使用)为了安全,用户需要一个密钥来访问该网络服务。

如何在 Ajax 中安全地使用该 Web 服务。

问题是如果我使用 Ajax 访问该 Web 服务,任何人都可以看到我的私钥,

我建议进行加密,但我必须以解密(当我得到)的形式传递该密钥 比我建议的中介文件(在服务器端),我可以调用该 Web 服务,但如果有人直接访问该中介文件(我知道同源策略)

我真的很想知道克服这些问题的可能解决方案是什么,以及在休息时进行安全 ajax 调用的最佳实践是什么

【问题讨论】:

    标签: javascript jquery ajax rest security


    【解决方案1】:

    事实上,OAuth2 中有一个专门的安全流程用于这个特定的用例,称为“隐式授权流程”。

    您可以查看这些链接了解更多详情:

    如果您不使用 OAuth2,您可以建议用户进行身份验证并取回访问令牌。您可以将其存储在浏览器的本地存储中,但您需要非常小心 XSS。这个问题(及其答案)可以为您提供有关此类问题的一些提示:What are (if any) the security drawbacks of REST Basic Authentication with Javascript clients?

    希望对你有帮助 蒂埃里

    【讨论】:

      【解决方案2】:

      我们为此使用 cookie。和会话一样,我们将安全密钥存储在 Web 服务器上。通过 Cookie,我们可以获得安全密钥。所以他只看到了自己钥匙的“钥匙”。没有选项可以对客户隐藏所有信息。但是你可以给他看信息,他不能直接使用。

      但根本就存在钓鱼问题。如果有人窃取了您的 cookie,那么他就拥有您的安全密钥的“密钥”。许多其他人都在做类似的事情。例如。脸书。

      这不是特定于 Ajax 调用的,但由于它适用于普通 GET 和 AJAX 调用,因此它是一种解决方案。

      【讨论】:

      • 是的 cookie 可能是一种解决方案,但任何人都可以在该域上使用该密钥创建相同的 cookie 并能够访问数据
      【解决方案3】:

      如果您不能 100% 控制客户端和服务器端,您可能需要使用客户端身份验证解决方案(例如 Oauth 1 或 2)。 如果您确实对客户端和服务器端都有 100% 的控制权,那么简单的方法是使用基本身份验证 + SSL。

      我们的项目是什么: - 我有一个宁静的服务。我们在 SSL 中提供宁静的服务。 - 只有我们的合作伙伴公司才能通过互联网使用它。

      我们所做的是: - 他们在他们的内部应用程序(不是公共访问的网页)中的请求(是 Ajax)中有他们的用户名/密码 - 示例如下宁静代码(您可以通过 Postman 测试):

      //  to inject request 
      @Context
      private HttpServletRequest request; 
      
      @GET
      @Path("/testAuth")
      @Produces(MediaType.APPLICATION_JSON)
      public Response testAuth() {
          // TODO 
          // this is only a template for doing authentication in the near future
          String returnString = "";
      
          //check if authenticated
          String authorization = request.getHeader("Authorization");
          if (authorization == null ||             authorization.toUpperCase().startsWith("BASIC ") == false) {
              //no authenticated
              returnString =  "{\"testAuth\", \"need authentication\"}"; 
              return Response.status(401).entity(returnString).build();
          } else{
      
              String credentials =     authorization.substring("Basic".length()).trim();
              byte[] decoded = DatatypeConverter.parseBase64Binary(credentials);
              String decodedString = new String(decoded);
              String[] actualCredentials = decodedString.split(":");
              String ID = actualCredentials[0];
              String Password = actualCredentials[1];
              String Result = userAuthenticate(ID, Password);
      
              returnString =  "{\"testAuth\", \"" + 
                  " (" + Result + ") \"}";
              return Response.status(200).entity(returnString).build();
          }   
      
      }
      

      【讨论】:

      • 即使不公开也很糟糕。如果你的合作伙伴,例如是一家公司,使用访问 api 密钥更有意义。看看 CSRF。如果从 IT 角度来看不匹配,切勿混淆解决方案。授权和身份验证的通用技术已经存在(JWT、CSRF、OAuth2...),因此没有理由进行基本身份验证。
      猜你喜欢
      • 2020-10-15
      • 1970-01-01
      • 2021-03-25
      • 2018-04-11
      • 2019-06-26
      • 2017-02-11
      • 2014-04-27
      • 2015-09-08
      • 2017-05-02
      相关资源
      最近更新 更多