Ouroboros

Un saluto a voi lettori,
è il mio primo post e con questo inaugurerò la sezione snippet; sezione che useremo come una sorta di database di esempi e varie problematiche svolte dai ragazzi di #web, con la speranza di fare guadagnare del tempo ai posteri che dovessero trovarsi in difficoltà con le medesime problematiche.

In questo post tratteremo di come creare un controllo che permette di eseguire una pagina solamente se inclusa da un’altra pagina.

Quello di cui abbiamo bisogno quindi è:

  • una pagina che che utilizzeremo come main (da adesso main.php)
  • una pagina che verra inclusa da main.php (da adesso includes.php)
  • webserver (apache et simila)
  • php
  • forbici a punta arrotondata

Iniziamo a buttare giù il codice, partendo proprio da main.php che dovrà includere il file includes.php

main.php
<?php
echo "<h1>Prova</h1>";
@include('includes.php'); // Include il file includes.php
// Output o altro blocco di codice
?>

Ora non ci rimane che passare al includes.php, che sarà il file che potrà essere lanciato (incluso) solamente da un’altra pagina.

includes.php
<?php
$includes = get_included_files(); // #1
if($includes[0] == __FILE__) die(”<h5>Questo file può essere solamente incluso!</h5>”); // #2
echo “<p>Sono l’output o blocco di codice che dovrà essere visualizzato solamente se sono stato incluso!</p>”;
?>

Analizziamo il codice:
#1. La funzione di php “get_included_files()” restituisce un array con tutti i files che sono stati inclusi tramite funzione include() di php;
NB: I file veranno salvati nell’array con il realpath
PS: Il file che ha come indice “0” è il nome del file che viene lanciato, dall’indice 1 in poi sono i files che vengono inclusi.

#2. In questo passaggio eseguiamo un controllo per verificare che il file che ha l’indice 0 non sia uguale alla variabile __FILE__ (che sarebbe il file che viene invocato), se coincidono vuoldire che il file è stato chiamato direttamente quindi dobbiamo bloccare l’esecuzione dello script per non visualizzare l’output che viene messo sotto questa istruzione.
Nel mio caso ho messo un die() per stampare una stringa d’errore, è consigliabile mettere un return per non bloccare l’esecuzione di generale (nel caso venga richiamato tramite main.php)

Vediamo ora il codice completo:
main.php
<?php
echo "<h1>Prova</h1>";
@include('includes.php'); // Include il file includes.php
// Output o altro blocco di codice
?>

includes.php
<?php
$includes = get_included_files();
if($includes[0] == __FILE__) die(”<h5>Questo file può essere solamente incluso!</h5>”);
echo “<p>Sono l’output o blocco di codice che dovrà essere visualizzato solamente se sono stato incluso!</p>”;
?>

—————–

Concludere questo snippet con una versione un pò più pratica, nel caso si voglia utilizzare in più pagine il controllo.

<?php
function is_included() {
$includes = get_included_files(); // #1
if($includes[0] == __FILE__) return FALSE;
return TRUE;
}
?>

Potete richiamare questa funzione tramite is_included() che restituirà TRUE nel caso il file è stato lanciatro tramite un include, FALSE in caso contrario.
Esempio d’utilizzo:

<?php
if(is_included() == FALSE) die("Non puoi lanciarmi direttamente!");
echo 'contenuto del file che può essere letto solmamente se incluso!!';
?>

Spero che vi sia stato d’aiuto, e che sia chiaro.
Alla prossima!