我正在考虑为我的Rails SaaS应用实施IP地址过滤。简而言之,我希望管理员能够指定一个或多个IP地址(或一系列IP地址),然后我的应用程序只接受来自指定地址的实例上的请求。
我正在考虑使用IPAddress(http://github.com/bluemonk/ipaddress)来解析/验证每个地址/地址范围。这是一个不错的选择还是有更好/更合适的库?
是否有人实施过此类过滤,可以描述一种对他们有用的方法,还是有任何我需要担心的问题?
或者,是否有一个现有的Ruby库可以自动处理所有这些,并设法逃避我的谷歌搜索?
非常感谢, 灰
答案 0 :(得分:6)
ipaddress是一个很棒的库(我知道作者),但除非你打算对IP地址进行一些高级操作,否则你可能不需要它。
事实上,最简单的方法是
存储IP地址数组以过滤某处。您可以使用字符串表示形式(192.168.1.1)或long int表示形式。使用字符串版本,您甚至可以允许使用通配符(192.168.1。*)
然后在控制器中配置一个before_filter
,它将加载禁止的IP列表并执行简单的字符串匹配,以检查当前request.ip_address
(轨道3中的request.remote_ip
)匹配禁用的IP。如果为true,则重定向到错误页面。
如您所见,您甚至不需要将IP转换为IP对象,除非您需要执行其他类型的操作。
答案 1 :(得分:4)
派对有点晚了,但是因为我正在寻找类似的东西并碰到这个漂亮的Ruby宝石,我会在这里添加它来为线程做贡献。我喜欢@ simone的解决方案,但是如果你需要更多控制,那么Rack::Attack
可能是一个不错的选择。
https://github.com/kickstarter/rack-attack
<强>机架::攻击!!! 强>
用于阻止&amp ;;的DSL限制滥用客户
答案 2 :(得分:3)
我认为您可以使用Rails 3内置路由功能实现您想要的功能。 Gregg Pollack介绍Rails 3 Action Dispatch并提及(来自截屏视频):constraints => {:ip => /192\.168\.1\.\d{1,3}}/}
选项,您可以在其中提供与您希望允许的IP地址范围匹配的正则表达式。
进一步扩展,查看Advanced constraints及其示例演示如何从数据库中提取列入黑名单的IP并检查request.remote_ip
是否在列入黑名单的IP列表中。看起来你想要一个已接受的列表(也就是白名单IP),但代码几乎与Rails指南中的示例相同。
因此,我将构建您的管理视图以便能够输入已批准的IP地址,然后应用程序路由可以为传入请求提取此列表。