|
| IP range match Fra : Rune Jensen |
Dato : 21-01-09 03:07 |
|
Laver lige lidt sjov med ASP og IP-range match. Til det har jeg oprettet
et script, som gerne via en statusbyte burde fortælle hvorvidt en IP
ligger indenfor en given range. Desværre, så finder den kun de to sidste
match i en IP. Hvorfor finder den ikke dem alle?
Kan ses i funktion nederst på siden her:
http://runejensen.dk/om/testside.asp
Koden:
<%
Dim IPrangeStart
Dim IPrangeEnd
Dim IPfullRange
Dim IPrangeStartAr
Dim IPrangeEndAr
Dim c1
Dim c2
Dim StatusByte
Dim IPtoAnalyze
Dim IPtoAnalyzeAr
IPtoAnalyze="64.72.172.177"
IPtoAnalyzeAr = Split( IPtoAnalyze, ".")
IPfullRange = Array( "62.27.6.64 62.27.6.127","63.44.128.0 164.45.191.255")
response.Write "(Random) IP to analyze: " & IPtoAnalyze & "<br /><br />"
For c1 = 0 to uBound( IPfullRange)
IPrangeStart = Trim( Split( IPfullRange( c1))(0))
IPrangeEnd = Trim( Split( IPfullRange( c1))(1))
Response.write "<br />#" & c1 & " IPfullRange: " & IPfullRange( c1) &
"<br />* IPrangeStart: " & IPrangeStart & "<br />* IPrangeEnd: " &
IPrangeEnd & "<br /><br />"
statusByte = 0
c2 = 0
For c2 = 0 to 3
IPrangeStartAr = Split( IPrangeStart, ".")
IPrangeEndAr = Split( IPrangeEnd, ".")
response.write "<br />counter c2: " & c2
If IPtoAnalyzeAr( c2) >= IPrangeStartAr( c2) and IPtoAnalyzeAr( c2) <=
IPrangeEndAr( c2) Then
statusByte = statusByte + ((c2+1) * (c2+1))
response.write "<br />Status: range match! #" & c2 & "<br />*
IPtoAnalyzeAr: " & IPtoAnalyzeAr(c2) & "<br /> IPrangeStart: " &
IPrangeStart & "<br /> IPrangeStartAr: " & IPrangeStartAr( c2) & "<br
/> IPrangeEnd: " & IPrangeEnd & "<br />IPrangeEndAr: " & IPrangeEndAr(
c2) & "<br />StatusByte: " & statusByte
End if
'c2 = c2 + 1
Next
response.write "<hr />"
Next
%>
Det er meningen scriptet skal udbygges efter
http://www.ipaddresslocation.org/ip_ranges/get_ranges.php
hvor hver IP-range defineres af mellemrum og hver range ligger på hver
sin linje.
MVH
Rune Jensen
| |
Stig Johansen (21-01-2009)
| Kommentar Fra : Stig Johansen |
Dato : 21-01-09 06:48 |
|
Rune Jensen wrote:
> Laver lige lidt sjov med ASP og IP-range match. Til det har jeg oprettet
> et script, som gerne via en statusbyte burde fortælle hvorvidt en IP
> ligger indenfor en given range. Desværre, så finder den kun de to sidste
> match i en IP. Hvorfor finder den ikke dem alle?
IP adresser, skrevet på den måde er tekst, og ikke tal.
Så eksempelvis 64 er større end 127.
Tekst notationen er kun til brug for human readability, da en IP adresse er
et 32 bits tal.
Du skal derfor konvertere til 32 bits tal før du sammenligner.
I den forbindelse skal du være opmærksom på, at det er unsigned integers vi
snakker om.
Du skal med andre ord finde en funktion til at omforme IP adresserne til
insigned integers, og derefter kan du blot sammenligne med >, = < osv.
--
Med venlig hilsen
Stig Johansen
| |
Rune Jensen (21-01-2009)
| Kommentar Fra : Rune Jensen |
Dato : 21-01-09 00:32 |
|
On 21 Jan., 06:47, Stig Johansen <wopr...@gmaill.com> wrote:
> IP adresser, skrevet på den måde er tekst, og ikke tal.
> Så eksempelvis 64 er større end 127.
> Tekst notationen er kun til brug for human readability, da en IP adresse er
> et 32 bits tal.
Tak for svaret Stig.
Jep! Jeg er 100% på, at det løser problemet, god forklaring, lige til
at gå til. Æv, hvor må jeg ha været træt, for det er da så nemt som at
stjæle slik fra små børn. Når man altså lige kan se det;)
MVH
Rune Jensen
| |
Rune Jensen (21-01-2009)
| Kommentar Fra : Rune Jensen |
Dato : 21-01-09 00:58 |
|
On 21 Jan., 06:47, Stig Johansen <wopr...@gmaill.com> wrote:
> Du skal med andre ord finde en funktion til at omforme IP adresserne til
> insigned integers, og derefter kan du blot sammenligne med >, = < osv.
byte(3)*16777216+byte(2)*65536+byte(1)*256+byte(0)
Ikk?
Det må i hvert fald prøves. En function til det er ret nem ellers,
skulle ikke være et problem.
MVH
Rune Jensen
| |
Stig Johansen (22-01-2009)
| Kommentar Fra : Stig Johansen |
Dato : 22-01-09 06:41 |
|
Rune Jensen wrote:
> On 21 Jan., 06:47, Stig Johansen <wopr...@gmaill.com> wrote:
>
>> Du skal med andre ord finde en funktion til at omforme IP adresserne til
>> insigned integers, og derefter kan du blot sammenligne med >, = < osv.
>
> byte(3)*16777216+byte(2)*65536+byte(1)*256+byte(0)
>
> Ikk?
Husk nu det der med unsigned integers.
Ved signed integers, bliver resultatet negativt ved byte(3) > 127
Jeg har ikke nærlæst den, men fandt den her via Google:
< http://blogs.msdn.com/ericlippert/archive/2004/12/03/274360.aspx>
Hmm.. man burde vel også kunne bruge en hex notation til sammenligningen.
--
Med venlig hilsen
Stig Johansen
| |
Rune Jensen (24-01-2009)
| Kommentar Fra : Rune Jensen |
Dato : 24-01-09 15:02 |
|
Stig Johansen skrev:
> Rune Jensen wrote:
>
>> On 21 Jan., 06:47, Stig Johansen <wopr...@gmaill.com> wrote:
>>
>>> Du skal med andre ord finde en funktion til at omforme IP adresserne til
>>> insigned integers, og derefter kan du blot sammenligne med >, = < osv.
>> byte(3)*16777216+byte(2)*65536+byte(1)*256+byte(0)
> Husk nu det der med unsigned integers.
> Ved signed integers, bliver resultatet negativt ved byte(3) > 127
> Jeg har ikke nærlæst den, men fandt den her via Google:
> < http://blogs.msdn.com/ericlippert/archive/2004/12/03/274360.aspx>
>
> Hmm.. man burde vel også kunne bruge en hex notation til sammenligningen.
Jeg er lidt forvirret, for jeg fandt følgende
http://everything2.com/e2node/Decimal%2520IP%2520address
....der er det for så vidt lige ud af landevejen...?
Der er også noget C-kode, som jeg nok kan oversætte - men det giver så
forkert resultat, eller hur?
MVH
Rune Jensen
| |
Rune Jensen (24-01-2009)
| Kommentar Fra : Rune Jensen |
Dato : 24-01-09 15:18 |
|
Rune Jensen skrev:
> Jeg er lidt forvirret, for jeg fandt følgende
> http://everything2.com/e2node/Decimal%2520IP%2520address
>
> ...der er det for så vidt lige ud af landevejen...?
Hm. Ja, altså der foreslås, at man først converter hvert tal til binary
og fylder ud, så det fylder 8 bits, derefter slår det sammen til ét
stort tal, og bagefter converter fra dette kæmpe binære tal til decimal.
Jeg har stadig ikke forstået, hvorfor man ikke bare kan bruge den
straight-forward metode med *256 osv.
?
Der bliver jo slet ikke minus involveret, så... Det er da ikke særligt
smart at involvere binært først, med de fejlmuligheder, der er der.
Nogen, som evt. kan uddybe lidt mere måske? Hvor nøjagtigt går jeg fejl?
MVH
Rune Jensen
| |
Stig Johansen (25-01-2009)
| Kommentar Fra : Stig Johansen |
Dato : 25-01-09 06:57 |
|
Rune Jensen wrote:
> Jeg har stadig ikke forstået, hvorfor man ikke bare kan bruge den
> straight-forward metode med *256 osv.
Det kan man muligvis også.
Jeg er mere Pascal mand end ASP mand, og der kan man bare skrive:
byte1*256*256*256+byte2*256*256+byte3*256+byte4.
MEN der har man 2 forskellige (32bits) datatyper integer og word.
integer er signed, og dækker området -2^31..2^31-1 word, derimod er
unsigned, og dækker 0..2^32
Ved signed integers, benyttes den første bit som fortegnsbit, så hvis første
bit er 0, er tallet positivt, og hvis det er 1, er tallet negativt.
For tallene 0..127, er bit 1 = 0, og for 128..255, er bitten sat, og tallet
dermed negativt.
Der er mao tale om fortoklning af de SAMME bits. En byte, f.eks, der
indeholder 8 1-taller(bits) vil have værdien -1 hvis den er signed, og
værdien 255 hvis den er unsigned.
Hvis jeg laver det nummer(udregning) med en signed integer i Pascal, voil
keg få en range check error. Jeg ved ikke hvad ASP vil sige, men det er vel
at prøve sig frem.
En anden mulighed kunne være at bruge 64-bit's tal, og det kunne tænkes, at
ASP selv laver den variant type.
Den 'sikreste' løsning, synes jeg, er derimod at lave dem om til hex.
Her skal man huske foranstillede 0'er, så man må kunne bruge noget a la
reght("0"+Hex(byte(x)),2) til de enkelte bytes.
--
Med venlig hilsen
Stig Johansen
| |
|
|