Newsgroup: it.comp.www.php
Titolo: bucare l' $HTTP_REFERRER.......

salva a tutti,  
ho due pagine : 
prima.php
e 
seconda.php
dovrei proteggere seconda.php in modo tale che se viene chiamata dalla
pagina  prima.php faccia quello che deve fare, altrimenti blocco con
un bel "die" l'esecuzione dello script.
Per fare questo uso chiaramente l' $HTTP_REFERRER, ma mi chiedo se
esiste il modo di bucare questa protezione e se sia quindi possibile
chiamare seconda.php taroccando in qualche modo il referrer e
facendole credere di essere stata chiamata da prima.php ???
Grazie....
A.I.M.

 esiste il modo di bucare questa protezione...
certo che si puo' fare...
Si puo' modificare la richiesta al server agendo direttamente sulla
modalita' di connessione (E qui si va di telnet o di lynx)
GET /pagina.php HTTP/1.0
Referer: 
http://www.bocheneso.it

 ha scritto nel messaggio
news:bavbvn$evt$1...@newsfeed.cineca.it...

Oppure aggiungi direttamente l'intestazione HTTP da uno script PHP che
si connette coi socket.
                                                    -- Yena --

facendole credere di essere stata chiamata da prima.php ???
Si puo' eccome.
Soluzioni:
1) Apri una sessione in prima.php, e passi il SESSID a seconda.php
   - se il sessid non e' valido, ciccia.
2) Passi lo hash MD5 di ore, minuti e secondi piu' un 'secret', ad
   esempio:
		$id = md5(time() . 'xyzzy');
   seconda.php e' costretta a ricalcolarsi 
	$t = time();
	for ($s = 0; $s < 3600; $s++)
		if ($_REQUEST['id'] == md5(($t-$s) . 'xyzzy'))
			break;
	if (3600 == $s)
		die('Ahi.');
   Un modo per accelerare le cose e' usare floor(time()/10), e, in
   quel caso, funziona anche meglio:
	$id = md5(floor((time()-1000000000)/10) . 'xyzzy');
	...
	$t = floor(time()/10) - 100000000;
	for ($s = 0; $s < 360; $s++)
		if ($_REQUEST['id'] == md5(($t-$s) . 'xyzzy'))
			break;
	if (360 == $s)
		...
   In questo caso le due pagine... che possono essere anche su due
   server differenti... condividono un "secret", e hanno un metodo
   per invalidarlo periodicamente.
   Per crackare il sistema occorre avere uno hash valido, e quindi
   provare tutte le possibili password di (circa) 9 caratteri, per
   ciascuna facendo l'MD5 e vedendo cosa succede... e non e' detto
   che funzioni :-)
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.

    - se il sessid non e' valido, ciccia.
se in prima.php ho :
session_start();
session_register("sid");
$sid = session_id();
...
<a href="2.php?<?php print SID; ?>">seconda.php</a>
ed in seconda.php ho :
session_start();
$this_sid = session_id();
if ($this_sid != $_SESSION["sid"]) {
   header("Location: php/error.php?error_msg=wrongSID");
}
posso dire di aver controllato correttamente il SESSID? E se si,
funziona con e senza i cookies abilitati nel client?

posso dire di aver controllato correttamente il SESSID?
No, hai solo ripetuto il controllo che fa PHP. Se uno entra in
possesso del SESSID giusto, ti frega.
Quello che puoi fare e' fare un hash di dati che abbiano molto
a che vedere con la configurazione del client, ergo: indirizzo
IP, versione di browser, e simili.
A questo punto, per "piratare" la sessione, uno dovrebbe prima
di tutto intercettarti il SESSID (ed e' dura), poi si dovrebbe
anche ingegnare a replicare tutti gli header.
Se vuoi essere canaglia, puoi farti inviare, ad ogni click, un
ID seriale consecutivo.
L'utente onesto invia 1 2 3 4 5 6... e se qualcuno s'inserisce
ed invia un dato, la sequenza in qualche modo sballa... questo
pero' significa che l'utente non puo' aprirsi piu' di una sola
finestra.


 IP, versione di browser, e simili.
[cut]
E l'ip dovrebbe essere una buona discriminante, giusto(salvo il caso di n
client dietro una NAT)?
Tutto molto interessante, grazie per l'idea.