当我这样做时
ip = request.env["REMOTE_ADDR"]
我已经获取了客户端的IP地址。但我该如何验证一个变量中的值是否真的是一个IP地址?
请帮忙解答,谢谢。如果这个问题有重复,请原谅我没有努力去寻找……
编辑:
那IPv6的IP地址怎么办?
当我这样做时
ip = request.env["REMOTE_ADDR"]
我已经获取了客户端的IP地址。但我该如何验证一个变量中的值是否真的是一个IP地址?
请帮忙解答,谢谢。如果这个问题有重复,请原谅我没有努力去寻找……
编辑:
那IPv6的IP地址怎么办?
require "resolv"
"192.168.1.1" =~ Resolv::IPv4::Regex ? true : false #=> true
"192.168.1.500" =~ Resolv::IPv4::Regex ? true : false #=> false
"ff02::1" =~ Resolv::IPv6::Regex ? true : false #=> true
"ff02::1::1" =~ Resolv::IPv6::Regex ? true : false #=> false
require "resolv"
!!("192.168.1.1" =~ Resolv::IPv4::Regex) #=> true
!!("192.168.1.500" =~ Resolv::IPv4::Regex) #=> false
!!("ff02::1" =~ Resolv::IPv6::Regex) #=> true
!!("ff02::1::1" =~ Resolv::IPv6::Regex) #=> false
!!(ip_string =~ Resolv::AddressRegex)
validates :ip,
:format => {
:with => Resolv::AddressRegex
}
((ip_string =~ Resolv::IPv4::Regex) || (ip_string =~ Resolv::IPv6::Regex)) ? true : false
- gitb!!((ip_string =~ Resolv::IPv4::Regex) || (ip_string =~ Resolv::IPv6::Regex))
可以进一步简化。 - jesal!!(ip_string =~ Regexp.union([Resolv::IPv4::Regex, Resolv::IPv6::Regex]))
。 - Sam为什么不让一个库为你验证它?你不应该引入难以维护的复杂正则表达式。
% gem install ipaddress
那么,在你的应用程序中
require "ipaddress"
IPAddress.valid? "192.128.0.12"
#=> true
IPAddress.valid? "192.128.0.260"
#=> false
# Validate IPv6 addresses without additional work.
IPAddress.valid? "ff02::1"
#=> true
IPAddress.valid? "ff02::ff::1"
#=> false
IPAddress.valid_ipv4? "192.128.0.12"
#=> true
IPAddress.valid_ipv6? "192.128.0.12"
#=> false
您也可以使用Ruby内置的IPAddr
类,但它并不适合验证。
当然,如果应用程序服务器或框架向您提供了IP地址,则无需进行验证。只需使用给定的信息,并优雅地处理任何异常即可。
require 'ipaddr'
!(IPAddr.new(str) rescue nil).nil?
我使用它进行快速检查,因为它使用了内置库。支持IPv4和IPv6。虽然不是非常严格,但例如它会认为'999.999.999.999'是有效的。如果您需要更高的精度,请参见获胜答案。
!!IPAddr.new(str) rescue false
这段代码更好。 - Tim KretschmerIPAddr.new '999.999.999.999'
=> IPAddr :: InvalidAddressError:无效地址
- MatzFan由于大多数答案都没有涉及IPV6验证,我遇到了类似的问题。我通过使用Ruby正则表达式库解决了它,如@wingfire所提到的。
但我还使用了Regexp Library来使用其union
方法,如此处所述。
因此,我有了以下代码进行验证:
validates :ip, :format => {
:with => Regexp.union(Resolv::IPv4::Regex, Resolv::IPv6::Regex)
}
希望这能对某人有所帮助!
使用http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ipaddr/rdoc/IPAddr.html可以为您执行验证。只需通过false捕获异常,您便知道它是否无效。
1.9.3p194 :002 > IPAddr.new('1.2.3.4')
=> #<IPAddr: IPv4:1.2.3.4/255.255.255.255>
1.9.3p194 :003 > IPAddr.new('1.2.3.a')
ArgumentError: invalid address
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/ipaddr.rb:496:in `rescue in initialize'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/ipaddr.rb:493:in `initialize'
from (irb):3:in `new'
from (irb):3
from /usr/local/rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'
require 'ipaddr'
def is_ip?(ip)
!!IPAddr.new(ip) rescue false
end
is_ip?("192.168.0.1")
=> true
is_ip?("www.google.com")
=> false
require 'ipaddr'
class String
def is_ip?
!!IPAddr.new(self) rescue false
end
end
"192.168.0.1".is_ip?
=> true
"192.168.0.512".is_ip?
=> false
request.env['REMOTE_ADDR']
中获取的内容始终是有效的 IP 地址,除非 Web 服务器出了问题!因此无需进行检查。 - ankitjaininfo/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
使用正则表达式进行验证:
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}