2010-09-03 19 views
25

cuando hago esto¿Cómo verifico si un valor de una cadena es una dirección IP

ip = request.env["REMOTE_ADDR"] 

consigo la dirección IP del cliente que él. Pero, ¿qué ocurre si quiero validar si el valor en la variable es realmente una IP? ¿Cómo hago eso?

Por favor ayuda. Gracias de antemano. Y lo siento si se repite esta pregunta, yo no tomo el esfuerzo de encontrarlo ...

EDITAR

¿Qué pasa con IPv6 IP ??

+2

próxima vez es mejor tomar un poco de esfuerzo para encontrar uno ya existente. Aquí hay dos http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address y http://stackoverflow.com/questions/2999282/regular-expression-to-match -ip-address-wildcard – ankitjaininfo

Respuesta

30

¿Por qué no dejas que lo validemos por ti? No debe introducir expresiones regulares complejas que son imposibles de mantener.

% gem install ipaddress 

Luego, en su aplicación

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 

también puede utilizar Ruby integrado IPAddr clase, pero no se presta muy bien para su validación.

Por supuesto, si el servidor o el marco de la aplicación le proporciona la dirección IP, no hay ningún motivo para validarla en absoluto. Simplemente use la información que se le proporciona, y maneje cualquier excepción con gracia.

0

La dirección IP en forma de cadena debe contener exactamente cuatro números, separados por puntos. Cada número debe estar en un rango entre 0 y 255, inclusive.

+0

también recuerde que debe verificar si hay ips de red local y otras direcciones IP reservadas como 192.168.xx y 127.0.0.1 – corroded

+0

¿por qué? en realidad puedes acceder a tu propio sitio desde tu propia red :) (o incluso con lynx en localhost). – squadette

0

Validar el uso de expresiones regulares:

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 
+2

999.999.999.999 no es una dirección IP válida – Mischa

+0

ooh para ese uso riguroso de verificación la especificada aquí: http://www.regular-expressions.info/regexbuddy/ipaccurate.html – ankitjaininfo

+0

Gracias por el enlace .. interesante – Mischa

1

Esta expresión regular que utilizo lo que me pareció here

/^(?:(?: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]?)$/

4

Todas las respuestas anteriores ASUME IPv4 ... usted debe preguntarse cómo es sabia para limitar su aplicación a IPv4 agregando este tipo de controles en este día de la migración de red a IPv6.

Si me preguntas: No lo valides para nada. En su lugar, simplemente pase la cadena tal como está a los componentes de la red que usarán la dirección IP y permítales hacer la validación. Capture las excepciones que lanzarán cuando sea incorrecto y use esa información para decirle al usuario qué sucedió. No vuelvas a inventar la rueda, construye sobre el trabajo de otros.

+0

por cierto, lo que obtienes en 'request.env ['REMOTE_ADDR']' siempre será una dirección IP válida, ¡a menos que el servidor web lo arruine! No es necesario marcar – ankitjaininfo

+0

Ese es el mejor consejo. Los programadores están obsesionados por la validación sintáctica, pero no deberían: pasarlo a los programas que lo usarán ... y validarlo. – bortzmeyer

13
require 'ipaddr' 
!(IPAddr.new(str) rescue nil).nil? 

Lo uso para una revisión rápida porque usa la biblioteca incorporada. Compatible con ipv4 e ipv6. Aunque no es muy estricto, dice que '999.999.999.999' es válido, por ejemplo. Vea la respuesta ganadora si necesita más precisión.

+0

'!! IPAddr.new (str) rescue false' sería mejor código –

+0

Upvoted como mínimo la biblioteca actual (Ruby 2.4.2) valida direcciones correctamente solo si todos los grupos de dígitos están dentro de los rangos permisibles (0 a 255 para IPv4). 'IPAddr.new '999.999.999.999'' =>' IPAddr :: InvalidAddressError: dirección no válida' – MatzFan

4

Use http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ipaddr/rdoc/IPAddr.html realiza la validación para usted. Solo rescata la excepción con falso y sabes que no es válido.

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>' 
27

Ruby ya tiene la Regex necesaria en la biblioteca estándar. Pago resolv.

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 

Si le gusta la forma corta ...

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 

Que se diviertan!

+0

Para rails, mire aquí: http: // stackoverflow.com/questions/3756184/rails-3-validate-ip-string – wingfire

+0

Simplemente para simplificar las cosas, '((ip_string = ~ Resolv :: IPv4 :: Regex) || (ip_string = ~ Resolv :: IPv6 :: Regex)) ? true: false' – gitb

+3

Simplifíquelo aún más '!! ((ip_string = ~ Resolv :: IPv4 :: Regex) || (ip_string = ~ Resolv :: IPv6 :: Regex))' – jesal

0

partido con una dirección IP válida con el uso de expresiones regulares

^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$ 

en lugar de

^([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}$ 

porque muchos partido motor de expresiones regulares de la primera posibilidad en el quirófano secuencia

se puede probar su expresión regular motor: 10.48.0.200

prueba la diferencia here

3
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 

O, si no le importa que se extiende clases principales:

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 
7

Como la mayoría de las respuestas no hablan acerca de la validación IPV6, que tenían el mismo problema. Lo resolví usando la Biblioteca Ruby Regex, como @wingfire lo mencionó.

Pero también se utiliza la Biblioteca Regexp a utilizar es union método como se explica here

que también lo han hecho el código de validación:

validates :ip, :format => { 
        :with => Regexp.union(Resolv::IPv4::Regex, Resolv::IPv6::Regex) 
       } 

Esperamos que esto pueda ayudar a alguien!

1

probar este

Uso IPAddr

require 'ipaddr' 
true if IPAddr.new(ip) rescue false 
Cuestiones relacionadas