以下是我需要实现的目标:
用户访问登录页面。第一次访问时,浏览器将从cookie(cookies[:user])中记录他的IP和数据,并将其发送到服务器。然后,服务器检查IP或用户是否在阻止列表中,如果用户在阻止列表,它将自动将使用重定向到被阻止的页面!
我们能在Rails中做到这一点吗?如何做到?
这可以很容易地完成,以为例
def new
if cookies[:userid].present?
if User.find(cookies[:userid]).userblocked == true
redirect_to "/block_page"
end
elsif @failedtries == max_tries
User.find(cookies[:userid]).userblocked = true
cookies[:userid] = @id_entered
end
end
其中"userblocked"是数据库中的true或false值。这种方法对那些可以自由更改IP的人来说是充分的证明。然而,如果你一心想使用IP,那么这就是一个例子:
def new
if cookies[:blocked].present?
redirect_to "/block_page"
else
if BlockedIps.find_by_ip(request.remote_ip).blocked == true
redirect_to "/block_page"
elsif @failedtries == max_tries
BlockedIps.find_by_ip(request.remote_ip).blocked = true
cookies[:blocked] = true
end
end
end
像这样的事情可能就是你想要的。试试看,我还没有测试代码。这只是我此刻的想法,但它应该做你想做的事,前提是当达到最大尝试次数时,你有某种系统可以将IP存储在数据库中。
说明:它的工作方式是检查是否存在被阻止的cookie,如果存在,则重定向到阻止页面,如果不存在,则检查用户的IP地址是否在IP的阻止列表中。如果存在IP并且阻止列设置为true,则用户将被重定向到阻止页面,否则系统会检查他们进行了多少次尝试,如果等于最大尝试次数,则会将用户IP添加到数据库中,并在他们的电脑上创建一个cookie,下次访问时可以对其进行检查。
您可以创建一个检查IP地址和身份验证的方法,然后在控制器上使用before_action:您的方法。before_action在控制器中的任何其他操作之前运行,因此在显示任何视图之前进行身份验证是一种很好的方法。
您可以使用上面的Conner-Stephen McCabe解决方案,也可以为此使用gem。用户可以很容易地清除cookie,所以它无论如何都不安全。
示例:https://github.com/kickstarter/rack-attack