Rails:查明IP是否在IP范围内

JP *_*shy 34 ruby

这是一个棘手的...

你怎么知道一个ip,比如说62.156.244.13是在62.0.0.0和.的范围内62.255.255.255

是否有一种简单的Ruby方法可以做到这一点,或者我该如何解决这个问题?

Joh*_*ooy 84

>> require "ipaddr"
=> true
>> low = IPAddr.new("62.0.0.0").to_i
=> 1040187392
>> high = IPAddr.new("62.255.255.255").to_i
=> 1056964607
>> ip = IPAddr.new("62.156.244.13").to_i
=> 1050473485
>> (low..high)===ip
=> true
Run Code Online (Sandbox Code Playgroud)

如果给你网络而不是起始和结束地址,它甚至更简单

>> net = IPAddr.new("62.0.0.0/8")
=> #<IPAddr: IPv4:62.0.0.0/255.0.0.0>
>> net===IPAddr.new("62.156.244.13")
=> true
Run Code Online (Sandbox Code Playgroud)

IPAddr 也将使用IPv6地址

>> low = IPAddr.new('1::')
=> #<IPAddr: IPv6:0001:0000:0000:0000:0000:0000:0000:0000/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
>> high = IPAddr.new('2::')
=> #<IPAddr: IPv6:0002:0000:0000:0000:0000:0000:0000:0000/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
>> (low..high)===IPAddr.new('1::1')
=> true
Run Code Online (Sandbox Code Playgroud)

  • 虽然jdl的帖子太棒了,但这是最好的解决方案.不要重新发明轮子. (6认同)

小智 12

有一个方法 #include?

你可以这样做:

IPAddr.new("127.0.0.1/8").include? "127.1.10.200"


jdl*_*jdl 11

我会用这个杀手级的小函数将IP地址转换成整数,然后比较那些.

def ip_addr_in_range?(low, high, addr)
  int_addr = numeric_ip(addr)
  int_addr <= numeric_ip(high) && int_addr >= numeric_ip(low)
end

def numeric_ip(ip_str)
  ip_str.split('.').inject(0) { |ip_num, part| ( ip_num << 8 ) + part.to_i }
end

def test_ip_addr_in_range(low, high, addr, expected)
  result = ip_addr_in_range?(low, high, addr)
  puts "#{addr} #{(expected ? 'should' : 'should not')} be within #{low} and #{high}: #{(expected == result ? 'PASS' : 'FAIL')}"
end


test_ip_addr_in_range("192.168.0.0", "192.168.0.255", "192.168.0.200", true)
test_ip_addr_in_range("192.168.0.0", "192.168.0.155", "192.168.0.200", false)
test_ip_addr_in_range("192.168.0.0", "192.168.255.255", "192.168.100.200", true)
test_ip_addr_in_range("192.168.0.0", "192.168.100.255", "192.168.150.200", false)
test_ip_addr_in_range("192.168.255.255", "192.255.255.255", "192.200.100.100", true)
test_ip_addr_in_range("192.168.255.255", "192.255.255.255", "192.100.100.100", false)
test_ip_addr_in_range("192.168.255.255", "255.255.255.255", "200.200.100.100", true)
test_ip_addr_in_range("192.168.255.255", "255.255.255.255", "180.100.100.100", false)

$ ruby ip_range.rb
192.168.0.200 should be within 192.168.0.0 and 192.168.0.255: PASS
192.168.0.200 should not be within 192.168.0.0 and 192.168.0.155: PASS
192.168.100.200 should be within 192.168.0.0 and 192.168.255.255: PASS
192.168.150.200 should not be within 192.168.0.0 and 192.168.100.255: PASS
192.200.100.100 should be within 192.168.255.255 and 192.255.255.255: PASS
192.100.100.100 should not be within 192.168.255.255 and 192.255.255.255: PASS
200.200.100.100 should be within 192.168.255.255 and 255.255.255.255: PASS
180.100.100.100 should not be within 192.168.255.255 and 255.255.255.255: PASS
Run Code Online (Sandbox Code Playgroud)