从头开始创建逻辑验证码

时间:2014-01-15 07:16:11

标签: ruby-on-rails recaptcha

我还没有涉及到一些代码,但这是我对如何做到这一点的想法:

在我的:interactions哈希中创建session条目。这将包含一组时间戳。每次用户执行任何操作时,他们执行此操作的时间将附加到:interactions条目。该数组将在我的会话控制器中初始化,并通过我的应用程序控制器中的过滤器附加时间戳:

class SessionsController < ApplicationController
    def create
        create_session
        session[:interactions] = []
    end
end

class ApplicationController < ActionController::Base
    after_action :log_time

    private

    def log_time
        session[:interactions] << Time.now.to_i
    end
end

然后,在我的应用程序控制器中创建另一个操作,如果用户的行为是可疑的,则启动重新连接的操作。它只是看到我们的session[:interactions]数组中有20个条目,找出每对连续条目之间经过的时间,然后找到这些交互之间经过的平均时间。如果平均时间不到两分钟,则重新启动。然后重置session[interactions]数组。

class ApplicationController < ActionController::Base
    after_action :log_time
    before_action :launch_captcha

    private

    def launch_captcha
        if session[:interactions].length == 20


            elapsed = []

            session[:interactions].each_slice(2) do |a, b|
                elapsed << b - a
            end

            total = elapsed.inject(:+) 
            average = total / 20

            if total < 120
               # this a part I'm really not sure how to do:
               # various instance variables should be populated here
               redirect_to 'application/launch_captcha.html.erb'
            end

            session[:interactions] = []
        end
    end

    def log_time
        session[:interactions] << Time.now
    end
end

现在,session[:interactions]重置的事实可能有点弱点;对于那20次互动,所有的赌注都没有。但我希望在上面的逻辑上建立,可能会将session[:captchas_sent]添加到session哈希(或者甚至将captchas_sent作为列并将其保存到用户的记录中),如果session[:captchas_sent]是x金额或金额,警告或临时禁令可能生效。

您对上述监控用户行为的方式有何看法?

这是我对rails的知识开始崩溃的地方。一旦我将用户重定向到recaptcha页面,我该如何处理?我有两个表,questionsanswers,它们之间的关系分别为has_many belongs_to

所以随机问题将来自我的questions表格,然后我会有一个与答案有关的表格。它将是一个ajax形式,并且只有一个字段,一个用于答案的文本字段。表单链接到human test的动作将查看给出的答案是否等于问题的答案之一。 但是如何将问题的ID传递给此动作?它不可能是一个简单的隐藏字段,因为一旦垃圾邮件发送者知道一个问题的答案,他的脚本就可以始终将id设置为该问题。所以params散列或会话散列可能吗?我在这里需要一些建议。

一旦发现用户的答案等于问题的答案之一,我也不知道human test方法应该如何进行:

假设用户正在提交评论。他们填写评论,点击提交按钮,launch_captcha操作启动,然后将其重定向到'application / launch_captcha.html.erb'。 评论创建表单中的数据发生了什么?一旦他们正确回答了验证码,human_test方法应该如何进行?它怎么能像往常一样提交评论?我只是不知道该怎么做...我需要创建一个在表单的create动作之前调用的动作......而且......我只是不知道。帮帮我们!

0 个答案:

没有答案