2010-09-03 4 views
25

, wenn ich dies tunWie kann ich überprüfen, ob ein Wert in einem String eine IP-Adresse ist

ip = request.env["REMOTE_ADDR"] 

ich die Client-IP-Adresse bekommen sie es. Was aber, wenn ich überprüfen möchte, ob der Wert in der Variablen wirklich eine IP ist? Wie mache ich das?

Bitte helfen. Vielen Dank im Voraus. Und sorry, wenn diese Frage wiederholt wird, ich habe nicht die Mühe, ihn zu finden ...

EDIT

Was ist IPv6 IP ??

+2

Versuchen Sie beim nächsten Mal besser einige Mühe für bestehende finden. Hier sind zwei http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address und http://stackoverflow.com/questions/2999282/regular-expression-to-match -ip-Adresse-Wildcard – ankitjaininfo

Antwort

30

Warum lassen Sie es nicht für Sie validieren? Sie sollten keine komplexen regulären Ausdrücke einführen, die nicht verwaltet werden können.

% gem install ipaddress 

Dann in Ihrer Anwendung

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 

können Sie auch Rubys eingebaute in IPAddr Klasse, aber es hat sich nicht sehr gut für die Validierung verleihen.

Wenn Ihnen die IP-Adresse vom Anwendungsserver oder Framework zur Verfügung gestellt wird, gibt es natürlich keinen Grund zur Validierung. Verwenden Sie einfach die Informationen, die Ihnen gegeben wurden, und behandeln Sie Ausnahmen ordnungsgemäß.

0

Die IP-Adresse in einer Zeichenfolge muss genau vier Zahlen enthalten, die durch Punkte voneinander getrennt sind. Jede Zahl muss in einem Bereich zwischen 0 und 255 liegen.

+0

auch daran erinnern, dass Sie nach lokalen Netzwerk ips und anderen reservierten IP-Adressen wie 192.168.xx und 127.0.0.1 – corroded

+0

warum? Sie können tatsächlich von Ihrem eigenen Netzwerk auf Ihre eigene Seite zugreifen :) (oder sogar mit lynx auf localhost). – squadette

0

Validate mit regulären Ausdruck:

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

999.999.999.999 ist keine gültige IP-Adresse – Mischa

+0

ooh für die strenge Prüfung verwenden Sie die hier angegebene: http://www.regular-expressions.info/regexbuddy/ipaccurate.html – ankitjaininfo

+0

Danke für den Link .. interessant – Mischa

1

Dieser reguläre Ausdruck verwende ich, die ich 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

Alle Antworten oben asume IPv4 gefunden ... man sich fragen muss, wie klug es ist Beschränken Sie Ihre App auf IPv4, indem Sie diese Art von Prüfungen an diesem Tag der Migration auf IPv6 hinzufügen.

Wenn Sie mich fragen: Validieren Sie es überhaupt nicht. Übergeben Sie stattdessen die Zeichenfolge wie sie ist an die Netzwerkkomponenten, die die IP-Adresse verwenden, und lassen Sie sie die Validierung durchführen. Fangen Sie die Ausnahmen, die sie werfen, wenn es falsch ist, und verwenden Sie diese Informationen, um dem Benutzer mitzuteilen, was passiert ist. Erfinde das Rad nicht neu, baue auf die Arbeit anderer auf.

+0

BTW, Was Sie in 'request.env ['REMOTE_ADDR']' bekommen, ist immer eine gültige IP-Adresse, es sei denn, der Webserver versaut es! Es ist nicht notwendig zu überprüfen – ankitjaininfo

+0

Das ist der beste Rat. Programmierer sind von syntaktischer Validierung besessen, sollten aber nicht: sie an die Programme weitergeben, die sie verwenden ... und sie validieren. – bortzmeyer

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

Ich verwende es für die schnelle Überprüfung, weil es eingebaute Bibliothek verwendet. Unterstützt sowohl IPv4 als auch IPv6. Es ist jedoch nicht sehr streng, es heißt zum Beispiel "999.999.999.999". Sehen Sie die gewinnende Antwort, wenn Sie mehr Präzision benötigen.

+0

'!! IPAddr.new (str) rescue false' wäre besser code –

+0

Upvoted als mindestens die aktuelle Bibliothek (Ruby 2.4.2) validiert Adressen nur dann korrekt, wenn alle Zifferngruppen innerhalb der zulässigen Bereiche liegen (0 bis 255 für IPv4). 'IPAddr.new '999.999.999.999'' =>' IPAddr :: InvalidAddressError: ungültige Adresse' – MatzFan

4

Verwenden Sie http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ipaddr/rdoc/IPAddr.html es führt Validierung für Sie durch. Nur die Ausnahme mit false retten und Sie wissen, dass es ungültig war.

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 hat bereits die benötigte Regex in der Standardbibliothek. Zur Kasse 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 

Wenn Sie es den kurzen Weg wie ...

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 

Viel Spaß!

+0

Für Rails sehen Sie hier: http: // stackoverflow.com/questions/3756184/rails-3-validate-ip-string – wingfire

+0

Nur um Dinge zu vereinfachen, '((ip_string = ~ Resolv :: IPv4 :: Regex) || (ip_string = ~ Resolv :: IPv6 :: Regex)) ? true: false – gitb

+3

Simplify it weiter '!! ((ip_string = ~ Resolv :: IPv4 :: Regex) || (ip_string = ~ Resolv :: IPv6 :: Regex))' – jesal

0

für Spiel eine gültige IP-Adresse mit regexp Verwendung

^(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}$ 

statt

^([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}$ 

weil viele Regex-Engine Spiel die erste Möglichkeit in der OR-Sequenz

können Sie Ihre regex versuchen Motor: 10.48.0.200

testen Sie den Unterschied 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 

Oder, wenn Sie nichts dagegen haben, Kernklassen erstrecken:

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

Wie die meisten Antworten sprechen nicht über IPV6-Validierung, hatte ich das ähnliche Problem. Ich löste es mit der Ruby Regex Library, wie @wingfire es erwähnt.

Aber ich habe auch die Regexp-Bibliothek ist es union Methode zu verwenden, wie here

erklärte ich für eine Validierung diesen Code so haben:

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

Hope this jemand helfen kann!

1

dieses

Verwenden IPAddr

require 'ipaddr' 
true if IPAddr.new(ip) rescue false 
Verwandte Themen