首页 > 解决方案 > 在负载均衡器上形成随机数?

问题描述

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

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

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

标签: phpformsload-balancingnonce

解决方案


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

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

推荐阅读