Geldigheid testen van een IP-adres
De techniek van IPv4 die hier besproken wordt, wordt nog steeds volop gebruikt, waaronder in je lokale (thuis-)netwerk. Daarom blijft dit verhaal gewoon staan.
In dit verhaal wordt met 'IP-adres' een IPv4-adres bedoeld.
IPv6 wordt besproken in het item IPv6: Wat het is en waarvoor het nodig is.
Communicatie tussen computers via Internet gebeurt via het TCP/IP-protocol. Het IP-adres speelt daarbij een
belangrijke rol. Een IP-adres is een reeks van vier getallen tussen 0 en 255, gescheiden door punten.
Het is gemakkelijk om na te gaan of een opgegeven IP-adres ook daadwerkelijk bestaat. Op internet bestaan
diensten, die dat zo voor je uitzoeken, bijvoorbeeld
Network-Tools.com. Je krijgt er dan gelijk gegevens bij over het hostingbedrijf die het IP-adres heeft
geregistreerd.
Je kunt bij Network-Tools.com ook een URL ingeven. Dan krijg je nog veel meer gegevens,
o.a. het IP-adres van die site achter de URL en op wiens naam die website staat geregistreerd.
Voor sommige toepassingen is het al genoeg om te weten of een IP-adres zou kunnen bestaan, ofwel: je kunt eenvoudig nagaan of een opgegeven IP-adres de juiste vorm heeft.
Hieronder zie een een formuliertje met één tekstveld. Als je daar een IP-adres invult en dan op de knop Test! drukt, komt er een alert op het scherm die zegt of het adres correct vormgegeven is of niet.
Op deze pagina staat beschreven hoe je dat aanpakt. De code staat onderaan deze bladzijde. Je kunt hem ook downloaden voor je eigen gebruik.
- De code bestaat uit een eenvoudig formulier waarin een IP-adres wordt gevraagd. Als de knop Test! wordt ingedrukt wordt de JavaScript-function TestTheIP() gestart. Deze function haalt het opgegeven IP-adres uit het tekstveld en laat daar de function VerifyIP_check(str) op los.
- De parameter str van de function VerifyIP_check(str) is de inhoud van het tekstveld.
- De function VerifyIP_check(str) verwijdert eerst de 'whitespace' (spaties e.d.) aan het begin
en het einde van str. Er wordt dus een TRIM-actie op uitgevoerd.
Hiermee wordt voorkomen dat het script wordt misleid doordat er per ongeluk spaties aan het begin en/of einde van het IP-adres worden getypt. - Daarna controleert VerifyIP_check(str) of str een correct geformatteerd IP-adres
is. Als dat zo is geeft de function de waarde true terug. Anders geeft de function false
terug.
- Als het IP-adres correct gevormd is (VerifyIP_check heeft de waarde true teruggegeven)
wordt de function VerifyIP_range(str) aangeroepen. Deze bepaalt in welke range het opgegeven IP-adres
zich bevindt.
Er is daar in een aantal groepen te onderscheiden:
- Externe ranges. Dat zijn de IP-adressen die worden gebruikt voor communicatie over internet. Het zijn (vrijwel) alle mogelijke IP-adressen behalve:
- Interne ranges. Die worden gebruikt voor communicatie over lokale netwerken. Als je een
thuis-netwerkje hebt, is het IP-adres van alle apparaten in dat netwerkje een adres uit een interne range.
Je modem/router heeft er twee: Éen voor het thuisnetwerk en één voor het internet. Je
router zorgt voor de 'vertaling' van de IP-adressen.
De interne ranges zijn 192.168.xxx.xxx, 10.xxx.xxx.xxx en 172.16.xxx.xxx - 172.31.xxx.xxx. - Problemen range. Deze wordt gebruikt wanneer geen geldig IP-adres kan worden bepaald. Dat gebeurt bijvoorbeeld als de netwerk-kaart niet goed is ingesteld. Je PC krijgt dan een IP-adres in de range 169.254.xxx.xxx.
- Loopback, ook bekend als localhost. Elke computer die communiceert via IP (Internet Protocol) heeft dat. De range is 127.xxx.xxx.xxx. Heel vaak heeft de loopback van je computer het adres 127.0.0.1.
Er zijn nog meer van deze standaard IP-ranges, maar die zijn voor dit verhaal niet belangrijk. Die ranges worden in het gewone huis-tuin-en-keuken internetverkeer niet gebruikt.
- VerifyIP_check geeft een waarde terug die staat voor de range waarin het IP-adres zich bevindt:
- Externe range
- Interne range
- Problemen range
- Loopback range
- TestTheIP() toont een alert, afhankelijk van de waarde die VerifyIP_check en VerifyIP_range
hebben teruggegeven.
- Als je wilt weten wat je externe IP-adres is, breng je een bezoek aan What is my IP address? of aan het eerder genoemde Network-Tools.com.
- In de function VerifyIPl_check(str) wordt een "Reguliere Expressie" gebruikt.
Dit is een speciale manier om zoekpatronen in tekststrings mee te beschrijven.
- Je kent vast wel de beschrijving *.txt om alle tekstfiles in een directory te laten zien. Het sterretje wordt jokerteken of wildcard genoemd. Reguliere expressies werken ook met een soort jokertekens om patronen in een tekst mee te beschrijven.
- De techniek is afkomstig uit het UNIX-operating system. Daar tref je techniek aan in de filters awk en sed, maar ook in de editors ed, vi en emacs. Later is het ook ingebouwd in allerhande web-design talen.
- Helaas is er toch niet zoiets als de 'standaard' reguliere expressie taal. Het gaat eerder om verschillende
dialecten. De programmeertaal Perl beschikt waarschijnlijk de meest complete set reguliere expressies.
Gelukkig volgen al deze verschillende vormen van reguliere expressies wel dezelfde principes. Als je het basis-idee onder de knie hebt, leer je gemakkelijk de verschillende dialecten aan. - Ook JavaScript is, vanaf versie 1.1, uitgerust met uitgebreide mogelijkheden om reguliere expressies
te gebruiken.
- Het voert in het kader van dit onderwerp te ver om diep op de reguliere expressie techniek in te gaan. Zie daarvoor het item "Reguliere Expressies in JavaScript".
- De function VerifyIP_check(str) gebruikt twee reguliere expressies. De eerste is:
Het betekent het volgende:/(^\s*)|(\s*$)/g- Alle 'whitespace'-karakters die aan het begin of einde van de string staan worden gevonden. Ze worden met behulp van de String-methode replace() vervangen door een 'lege' string; ze worden dus verwijderd.
- Het hangt af van de browser wat als 'whitespace'-karakter wordt gezien. Het is altijd een
spatie, maar het kan ook zijn een horizontale of verticale tab, carriage return, linefeed, enz.
Alleen spaties zijn voor deze toepassing van belang, dus deze expressie volstaat.
/^(\d{1,3}\.){3}\d{1,3}$/- De eerste één, twee of drie karakters zijn cijfers.
- Daarna volgt één punt.
- Dit wordt drie maal herhaald.
- Aan het einde staan nog één, twee of drie cijfers.
- De function VerifyIP_check(str) vergelijkt de opgegeven string met de reguliere expressies.
Voor de vergelijking worden de methodes replace en match van het String-object gebruikt. Merk op dat de reguliere expressie niet tussen (enkele of dubbele) aanhalingstekens staat! - De hier getoonde aanpak geeft aan dat er vier getallen zijn gescheiden door punten. Voor een IP-adres geldt echter dat die getallen niet groter mogen zijn dan 255. Dat is door deze expressie nog niet getest.
- De getallen mogen ook geen min- of plus-tekens bevatten. Dat is al uitgesloten bij de evaluatie van de tweede reguliere expressie, die alleen maar cijfers en punten toestaat.
- Om de getallen zelf te kunnen beoordelen wordt de string str gesplitst in een array. Hiervoor wordt
de string-methode split() gebruikt. De punt wordt gebruikt als scheidingsteken; de hele string wordt
naar de array a overgezet (tweede parameter is -1).
Stel: str = 192.168.0.1. Na uitvoering van de code:
var a = new Array() ; a = str.split('.',-1);
bevat a de achtereenvolgende waarden 192, 168, 0 en 1. Deze worden in een eenvoudige for-loop beoordeeld.
Gebruik:
- De code staat gedeeltelijk in de <HEAD> en gedeeltelijk in de <BODY>.
De code ziet er als volgt uit:
(Zet dit in de <HEAD>).
(Zet dit in de <BODY>, op de plaats waar het formulier moet komen)<script>
function TestTheIP() {
// Check de juistheid van het IP-adres. Dit gebeurt met een Reguliere Expressie.
if (VerifyIP_check(document.f.t.value)) {
window.alert('Het opgegeven IP-adres is juist...')
} else {
window.alert('Het opgegeven IP-adres is NIET juist!')
document.f.t.focus();
}
}
function VerifyIP_check(str) {
var a = new Array();
str=str.replace(/(^\s*)|(\s*$)/g, "");
if(!str.match(/^(\d{1,3}\.){3}\d{1,3}$/)) {
return false;
} else { // String is correct gevormd; check of getallen < 256 zijn
a = str.split('.',-1);
for (i = 0; i < 4 ; i++) {
if (a[i] > 255 ) return false;
}
return true;
}
}
</script>
<form action="JavaScript:TestTheIP();" name="f" id="f">
<table border="1" cellspacing="1" cellpadding="5" align="center" bgcolor="#DDFFDD" frame="box" rules="none"><tr>
<td colspan="2" align="center">
Vul hier een IP-adres in:<br>
<input type="text" name="t" size="30" maxlength="50"></td>
</tr><tr>
<td align="center">
<input type="submit" value=" Test! "></td>
<td align="center"><input type="reset" value="Opnieuw..."></td>
</tr></table></form>