IP-Adresse und Host-Domain-Name unterscheiden



  • Hallo,

    ich muss in einem Stück JavaScript von einer Variablen ermitteln ob diese eine IP-Adresse (IPv4 oder IPv6 muss beides funktionieren) oder einen Domain-Name enthält.
    Es handelt sich um die Funktion 'FindProxyForURL(url,host)' in einem PAC-Script-File, hier kann die Variable 'host' ja entweder einen richtigen Host-Namen (wie z.B. google.de) oder eine IP-Adresse (ich vermute mal als Text-Darstellung wobei ich keine Ahnung habe wie das in einer untypisierten Sprache wie JavaScript genau gemacht wird) enthalten. Nun muss ich bei IP-Adressen prüfen ob diese im Range des lokalen Netzwerks liegen oder nicht aber diese Prüfung soll bei Domain-Namen nicht gemacht werden damit dieses Script keine DNS-Requests generiert (wegen Sicherheitslücke u.ä.).

    Gibt es für diesen Zweck irgendwo schon ein Code-Schnippselchen das ich übernehmen könnte? Oder gar eine vordefinierte Funktion von JavaScript? (Hauptsache diese Funktion ruft nichts anderes auf und macht erst recht keinen DNS-Query)
    Weiß jemand was für einen Datentyp das Parameter 'host' hat? Ist das wirklich immer ein Text-String oder kann das auch ein richtiges Objekt z.B. für eine IP-Adresse sein?

    Grüße
    Erik

    PS: ich hab von JavaScript nicht wirklich Ahnung aber ich kann einigermaßen gut Assembler und C und C++


  • Mod

    Fuer sowas empfehle ich: http://regexlib.com/DisplayPatterns.aspx

    Aber Achtung: hostnamen koennen auch auf das lokale Netz verweisen! Und nur weil eine IP im lokalen Netz liegt, heisst das nicht dass man darauf nicht uebers Internet connecten muss (weil du zB in einem VPN bist).

    Generell ist es so, dass wenn du sowas unterscheiden willst, du ein Konzeptproblem bekommen wirst.

    Deshalb machen es die meisten Tools so, dass das lokale Netz anhand einer Subnetmask angegeben wird.



  • Hallo,

    Shade Of Mine schrieb:

    Fuer sowas empfehle ich: http://regexlib.com/DisplayPatterns.aspx

    Um ehrlich zu sein, da verstehe ich nur Bahnhof.
    Ich hab absolut keine Ahnung von Regular-Expressions, gibt es in JavaScript keine kleinere Kanone für meinen winzigen Spatzen?
    In C würde ich das Character-Array einfach einmal durchlaufen und prüfen ob überhaupt Buchstaben drin sind (wenn nicht ist es wahrscheinlich eine IPv4-Adresse) oder ob Buchstaben >F drin sind (falls ja dann ist es mit Sicherheit ein Domain-Name) oder ob eckige Klammern und Doppelpunkte drin sind (dann ist es wahrscheinlich eine IPv6-Adresse). Nur leider hab ich keine Ahnung wie man sowas in JavaScript macht.

    Shade Of Mine schrieb:

    Aber Achtung: hostnamen koennen auch auf das lokale Netz verweisen!

    In dem PAC-Script sind Dinge wie 'if (shExpMatch(host,"*.[Local-Domain]")) { return "DIRECT"; }' drin aber dieser Test macht natürlich nur Sinn wenn in 'host' wirklich ein Domain-Name drin ist. Ansonsten hab ich auch Dinge wie 'if (host == "127.0.0.1") { return "DIRECT"; }' aber dieser Test macht auch nur Sinn wenn es sich um eine IP-Adresse handelt. Problematisch sind aber Tests wie 'if (isInNet(host,"FD7D::","FFFF::") { return "DIRECT"; }' weil hier ein DNS-Request generiert wird falls in 'host' ein Domain-Name ist und genau das soll vermieden werden. Da dieser Test auch nur dann Sinn macht wenn in 'host' eine IP-Adresse drin ist soll dieser Test auch nur ausgeführt werden wenn es sich in 'host' tatsächlich um eine IP-Adresse handelt.

    Shade Of Mine schrieb:

    Und nur weil eine IP im lokalen Netz liegt, heisst das nicht dass man darauf nicht uebers Internet connecten muss (weil du zB in einem VPN bist).

    Das PAC-Script gilt doch nur für das von mir verwaltete lokale Netz und wenn es dort einen Client gibt der gleichzeitig noch in einem VPN ist das den selben Adress-Range benutzt wie mein lokales Netz dann hat dieser Client eh ein ernstes Problem aber das liegt definitiv außerhalb meines Zuständigkeitsbereichs.

    Shade Of Mine schrieb:

    Generell ist es so, dass wenn du sowas unterscheiden willst, du ein Konzeptproblem bekommen wirst.

    Ich möchte nicht anhand des Types in 'host' entscheiden ob Proxy oder nicht, ich möchte damit nur auswählen welche Tests das restliche PAC-Script dann ausführt.
    In der Art:

    switch(getType(host))
    {
      case IPv4:
        if (host == "127.0.0.1") { return "DIRECT"; }
        .....
      case IPv6:
        if (host == "::1") { return "DIRECT"; }
        .....
      case DOMAIN:
        if ( (host == "localhost") || (shExpMatch(host,"*.localhost")) ) { return "DIRECT"; }
        .....
    }
    

    Momentan werden einfach immer alle Tests ausgeführt, leider mit entsprechenden Nebenwirkungen, und das möchte ich anhand der Type-Information reduzieren und damit die Nebenwirkungen ausschließen (und vielleicht auch ein wenig Performance gewinnen weil die Anzahl der Tests pro Durchlauf erheblich reduziert wird).

    Grüße
    Erik


  • Mod

    erik.vikinger schrieb:

    Shade Of Mine schrieb:

    Fuer sowas empfehle ich: http://regexlib.com/DisplayPatterns.aspx

    Um ehrlich zu sein, da verstehe ich nur Bahnhof.
    Ich hab absolut keine Ahnung von Regular-Expressions, gibt es in JavaScript keine kleinere Kanone für meinen winzigen Spatzen?

    Einfacher als fertige Regexes die du copy&pasten kannst wirds nicht, sorry.

    In C würde ich das Character-Array einfach einmal durchlaufen und prüfen ob überhaupt Buchstaben drin sind (wenn nicht ist es wahrscheinlich eine IPv4-Adresse) oder ob Buchstaben >F drin sind (falls ja dann ist es mit Sicherheit ein Domain-Name) oder ob eckige Klammern und Doppelpunkte drin sind (dann ist es wahrscheinlich eine IPv6-Adresse). Nur leider hab ich keine Ahnung wie man sowas in JavaScript macht.

    Das ist zwar ein selten daemlicher Ansatz, aber den kannst du in JavaScript ja genauso machen. Wo genau tust du dir denn schwer?



  • Hallo,

    Shade Of Mine schrieb:

    Einfacher als fertige Regexes die du copy&pasten kannst wirds nicht, sorry.

    Naja, üblicherweise lege ich schon Wert darauf auch zu verstehen was mein Code da macht und das trifft bei Regexen irgendwie so gar nicht zu.
    Aber mal andersrum, welcher Regex ist denn der den ich brauche und wie benutze ich den in JavaScript? (vor allem so das sich damit die angedachte Funktionalität der Funktion 'getType()' von gestern ergibt)

    Shade Of Mine schrieb:

    Das ist zwar ein selten daemlicher Ansatz, aber den kannst du in JavaScript ja genauso machen.

    Wieso ist das dämlich? Weil es Handarbeit ist oder weil es deutlich weniger CPU-Leistung erfordert als Regexe? Ein Character-Array genau einmal linear durchzulaufen und dabei alle Beobachtungen passend vermerken ist IMHO extrem simpel und auch sehr effizient.

    Shade Of Mine schrieb:

    Wo genau tust du dir denn schwer?

    Wie greife ich auf die einzelnen Zeichen eines Character-Arrays zu und wie stelle ich sicher das es sich wirklich um ein Character-Array handelt und gibt es in JavaScript überhaupt Character-Arrays oder werden da Texte grundsätzlich in einer komplexen String-Klasse verpackt?

    Grüße
    Erik


Anmelden zum Antworten