Newsgroup: it.comp.www.php
Titolo: Controllo di accesso basato su ip

Qualcuno di voi si č cimentato?
Oggi durante una lezione di elettronica dello stato solido, mi sono messo a
pensare a come strutturare il db per fare una cosa cosě :D
Insomma, diciamo che nella parte gestionale di un sito, si possano inserire
ip o subnet ammesse ad accedere alla parte gestionale.
Mi veniva in mente di inserire l'ip in 4 campi (a.b.c.d) e poi lavorare sui
singoli campi (quindi se in d č memorizzato per es un asterisco tutta la
subnet č ammessa) o analogamente memorizzare tutto in un campo e poi
lavorare sul contenuto, magari facendo una strtok che ricerchi i punti per
dividere gli ottetti dell'ip, ma anche sto metodo non mi piace.
Come avete fatto voi?
ciao :D

Come avete fatto voi?
Come da RFC :-)
Memorizzi in un intero lungo (32 bit) l'indirizzo IP, in un altro la
netmask.
A questo punto, se
	(BITWISE_AND($ClientIp, $AllowMask) == $AllowIP)
il client e' validato. In MySQL,
	SELECT COUNT(*) FROM acl WHERE BITWISE_AND('$ClientIp', netmask) =
address);
se ritorna 0 sei morto, se no va bene.
Ah, non ricordo mai se il bitwise and si fa con | o ||, tu guarda...
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 Ah, non ricordo mai se il bitwise and si fa con | o ||, tu guarda...
& a meno che non si tratti di una funzione di aggregazione

& a meno che non si tratti di una funzione di aggregazione
Non lo e', funziona & (non ci ho mai provato, con MySQL...):
	CREATE TABLE acl ( address integer unsigned, netmask integer
unsigned);
	SELECT COUNT(*) FROM acl WHERE ($clientip & netmask) = address;
Per inserire i dati o convertirli, o si usano le funzioni normali oppure
il buon vecchio Horner (penso regga anche IPv6, basta non mescolare piu'
tipi di indirizzi, che non c'e' nessun error check)
	function aton($ipaddr)
	{
		$n = 0;
		$x = explode('.', $ipaddr);
		foreach($x as $octet)
			$x = $x*256 + $octet;
		return $x;


 }
Tsk tsk..
function aton($ipaddr)
{
$n = 0;
$x = explode('.', $ipaddr);
foreach($x as $octet)
$n = $n*256 + $octet;
return $n;
}
Comunque come faceva notare l'altro amico, c'è già ip2long()

 Comunque come faceva notare l'altro amico, c'è già ip2long()
State tutti correndo un po' troppo :D
Insomma, per inserire sto benedetto ip in un campo mysql, che devo fa?
Se faccio un form con un semplice campo di testo devo inserirli come a.b.c.d
ma a sto punto come controllo che l'interno del campo sia un ip valido?
E se invece facessi 4 form uno affiancato all'altro per i 4 ottetti?
Voi come fate?

 ha scritto nel messaggio
news:j7eeb.13117$Zh....@tornado.fastwebnet.it...

ip2long e inserisci quello, il problema rimane che hai un int signed !!

 !!
cioč a ip2long che formato di stringa devo passargli?
una tipo a.b.c.d?
Per il formato, non basta modificare il formato del campo mysql?
int e poi metto unsigned (serve anche lo zerofill?)

 ha scritto nel messaggio
news:Izeeb.13181$Zh....@tornado.fastwebnet.it...

echo $int = ip2long(127.0.0.1);
poi fai
echo $int = ip2long(192.168.254.254);
non capisco come si toglie il - davani

 echo $int = abs(ip2long(192.168.254.254));
Il problema č che cosě togli anche il bit piů significativo. In generale con
32 bit puoi avere un intero unsigned da 0 a 2^32-1 oppure un intero con o
senza meno da 0 a 2^31-1
Ora, la cosa divertente č che PHP ha solo interi con segno, non dispone di
un tipo unsigned int come paccate di altri linguaggi. E' perň possibile fare
questo:
$i = sprintf("%u",ip2long("192.168.254.254"));
e $i perde il segno meno assumendo il valore giusto. Che significa %u ?
considera l'intero come un unsigned int. Ma gli uint non erano inesistenti ?
Sě..
febo
--
It's practically impossible to teach good programming to students that have
had a prior exposure to BASIC : as potential programmers, they are mentally
mutilated beyond hope of regeneration.

 $i = sprintf("%u",ip2long("192.168.254.254"));
Cosě funziona perfetto :)

 Qualcuno di voi si è cimentato?
Ok, ci sono quasi.
Funziona sia se metto indirizzi singoli (255.255.255.255 la subnet) che
sottoreti intere (255.255.255.255 ma devo mettere a.b.c.0 sennò ciccia)
Però mi viene un dubbio: come usare subnet tipo 255.255.255.128 per esempio?

 esempio?
Fate finta che io non abbia detto nulla ok? :PP
Cmq funziona tutto grazie 1000 :D

return $n;
Il che mi insegna a non scrivere codice all'una di notte :-)


ma a sto punto come controllo che l'interno del campo sia un ip valido?
In Javascript ci sono appunto degli script. Altrimenti PHP-side. Vedi
gli esempi sul manuale:
http://it.php.net/ip2long


 gli esempi sul manuale:
In JS controllo che venga inserito qualcosa nel campo.
In php controllo che sia qualcosa divisa da . . .
Ho fatto una explode, secondo te va bene?
faccio if(count(explode('.', $_POST['ip'])) != 4) $err_format_ip = 1;
c'č qualche funzione + sempliciotta o puň andar bene fatto cosě?
Perň dovrei anche controllare che ogni ottetto sia solo numerico e non sia >
254...
mmmm per il > 254 ok, ma per controllare che sia solo numerico?

 mmmm per il > 254 ok, ma per controllare che sia solo numerico?
Devo imparare a contare fino a 10 prima di chiedere :D
vado con questa :D
preg_match ("/^([0-9]+)$/", $input_number)