草庐IT

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

coder 2024-04-08 原文

情况:

对于网上商店,我想使用 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/

有关php - 与 Elasticsearch 进行 AJAX 通信的流量和访问控制解决方案?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  8. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  9. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  10. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

随机推荐