Newsgroup: it.comp.www.php
Titolo: verificare che il client appartenga alla stessa rete del server

Per il momento ho risolto così:
 
function same_network($ip1, $ip2)
{
	return __($ip1) == __($ip2);
}
 
function __($ip)
{
	return substr($ip, 0, strrpos($ip, '.') + 1);
}
 
if (same_network($_SERVER['SERVER_ADDR'], $_SERVER['REMOTE_ADDR'])) { // 
se server e client appartengono alla stessa rete
	// fai qualosa
}else{
	echo 'Autorizzazione negata';
	exit(1);
}
 
Però mi sembra un approccio non proprio appropriato (convenzionale).
Non è che php ha già qualche funzione ad hoc per queste cose?
 
Ho dato un occhiata qui
http://php.net/manual/en/ref.network.php
 
e poi qui
http://openskill.info/infobox.php?ID=849
 
 
In pratica bisogna usare le netmask, fare dei confronti binari, ecc.
Ma prima di imbattermi in inutili *lavaggi mentali*, volevo sapere se, 
al posto della mia funzione *same_network()*, esiste una funzione php 
già pronta, che fa quello che chiedo?
O comunque un esempio che indica l'approccio più corretto...

 O comunque un esempio che indica l'approccio più corretto...
 
Be, mettere in AND binario una netmask con un indirizzo IP non mi pare
un *lavaggio mentale*...
 
$network_addr = (ip2long($ip) & ip2long($network_mask));
 
e poi confronti le $network_addr
 
-- 
g4b0, linux user n. 369000
http://brosulo.net
 

 }
 
Secondo me è un lavoro che devi far fare al webserver o al proxy che ci 
metti davanti, non all'applicazione.
 
-- 
Andrea
 

 e poi confronti le $network_addr
 
E come $network_mask cosa devo specificare?
In pratica voglio sapere se due computer sono nella stessa casa: uno in 
cucina, e un in salotto.
Naturalmente nel mezzo c'è il classico router.
Perdonate la mia eventuale ignoranza :-P
 

 E come $network_mask cosa devo specificare?
 
La netmask che hai impostato sul router. Per esempio 255.0.0.0 o 
255.255.255.0 o 255.255.255.128, ecc. ecc.
 
Bye.

 ha scritto:

C'è un modo per ottenerla automaticamente?
-- 
 
 
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
 

C'è un modo per ottenerla automaticamente?
 
In generale no, perché è la risposta alla domanda "Quanto è larga la mia rete?", che
è dentro di te (oltre che dentro al router).
 
Si può provare a fare una interrogazione DHCP - o sfruttare il DHCP già presente sul
server. Oppure andare a occhio e mettere 255.255.255.0, che nel 99% dei casi in casa
va bene.
 
Leonardo
 
-- 
 
Now suppose -just suppose- I could show you a way to
manufacture a wall that would do the same job... but
was only one inch thick.


Appunto.
Cmq vedi un po' se va bene quello che ho fatto.
 
-------> .htaccess
 
RewriteEngine On
RewriteRule ^(.*)$ routing/route.php [L]
 
--------> routing/route.php
 
class NetworkAddress
{
 
	private $networkMask;
 
	function __construct($networkMask = '255.255.255.0')
	{
		parent::__construct();
		$this->networkMask = $networkMask;
	}
 
	/**
	 * Restituisce l'indirizzo di rete relativo ad un IP
	 * applicandone la maschera.
	 *
	 * @param $ip
	 * @return int
	 */
	function get($ip)
	{
		return ip2long($ip) & ip2long($this->networkMask);
	}
 
}
 
$_ = new NetworkAddress();
if ($_->get($_SERVER['SERVER_ADDR']) == 
$_->get($_SERVER['REMOTE_ADDR'])) { // se server e client appartengono 
alla stessa rete
	$filename =
		parse_url( // serve per eliminare dall'uri eventuali parametri (?abc=...)
			$_SERVER['REQUEST_URI'],
			PHP_URL_PATH
		)
	;
 
	require "../web_apps/$filename"; // caricamento dell'applicazione vera 
e propria
}else{
	echo 'Non sei autorizzato';
}
 
Quindi se digito 
http://localhost/bimba/index.php
 si apre la web-app 
*bimba*.
Cosa ne pensi?


 
ok, cmq dimmi che ne pensi della mia soluzione (vedi l'altro post)

 va bene.
 
Dato che stiamo parlando di una applicazione web non stiamo uscendo dal 
seminato?
Se vuole servire solo i client di una certa rete perché non mettere il 
server web in ascolto solo su questa?
 
 
-- 
Andrea
 

 Cosa ne pensi?
 
Che Apache HTTPD non mi piace e lo evito, comunque stai facendo solo 
una riscrittura lì, quello che sto dicendo io è, se ad esempio la tua 
rete è 192.168.0.0, di dichiarare il bind per il vserver (o come lo 
chiama httpd) solo l'interfaccia relativa e amen.
Quando stai servendo una richiesta sai già che il client appartiene 
alla rete, hai evitato il problema a monte.
 
 
-- 
Andrea
 

 
 
questo.
 
Ciao!

Il 08/02/2016 14:03, Andrea D'Amore ha scritto:

e comunque se l'accesso avviene da un computer al di fuori della rete, 
quale codice d'errore è meglio generare
401 Unauthorized?
403 Forbidden?


Il mio server contiene più web-apps; per ognuna voglio configurare 
diritti di accesso differeniti.
http://nas/guide-al-uso/
 può accedere chi vuole
http://nas/dati-personali/
 può accedere solo utenti della lan
ecc.


Non usare le cartelle, che non c'ha senso: configura dei virtualHost e usa
serverName diversi, tipo guide.nas e dati.nas
 
Ciao!

 serverName diversi, tipo guide.nas e dati.nas
 
sarebbe la cosa più giusta, ma il mio synology non lo permette, almeno 
credo...