我还没有涉及到一些代码,但这是我对如何做到这一点的想法:
在我的: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页面,我该如何处理?我有两个表,questions
和answers
,它们之间的关系分别为has_many
belongs_to
。
所以随机问题将来自我的questions
表格,然后我会有一个与答案有关的表格。它将是一个ajax形式,并且只有一个字段,一个用于答案的文本字段。表单链接到human test
的动作将查看给出的答案是否等于问题的答案之一。 但是如何将问题的ID传递给此动作?它不可能是一个简单的隐藏字段,因为一旦垃圾邮件发送者知道一个问题的答案,他的脚本就可以始终将id设置为该问题。所以params散列或会话散列可能吗?我在这里需要一些建议。
一旦发现用户的答案等于问题的答案之一,我也不知道human test
方法应该如何进行:
假设用户正在提交评论。他们填写评论,点击提交按钮,launch_captcha
操作启动,然后将其重定向到'application / launch_captcha.html.erb'。 评论创建表单中的数据发生了什么?一旦他们正确回答了验证码,human_test
方法应该如何进行?它怎么能像往常一样提交评论?我只是不知道该怎么做...我需要创建一个在表单的create
动作之前调用的动作......而且......我只是不知道。帮帮我们!