【问题标题】:Form nonces on load balancers?在负载均衡器上形成随机数?
【发布时间】:2019-03-13 10:12:34
【问题描述】:

我们正在尝试最大程度地减少对我们搜索 URL 的 bot 命中(这意味着它不会加载表单而只是发送参数),我认为在隐藏输入中使用 nonce 可以解决这个问题,但我们的管理员说负载平衡的服务器可能会从一台服务器发送表单随机数,但表单提交可以由另一台服务器处理......所以我不确定我们如何才能让它工作并且我在 web 时得到看似无关/不相关的结果- 搜索整个问题。

几年前我做过一些表单 nonce 实现,但它们都通过同一个服务器(一个是由 CakePHP 自动生成的,另一个我不记得我们是如何做到的)。我们在 CentOS 6.x 服务器上使用带有 PHP 5.x 的 httpd,Live 服务器有 1 个用于处理请求的临时服务器,然后有 10 个负载均衡器(不确定这是否真的重要,但他们有文件系统的副本和代码同时访问同一个数据库)。

管理员熟悉负载平衡(我从未做过),并说他可能能够实现某种持久性或使用 memcache -d 或类似的东西(我从未尝试过),但我我不太确定。

【问题讨论】:

  • 好吧,基本上有两种方法可以解决它。您可以在负载均衡器上实现“粘性”会话,也可以将 nonce 存储在所有网络服务器都可以看到的地方——这可以是共享会话存储,如 memcache、数据库,甚至只是一个网络目录。或两者。什么最有意义将取决于您的基础架构。

标签: php forms load-balancing nonce


【解决方案1】:

是的,nonce 是一个不错的选择。工作流程可以是

  1. GET 表单请求
  2. 生成一个随机的 nonce 值,例如bin2hex(openssl_pseudo_random_bytes(16))
  3. 将 nonce 存储在持久共享存储中。如果您不使用会话,那么像 Redis 或 memcache 这样的简单键值存储将是合适的。
  4. 将随机数添加到 cookie 或隐藏表单值中的响应中。
  5. 表单已发送回负载平衡器。如果您使用 cookie 作为 nonce,负载均衡器可以立即拒绝任何缺少 cookie 的请求。否则,请求将发送到其中一个 Web 服务器。
  6. PHP 从表单 POST 或 cookie 中读取 nonce。如果缺少,请拒绝请求(例如 404)。
  7. 已检查共享存储或会话的 nonce。如果未找到,则拒绝响应。如果找到,将其从存储中删除(这样就不能再次使用)并处理表单提交。

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多