Newsgroup: it.comp.www.php
Titolo: Referer

Dovrei controllare che una pagina .php sia stata aperta cliccando da un
link presente in un dominio preciso e non digitato direttamente nel
browser o cliccato da altro dominio: come posso fare per un controllo il
più accurato possibile?
Volevo valutare il referer ma non so se è il meglio.
Non posso passare altri parametri all'url.
-- 
Amministratore
www.amiciamici.com
Giornalismo dal basso sull'amicizia e sul turismo
"Pronto Chi Bussa" il primo podcast di Parma e provincia?

 Non posso passare altri parametri all'url.
Se non puoi passare parametri, il controllo sul referer è la cosa
migliore. Ovviamente non è affidabile.
- --
Lorenzo Breda - Linux User #387700
Query 
keyserver.linux.it
 for GPG pub key ID: 0xF50D4C69
Fingerprint:
3618 E21C CA59 0EAC 2E00 F9BF 34A4 D6A0 F50D 4C69
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFGbFuTNKTWoPUNTGkRAol+AJ44k9V6Vrx3NW+5G/4ZigzSZ7kesgCeOmjw
Hrzjb27tVm8wq/toXbEksr8=
=vaxU
-----END PGP SIGNATURE-----

 
Come faresti il controllo dalla pagina che si apre?
Potendo passare dei parametri invece cosa sarebbe meglio fare?


 Potendo passare dei parametri invece cosa sarebbe meglio fare?
passando dei parametri.. potresti giocare col tempo e la crittografia..
due domande quindi.. dato un url per quanto potrebbe rimanere attivo?
minuti? ore?
usando un db in appoggio.. potresti anche eliminare il requisito di cui
sopra.. ma appesantiresti il codice inutilmente credo..
-- 
www.iuz-lab.info
 - 
www.php-faq.org

 Potendo passare dei parametri invece cosa sarebbe meglio fare?
La cosa diventa un po' più complessa.
Il problema di fondo è che bisogna inventare una stringa che sia
variabile e che non sia human-readable.
La prima cosa che viene in mente è l'md5 del timestamp corrente. Il
problema è che varia ogni secondo, e che quindi lo script di lettura
deve avere un minimo di tolleranza, il che significa fare l'md5 di
almeno tanti secondi quanti ne possono passare da quando l'utente apre
il referer a quando fa click (uno sproposito, e un sacco di tempo perso).
L'alternativa è fare una banca dati con una decina di stringhe valide,
la cui ultima sparisce e viene sostituita da una nuova prima ogni tempo
definito. La pagina referer prende sempre la prima stringa, mentre la
pagina destinazione fa il controllo su tutte e dieci.
Un'alternativa che mescola le due cose e che fa a meno di una banca
dati, invece, è la seguente:
La pagina referer utilizza come stringa l'md5 dell'ultima mezz'ora
esatta (0:00; 0:30, 1:00, 1:30...) trascorsa (esempio: se sono le 17:45,
prendo come orario le 17:30) e la pagina destinatario prende come
stringhe valide le ultime cinque (ma anche meno) mezz'ore. Se sono le
17:45, quindi, prende 17:30; 17:00; 16:30; 16:00; 15:30.
Ovviamente, dato che è molto probabile che la stringa sia al massimo
quella delle 17:00, lo script si ferma appena trova la stringa giusta,
senza continuare a fare inutili controlli.
Ecco, a meno di possibilissimi errori, un'implementazione buttata giù in
5 minuti. Puoi sicuramente fare di meglio (magari con un'altra idea più
decente)
/*
* Inizio libreria di funzioni libreria.php
*/
function ultimamezzora($adesso)
{
  // Prendo minuti e secondi della data corrente
  $min = intval(date("i", $adesso));
  $sec = intval(date("s", $adesso));
  // Vedo quanto manca (a meno dei secondi) alla mezz'ora precedente
  if($min  < 30)
  {
    $diff = $min;
  }
  else
  {
    $diff = $min - 30;
  }
  // Moltiplico la differenza per 60 e ci aggiungo i secondi
  $diff = $diff * 60;
  $diff = $diff + $sec;
  //genero il timestamp finale e lo rendo come output
  $out = $adesso - $diff;
  return $out;
}
/*
* Fine libreria di funzioni
*/
/*
* Inizio codice referer
* Ovvio che poi il link sarà una cosa del tipo:
* <a href="dest.php?ref=<?php echo $str; ?>">
*/
include("libreria.php");
$timestamp = ultimamezzora(time());
$str = md5($timestamp);
/*
* Fine codice referer
*/
/*
* Inizio codice destinatario
*/
include("libreria.php");
$c = 0;
$i = 0;
$ts = time();
while($c != 1 and $i <= 5 and isset($_GET["str"]))
{
  // controllo se il timestamp corrisponde alla stringa
  if($_GET["str"] == md5(ultimamezzora($ts)))
  {
    // Imposto a 1 il valore di controllo
    $c = 1;
  }
  // Tolgo mezz'ora al timestamp
  $ts = $ts - 1800;
  // Incremento l'indice
  $i = $i+1;
}
// Se c'è stata una corrispondenza, faccio qualcosa
if($c == 1)
{
  // metti qui il codice da eseguire
}
/*
* Fine codice destinatario
*/
Spero di esserti stato utile.
- --
Lorenzo Breda - Linux User #387700
Query 
keyserver.linux.it
 for GPG pub key ID: 0xF50D4C69
Fingerprint:
3618 E21C CA59 0EAC 2E00 F9BF 34A4 D6A0 F50D 4C69
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFGbqHLNKTWoPUNTGkRAm1RAJ9aq9knkaoWC3if50FcKCNQdDtTdwCgjaBh
NIMqiv8PFNfHC3WK2ItGlK0=
=Dvna
-----END PGP SIGNATURE-----

 $_SERVER["http_referer"]
Peccato che il mio server non abbia attiva questa variabile.
