GEM-IDEA:http-method发布,放置或删除时,请在_filter中使用CAPTCHA自动垃圾邮件保护[英] Gem-idea: Automatic spam protection with captcha in before_filter when HTTP-method is post,put or delete

本文是小编为大家收集整理的关于GEM-IDEA:http-method发布,放置或删除时,请在_filter中使用CAPTCHA自动垃圾邮件保护的处理方法,想解了GEM-IDEA:http-method发布,放置或删除时,请在_filter中使用CAPTCHA自动垃圾邮件保护的问题怎么解决?GEM-IDEA:http-method发布,放置或删除时,请在_filter中使用CAPTCHA自动垃圾邮件保护问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在考虑为Rails编写自动垃圾邮件保护系统(也许我会写公共宝石).

我的概念是在application_controller f.e.中包括一个助手方法:

class ApplicationController < ActionController::Base
  automatic_captcha_redirect(:min_time => 30.seconds :limit => 50)
...
end

然后,我想在每个控制器中包含the foreforatial a fore_filter,如果当前请求是通过邮政,put或删除方法,则检查当前请求.

如果用户的最后一次重新要求小于以下:min_time,则应将请求重定向到验证码输入页面(已发布的用户数据位于隐藏的HTML字段中).

# before_filter :check_spam
def check_spam
  if !request.get? && session[:last_manipulation_at] 
      && session[:last_manipulation_at] >= DateTime.now - 30.seconds
    redirect_to captcha_path 
      # (doesn't know yet how to handle the post data to 
      # display in hidden fields in the spam-captcha-form)
  end
end

和catcha.haml

=form_tag 
-request.params.each do |key, value|
  =hidden_field_tag key, value

=captcha_image
=submit_button_tag

如果用户提交正确的验证码,他的数据将发布到正确的操作中.

您认为这可以实现吗? 有批评家或建议吗?或一个想法如何实现这种行为?

编辑:

  • 这不应通过所有activerecord堆栈;它不能用作中间件钩(Rails架)实现吗?
    • 是的,是个好主意 - 但是我对铁路架子不是很熟悉:/
  • 文件上传呢? (您无法将其存储在隐藏的文件中)
    • hm ...也许检查帖子中是否有文件? (如何实现?)
  • Ajax发布呢?
    • 也许还退回http-status代码(F.E. 503服务临时不可用)
  • 为什么只发布和删除?
    • 在我的问题中纠正了这一点

编辑:

处理的第一个结构(作为非机架应用 - 我不知道如何编写机架应用程序):

0)环境中的设置.RB

auto_recaptcha[:limit] = 10
auto_recaptcha[:min_time] = 1.minute

1)用户帖子数据

检查last_ manipulation和max. application_controller.rb

中允许的操纵量
class ApplicationController < ActionController::Base
  before_filter :automatic_captcha_redirect

  def automatic_captcha_redirect
    session[:last_manipulation_at][:manipultation] = [] unless session[:last_manipulation_at][:manipultation]
    # Checks if requests are falling under the specifications for showing captcha


    if !request.get? 
       && session[:last_manipulation_at][:date] > DateTime.now - auto_recaptcha[:min_time] 
       && session[:last_manipulation_at][:manipultation].count < auto_recaptcha[:limit]

      # If user answered captcha, verify it
      if !verify_captcha(params)
        @url = request.url
        @params = request.params
        render "layouts/captcha.haml"
      else

        # Add successfull manipulation to counter
        session[:last_manipulation_at][:manipultation] << DateTime.now
        session[:last_manipulation_at][:date] = DateTime.now
      end
    end
  end
end

catcha.haml

-form_tag @url do 
  -request.params.each do |key, value|
    =hidden_field_tag key, value

  =captcha_image
  =submit_button_tag

2) ... ... ...

最后)将用户数据张贴到正确的位置

post(params) => users_path # path "/users" with method: post

推荐答案

可以将其放在一起的一种方法:

  • 中间件/导轨金属组件 监视请求并添加 信息到机架会话.

  • for for之前的控制器帮助者 关于可能需要验证码的事物

  • 查看用于显示的帮助者 验证码

您可以通过通过use

的ARGS来调整验证码速率
#config/environment.rb
config.middleware.use 'CaptchaMiddleware',:period=>5.minutes,:limit=>50,:captcha_url=>'/captcha'

另外,这不应依靠隐藏的表单字段,因为确定的bot Writer可以将其发布到您的服务器代码的值更改.

简单的中间件示例代码(在黑暗中比刺略好,但仍然比刺)

class CaptchaMiddleware
  def initialize app,options
    @app = app
    @options=options
  end

  def update_stats!
    #session based,on account of laziness
    session[:reqs] ||= []
    session[:reqs].reject!{ |request| request < Time.now - @options[:period]}
    session[:reqs] << Time.now
  end

  def over_limit?
    session[:reqs].length > @options[:limit]
  end

  def call env
    @env = env
    if @env["REQUEST_METHOD"]!='GET'
      update_stats!
      if over_limit?
        return [302,{"Location: #{options[:captcha_url]}"},'']
      end
    end
    @app.call env
  end

  def session
    @env["rack.session"]
  end
end

其他推荐答案

首先,我想说这是一个非常好的功能.

我的QS/备注:

  • 这不应通过所有activerecord堆栈;它不能用作中间件钩(Rails架)吗?
  • 文件上传呢? (您无法将其存储在隐藏的文件中)
  • ajax发布呢?
  • 为什么只发布和删除?

无论如何,我更有兴趣看到过去5分钟内的帖子数量,例如最后一个请求的日期.我相信这更相关.

本文地址:https://www.itbaoku.cn/post/786568.html