【问题标题】:Verifying client application identity - client is in the browser验证客户端应用程序身份 - 客户端在浏览器中
【发布时间】:2017-11-27 07:09:35
【问题描述】:

我有用 PHP 编写的后端(实际上我想这并不重要)。 我有用 Javascript 编写的客户端,它在浏览器中启动。

应用程序以下列方式工作:

  1. 用户访问url地址并获取渲染数据的原始模板
  2. 通过 ajax,GET 查询被发送到后端服务器,查询填充原始模板的数据。响应以有效 JSON 形式返回。

这两个请求发生后,我可以打开控制台并重新发送最后一个 ajax 查询。我可以复制所有参数并轻松地从 JSON 中获取数据。

我对这种情况很不高兴。 我想以某种方式找出该查询来自应用程序。

我想在后端生成一些一次性令牌。在步骤1中将其交给客户。令牌只能使用一次。获取令牌后的客户端将立即使用它,因此使令牌对下一次查询无用。令牌的存活时间很短,因为第 2 步应该紧跟在第 1 步之后。

因此,下次如果将 ajax 查询发送到返回有关产品的基本信息的端点(步骤 2) - 将不会发回任何数据作为响应。

我并不是要 100% 保证查询没有被欺骗(我觉得这有点不可能,尽管我很高兴有这种可能性)。我想找一些方法让它更难被欺骗。拥有能在 80% 的情况下工作的锁总比没有锁要好,因为它需要更好的断路器资格。

我对我将要实施的方法的可行性有一些疑问。

我需要有关人们通常如何操作或一般想法的链接方面的帮助。实施对我来说不是问题。我能找到的 是“证书固定”,但不确定它对我的情况有何帮助。

肯定有人在我面前解决了这样的问题。 你知不知道怎么?有什么建议吗?

谢谢

【问题讨论】:

  • 这么多I's 和I'm's...我只能建议你在整个过程中添加一个 CSRF 令牌,如果数据是敏感的或者你不希望它被刮掉然后制作它们登录。
  • 对不起,我不是本地人。这种措辞不好(您建议在哪里阅读有关好的措辞)? CSRF afaik 用于表单保护...
  • 滚动 CSRF 令牌“样式”方法可用于“允许”基于先前请求的后续请求,因此设置令牌加载您的内容,设置一个新令牌,将其作为标头发送在下一个等等..如果您刷新相同的请求,令牌将是错误的..

标签: javascript php ajax security


【解决方案1】:

您所说的称为“nonce”,是指使用过一次的数字的缩写。您可以在首次加载页面并将其添加到任何请求时在 javascript 中进行设置。您可以将其存储在服务器上的会话中,以便验证它是否与您预期的随机数相同。来自服务器的每个响应都需要包含一个新的 nonce,并且在您的响应处理程序中,您需要更新脚本中设置的 nonce。

如果你有很多可以并行发送的请求,你可以存储一个随机数数组,并在你得到它们时在服务器上使它们无效

【讨论】:

    【解决方案2】:

    您可以应用移动应用程序中常用的解决方案:使用一些难以复制的签名来签署您的请求。将当前时间和随机值添加到请求中,并将盐添加到签名中。将签名放入 HTTP 标头。混淆你的 JS 代码。

    签名可能类似于md5("salt" + method + url + params + body + sessionId)

    params 应该包含当前时间和随机值以及您需要的其他参数。 在后端再次计算签名并拒绝没有有效签名的请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      相关资源
      最近更新 更多