php - 与 Elasticsearch 进行 AJAX 通信的流量和访问控制解决方案?

标签 php ajax amazon-web-services elasticsearch

情况:

对于网上商店,我想使用 Elasticsearch 构建分页产品列表 - 并在这些列表上进行筛选。我想绕过应用程序完全运行的 PHP/MySQL 服务器,并通过 AJAX 调用直接从客户的浏览器与 Elasticsearch 通信。优点是:

  • PHP/MySQL 服务器上的大部分负载将由 ES 集群处理
  • CDN 机会(扩展!)

问题:

这种方法会减轻我们后端服务器的大量负载,但会产生一些新问题。匿名用户会产生大量请求,但我们需要对这些请求进行一些控制:

交通管制:

  • 如何防止恶意用户以这种方式调用大量电话并扫描/下载我们的整个产品目录? (例如竞争抓取定价信息)
  • 如何阻止已被识别为(以某种方式)表现不佳的 IP?

访问控制:

  • 如何确保前端只能进行我们想要允许的查询?
  • 如何确保客户只能看到选择的结果字段并且不能从 ES 中获取任何不适合他们的数据?

重要的是不要在某个地方使用一台机器来处理所有这些,因为这只会重新创建一台负责处理所有事情的机器。我想真正利用 ES 集群,而不需要任何必须处理扩展问题的中间件。

我们不想完全依赖第 3 方,我们正在寻找一种解决方案,该解决方案对与我们合作的合作伙伴具有一定的灵 active (例如,在弹性和 AWS 之间切换)。

可能的解决方案或部分解决方案:

我一直在寻找一些“Elasticsearch 即服务”选项,但我对它们的质量没有信心,即使我能解决它们提到的问题也是如此:

  • www.elastic.co/found,他们的高级解决方案有一个“屏蔽”服务,似乎没有涵盖上述所有情况(据我所知,只有 IP 阻止),但有一个自定义插件( https://github.com/floragunncom/search-guard ) 可以对结果字段进行过滤并提供一种进行用户管理等的方法。这似乎是一个合理的选择,但它很昂贵并且将应用程序与“找到的”产品联系在一起。如果需要,我们应该能够更换合作伙伴。
  • Amazon AWS Elasticsearch 服务具有基本的 IAM 支持,可以将 CloudFront 放在它前面,但不提供任何访问控制。
  • 安装一个单独的 L7 应用程序过滤解决方案,用于检测爬虫等。

问题:

有没有人采用这种方法并找到了解决所有这些问题的良好设置?

最佳答案

我建议的第一件事是限制从安全组后面访问您的 Elasticsearch 实例,并且只允许应用程序服务器 IP 地址访问端口 22、80、9200 和 9300,这些端口是 ElasticSearch 使用的端口。

至于防止报废,没有绝对的保护解决方案,但是如果您的目标是简单地限制这些报废程序对您的应用程序服务器和 ES 实例施加的负载,您可以查看 https://github.com/davedevelopment/stiphle这是针对速率受限的用户,他们在页面上使用的例子限制为每秒 5 个请求,这对普通用户来说似乎非常合理,如果需要使报废成为一项耗时的工作,可以进一步降低。

关于php - 与 Elasticsearch 进行 AJAX 通信的流量和访问控制解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34157854/

相关文章:

javascript - 在特定时间间隔内刷新 PHP 所需的文件

PHP:从简单的 html 表单向 MySQL 插入数据

javascript - 带 for 循环的 AJAX Done() 函数

php - xajax扩展列表查询

amazon-web-services - 通过 Cloudformation 将角色添加到 AWS Cognito 身份池

php - 如何使用 php 将 jpg 图像转换为正确的 blob 数据类型

javascript - 如何使用jQuery将分页表格导出到excel

javascript - 伪多语言在 Chrome 上不起作用

javascript - 使用 JavaScript 仅从 DynamoDB 中的一行中检索特定数据

amazon-web-services - AWS Cognito 用户迁移池触发器不适用于登录流程