1: Verifica del conteggio dei file inclusi
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
exit('Restricted Access');
}
Logica: PHP viene chiuso se non viene soddisfatto il conteggio minimo di inclusione. Si noti che prima di PHP5, la pagina di base non era considerata un'inclusione.
2: Definizione e verifica di una costante globale
// In the base page (directly accessed):
define('_DEFVAR', 1);
// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');
Logica: se la costante non è definita, l'esecuzione non ha avuto inizio dalla pagina di base e PHP interromperà l'esecuzione.
Si noti che per motivi di portabilità attraverso aggiornamenti e modifiche future, rendere modulare questo metodo di autenticazione ridurrebbe in modo significativo il sovraccarico di codifica poiché le modifiche non dovranno essere codificate su ogni singolo file.
// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');
// Replace the same code in the include files with:
require_once('checkdefined.php');
In questo modo è possibile aggiungere codice aggiuntivo checkdefined.php
per la registrazione e per scopi analitici, nonché per generare risposte appropriate.
Credito a cui è dovuto il credito: l'idea geniale della portabilità è nata da questa risposta .
3: autorizzazione indirizzo remoto
// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");
// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');
Lo svantaggio di questo metodo è l'esecuzione isolata, a meno che un token di sessione fornito con la richiesta interna. Verificare tramite l'indirizzo di loop-back in caso di configurazione di un singolo server o una lista bianca di indirizzi per un'infrastruttura server multi-server o con bilanciamento del carico.
4: autorizzazione token
Simile al metodo precedente, è possibile utilizzare GET o POST per passare un token di autorizzazione al file include:
if($key!="serv97602"){header("Location: ".$dart);exit();}
Un metodo molto disordinato, ma forse anche il più sicuro e versatile allo stesso tempo, se usato nel modo giusto.
5: Configurazione specifica del server web
La maggior parte dei server consente di assegnare autorizzazioni per singoli file o directory. È possibile posizionare tutte le inclusioni in tali directory limitate e configurare il server per negarle.
Ad esempio in APACHE, la configurazione è memorizzata nel .htaccess
file. Tutorial qui .
Si noti tuttavia che le configurazioni specifiche del server non sono consigliate da me perché sono dannose per la portabilità su diversi server Web. In casi come i sistemi di gestione dei contenuti in cui l'algoritmo deny è complesso o l'elenco delle directory negate è piuttosto grande, potrebbe solo rendere le sessioni di riconfigurazione piuttosto raccapriccianti. Alla fine è meglio gestirlo nel codice.
6: il posizionamento include in una directory sicura ESTERNA la radice del sito
Meno preferito a causa delle limitazioni di accesso negli ambienti server, ma un metodo piuttosto potente se si ha accesso al file system.
//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");
Logica:
- L'utente non può richiedere alcun file esterno alla
htdocs
cartella poiché i collegamenti sarebbero al di fuori dell'ambito del sistema di indirizzi del sito Web.
- Il server php accede al file system in modo nativo e quindi può accedere ai file su un computer proprio come può fare un normale programma con i privilegi richiesti.
- Inserendo i file di inclusione in questa directory, è possibile assicurarsi che il server php riesca ad accedervi, mentre l'hotlinking viene negato all'utente.
- Anche se la configurazione dell'accesso al filesystem del server web non fosse stata eseguita correttamente, questo metodo impedirebbe che tali file diventino pubblici per errore.
Per favore, scusa le mie convenzioni di codifica non ortodosse. Qualsiasi feedback è apprezzato.