Legal Agreement Page (LDA) in PHP

Posted on agosto 1, 2009
Filed Under Appunti di Php | Leave a Comment

In questo articolo verra’ presentata una classica Legal Agreement Page (LDA) per il controllo dell’eta’ di un utente. Classici esempi di LDA page vengono usati per limitare l’accesso ai soli maggiorenni a pagine con contenuti per soli adulti, alcolici e quant’altro.

Vedremo in questo articolo alcuni problemi nell’uso di PHP e Cookie ed implementeremo il controllo tramite l’uso delle sessioni.

In breve questo il funzionamento della LDA: tutti i contenuti protetti dalla LDA conterranno un controllo sulla variabile di sessione; se la variabile di sessione non esiste e non si tratta di un motore di ricerca (Google, Yahoo, MSN (BING)) l’utente deve prima superare la LDA per poter accedere al contenuto.

Ad ogni contenuto che dovra’ superare la LDA andremo ad inserire il controllo sulla sessione. Parliamo di contenuto e non di pagina perche’ con le tecniche di rewrite una pagina fisica potra’ generare piu’ di un contenuto e non tutti i contenuti generati dovranno necessariamente essere bloccati dalla LDA. E’ quindi necessario inserire questo controllo prima di stampare a video qualsiasi output:

<?php
session_start(); // Avvio la sessione

// Controllo se ho la variabile di sessione…
if (!isset($_SESSION['dolcetto']))
{
$useragent = strtoupper(trim($_SERVER['HTTP_USER_AGENT']));
$google = “GOOGLEBOT”;
$yahoo    = “SLURP”;
$msn    = “MSNBOT”;

if ((stristr($useragent, $google)) OR (stristr($useragent, $yahoo)) OR (stristr($useragent, $msn)))
$a = 1;
else
{
$redirectUrl = ($_SERVER['REDIRECT_URL']);
header(‘Location: /lda.php?url=’.$redirectUrl);
}
}
….

Nel corpo della pagina LDA (lda.php nell’esempio) inseriremo un form con 3 campi:

- campo nascosto che memorizza il campo url di provenienza;
- giorno di nascita;
- mese di nascita;
- anno di nascita;

Le combobox verranno riempite da tre cicli for con giorno (1 -3), mese (1-12) ed anno (1920 – oggi). La prima parte conterra’ un controllo in Javascript per verificare che i tre campi vengano tutti riempiti prima di eseguire la action del form (se stesso perche’ non specificata!).

<script>
function inviaModulo()
{
var gg     = document.eta.gg.value;
var mm     = document.eta.mm.value;
var aaaa = document.eta.aaaa.value;

if ((gg == “”) || (gg == “undefined”)) {
alert(“La preghiamo di inserire il giorno di nascita.”);
document.eta.gg.focus();
return false;
}
else if ((mm == “”) || (mm == “undefined”)) {
alert(“La preghiamo di inserire il mese di nascita.”);
document.eta.mm.focus();
return false;
}
else if ((aaaa == “”) || (aaaa == “undefined”)) {
alert(“La preghiamo di inserire l’anno di nascita.”);
document.eta.aaaa.focus();
return false;
}
else
document.eta.submit();
}
</script>

<form name=”eta” method=”post”>
<?php
$arrivoDa = addslashes($_GET['url']);
if (isset($_POST['gg']))
$arrivoDa = addslashes($_POST['redir']);
echo(‘<input type=”hidden” name=”redir” value=”‘.$arrivoDa.’” />’);
?>
<select name=”gg”>
<option value=”">giorno</option>
<?php
for($i=1;$i<31;$i++)
{
echo(‘<option value=”‘.$i.’”‘);
if ((isset($_POST['gg'])) AND ($_POST['gg'] == $i))
echo(‘ selected=”selected” ‘);
echo(‘>’.$i.’</option>’);
}
?>
</select>
<select name=”mm”>
<option value=”">mese</option>
<?php
for($i=1;$i<12;$i++)
{
echo(‘<option value=”‘.$i.’”‘);
if ((isset($_POST['mm'])) AND ($_POST['mm'] == $i))
echo(‘ selected=”selected” ‘);
echo(‘>’.$i.’</option>’);
}
?>
</select>
<select name=”aaaa”>
<option value=”">anno</option>
<?php
$aa = date(“Y”)+1;
for($i=1920;$i<$aa;$i++)
{
echo(‘<option value=”‘.$i.’”‘);
if ((isset($_POST['aaaa'])) AND ($_POST['aaaa'] == $i))
echo(‘ selected=”selected” ‘);
echo(‘>’.$i.’</option>’);
}
?>
</select>
<p>&nbsp;</p>
<div onclick=”inviaModulo(); return false;”><font size=”+1″ style=”cursor:pointer;”>ENTRA</font></div>
</form>

Il form e’ stato creato in modo che se l’utente ha inserito una data di nascita sbagliata gli venga riproposta se minorenne.

Prima di qualsiasi altro codice (compreso il tag <html>) nella pagina lda.php (quella che contiene il form di cui sopra). Andremo ad inserire il seguente codice:

<?php
session_start();

$utenteMinorenne = “”;
if (isset($_POST['gg']))
{
// Controllo se maggiorenne…
$arrivoDa = addslashes($_POST['redir']);
$gg = addslashes($_POST['gg']);
$mm = addslashes($_POST['mm']);
$aaaa= addslashes($_POST['aaaa']);
if (mktime(0,0,0,date(“m”),date(“d”),date(“Y”)-18) < mktime(0,0,0,$mm,$gg,$aaaa))
$utenteMinorenne = “<p>Utente Minorenne</p>”;
else
{
session_register(‘dolcetto’);
$_SESSION['dolcetto'] = “dolcetto”;

header(‘Location: ‘.$arrivoDa);

die();
}
}
?>

Se viene passato il campo “gg” in post (il giorno), allora controllo la data ed eventualmente riempio la variabile $utenteMinorenne che puo’ essere visualizzata sotto il form gia’ precompilato con la data di nascita inserita dall’utente, altrimenti creo la variabile di sessione e faccio una header location verso il contenuto che l’utente aveva richiesto che sara’ quindi disponibile.

Avremo quindi una pagina lda.php cosi’ fatta:

<?php
session_start();

$utenteMinorenne = “”;
if (isset($_POST['gg']))
{
// Controllo se maggiorenne…
$arrivoDa = addslashes($_POST['redir']);
$gg = addslashes($_POST['gg']);
$mm = addslashes($_POST['mm']);
$aaaa= addslashes($_POST['aaaa']);
if (mktime(0,0,0,date(“m”),date(“d”),date(“Y”)-18) < mktime(0,0,0,$mm,$gg,$aaaa))
$utenteMinorenne = “<p>Utente Minorenne</p>”;
else
{
session_register(‘dolcetto’);
$_SESSION['dolcetto'] = “dolcetto”;

header(‘Location: ‘.$arrivoDa);

die();
}
}
?>

<html>
<head>
<title>Lda Page da Free Script PHP</title>
</head>
<body>

<p>Per accedere ai contenuti deve aver compiuto la maggiore eta’.<br>Prego inserire la sua data di nascita.</p>

<script>
function inviaModulo()
{
var gg     = document.eta.gg.value;
var mm     = document.eta.mm.value;
var aaaa = document.eta.aaaa.value;

if ((gg == “”) || (gg == “undefined”)) {
alert(“La preghiamo di inserire il giorno di nascita.”);
document.eta.gg.focus();
return false;
}
else if ((mm == “”) || (mm == “undefined”)) {
alert(“La preghiamo di inserire il mese di nascita.”);
document.eta.mm.focus();
return false;
}
else if ((aaaa == “”) || (aaaa == “undefined”)) {
alert(“La preghiamo di inserire l’anno di nascita.”);
document.eta.aaaa.focus();
return false;
}
else
document.eta.submit();
}
</script>

<form name=”eta” method=”post”>
<?php
$arrivoDa = addslashes($_GET['url']);
if (isset($_POST['gg']))
$arrivoDa = addslashes($_POST['redir']);
echo(‘<input type=”hidden” name=”redir” value=”‘.$arrivoDa.’” />’);
?>
<select name=”gg”>
<option value=”">giorno</option>
<?php
for($i=1;$i<31;$i++)
{
echo(‘<option value=”‘.$i.’”‘);
if ((isset($_POST['gg'])) AND ($_POST['gg'] == $i))
echo(‘ selected=”selected” ‘);
echo(‘>’.$i.’</option>’);
}
?>
</select>
<select name=”mm”>
<option value=”">mese</option>
<?php
for($i=1;$i<12;$i++)
{
echo(‘<option value=”‘.$i.’”‘);
if ((isset($_POST['mm'])) AND ($_POST['mm'] == $i))
echo(‘ selected=”selected” ‘);
echo(‘>’.$i.’</option>’);
}
?>
</select>
<select name=”aaaa”>
<option value=”">anno</option>
<?php
$aa = date(“Y”)+1;
for($i=1920;$i<$aa;$i++)
{
echo(‘<option value=”‘.$i.’”‘);
if ((isset($_POST['aaaa'])) AND ($_POST['aaaa'] == $i))
echo(‘ selected=”selected” ‘);
echo(‘>’.$i.’</option>’);
}
?>
</select>
<p>&nbsp;</p>
<div onclick=”inviaModulo(); return false;”><font size=”+1″ style=”cursor:pointer;”>ENTRA</font></div>
</form>

<?php echo($utenteMinorenne); ?>

</body>

</html>

Esempio di pagina contenuto.php:

<?php
session_start(); // Avvio la sessione

// Controllo se ho la variabile di sessione…
if (!isset($_SESSION['dolcetto']))
{
$useragent = strtoupper(trim($_SERVER['HTTP_USER_AGENT']));
$google = “GOOGLEBOT”;
$yahoo    = “SLURP”;
$msn    = “MSNBOT”;

if ((stristr($useragent, $google)) OR (stristr($useragent, $yahoo)) OR (stristr($useragent, $msn)))
$a = 1;
else
{
$redirectUrl = ($_SERVER['REDIRECT_URL']);
header(‘Location: /lda.php?url=’.$redirectUrl);
}
}

?>

<html><head><title>Contenuto protetto da LDA</title></head><body>Contenuto protetto</body></html>

Sarebbe indicato anche l’uso di cookie in modo da poter dare una durata alla LDA in maniera semplice ma utilizzare la funzione setcookie in combinazione con la Header Location crea dei problemi di incompatibilita’ con alcuni browser; in questo modo abbiamo superato il problema rendendo il codice compatibile con la maggior parte dei browser attualmente in circolazione.

Others Script adv

Leave a Reply