在负载均衡器上形成随机数?

Form nonces on load balancers?

我们正在努力将机器人对我们搜索的命中率降到最低 URL(这意味着它不加载表单而只是发送参数),我认为在隐藏输入中使用随机数可以解决这个问题,但我们的管理员说负载平衡的服务器可能会从一个服务器发送表单随机数,但表单提交可以由另一台服务器处理......所以我不确定我们如何才能让它工作而且我似乎越来越irrelevant/unrelated 网络搜索整个问题时的结果。

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

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

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

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