【问题标题】:How to prevent desktop apps from mimicking browser requests?如何防止桌面应用程序模仿浏览器请求?
【发布时间】:2020-05-05 05:25:06
【问题描述】:

我有两个用 .netcore 编写的 Web 应用程序,App 1 提供 html 内容,App 2 是服务于 Javascript 请求的 API,两者都在同一个解决方案中,但每个都有不同的端口。我的场景是浏览器从App 1 返回包含注册表单的网站,并且javascript 访问App 2 API 上的注册功能。

为了防止任何其他网站访问该 API,我启用了 CORS 并添加了 App 1 域作为唯一允许访问 App 2 的 API 的域,它运行良好,但任何桌面都可以模仿这个相同的请求标头并访问 API,我用邮递员测试并访问了 API。

所以我添加了 Authorization 标头,以便所有 API 函数都需要授权 JWT bearer 令牌被访问。

问题是如何阻止桌面应用程序或其他非浏览器应用程序访问它。原因如下:

1- 如果我将访问令牌放入来自 App 1 的响应中,以便 javascript 可以使用它来访问 App 2 ,任何其他应用程序都可以轻松获取它并将其复制粘贴到他们的应用程序和 API 将被访问。

2- 如果我不在App 1 的响应中对令牌进行硬编码,而是让 javascript 访问生成令牌的路由,那么任何应用程序都可以这样做,因为它们可以模仿相同的请求标头浏览器。那么 CORS 将毫无用处。

那我该怎么办?

【问题讨论】:

  • 您无能为力。如果浏览器可以发送东西,那么任何其他应用程序也可以。
  • @Barmar 那么我怎样才能保护我的应用程序以获取它的JWT 而没有其他应用程序占用它。只是第一次发行?
  • 一般来说,需要秘密令牌的 API 不能直接从浏览器调用,而是从服务器代码调用。
  • 条纹就是一个例子。它们为您提供了两个 API 密钥,一个“可发布”密钥和一个“秘密”密钥。可发布密钥仅在浏览器应用程序将信用卡转换为令牌时使用。密钥在后端用于向信用卡收费。
  • 在调用移动资金的API函数时不能使用可发布密钥。

标签: javascript asp.net-core cors jwt


【解决方案1】:

.. 但任何桌面都可以模仿 这个相同的请求标头并访问API,我用邮递员进行了测试 并且 API 被访问了。

这是真的,一些 http 客户端(例如 curl)能够在向服务器发出请求时更改 Origin 标头。因此,CORS 不应该是您保护应用 2 的唯一安全措施。

所以我添加了 Authorization 标头,以便所有 API 功能 需要授权访问 JWT 不记名令牌。

是的,这是一个不错的决定,但您不必保护 所有 api 端点。您可以将一些 api 向公众开放,例如登录或注册。

问题是如何阻止桌面应用或其他非浏览器应用 通常从访问它。因为...

一般来说,您的 App 1(我假设它是基于 JavaScript 的 Web 客户端)在加载时不应包含任何令牌,相反,它应该调用 App 2 的登录 API 并取回 jwt 令牌。

应用 1 可以缓存令牌,并在应用 2 上调用受保护的 API 时使用它。

【讨论】:

  • 非常感谢您回答我。我不知道为什么我得到了很多底片。无论如何,您说我调用 App 2 的登录 API 来获取 JWT 令牌,这是否意味着将与他们一起登录的 app 1 凭据应该在加载时可用?如果是,那么它可以在加载时使用,而您说不要这样做。
  • 为了您的信息,我问这个问题是为了保护我的注册路线免受机器人和我系统上的虚假帐户创建。
  • @ahmednader 我不确定为什么其他人会否决您的问题。我认为这是一个有效的问题。
  • 您可以使用其他方法(如 api 速率限制器或 recaptcha)保护您的注册路线。但我建议你只在机器人真正发生时才这样做。您的第一选择也不能防止机器人攻击。
  • 未来,您可能会有其他类型的客户端,例如连接到同一个 App 2 rest api 的移动应用程序。如果您对 jwt 令牌进行硬编码,则很容易破解系统。
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 2018-01-11
  • 2011-03-30
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多