Impedisci l'accesso diretto a un file include php


166

Ho un file php che userò esclusivamente come include. Pertanto, vorrei generare un errore anziché eseguirlo quando vi si accede direttamente digitando l'URL anziché essere incluso.

Fondamentalmente ho bisogno di fare un controllo come segue nel file php:

if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");

C'è un modo semplice per farlo?


10
invece del die () dovresti testare l'intestazione ("File HTTP / 1.1 404 non trovato", 404); Uscita;'. Questo (almeno su Apache) farà tornare il server alla normale pagina 404.
Gnud,

Ecco due semplici metodi che ho spiegato per disabilitare l'accesso diretto nei file inclusi in PHP: codespeedy.com/disable-direct-access-to-the-php-include-file
Faruque Ahamed Mollick

Risposte:


174

Il modo più semplice per la situazione generica "App PHP in esecuzione su un server Apache che puoi o non puoi controllare completamente" è inserire le tue inclusioni in una directory e negare l'accesso a quella directory nel tuo file .htaccess. Per salvare le persone dai guai di Google, se usi Apache, inseriscilo in un file chiamato ".htaccess" nella directory a cui non vuoi essere accessibile:

Deny from all

Se in realtà hai il pieno controllo del server (più comune oggigiorno anche per piccole app rispetto a quando ho scritto per la prima volta questa risposta), l'approccio migliore è quello di incollare i file che vuoi proteggere al di fuori della directory dalla quale il tuo server web sta servendo . Quindi, se la tua app è attiva /srv/YourApp/, imposta il server per pubblicare i file /srv/YourApp/app/e inserisci le inclusioni /srv/YourApp/includes, quindi non c'è letteralmente alcun URL che possa accedervi.


1
Grazie, dato che ho il pieno controllo del server su cui eseguo questa app, questa è la risposta che ho scelto.
Alterlife

24
se si ha il pieno controllo del server è meglio se si configura una direttiva di directory nel file di configurazione dell'host virtuale. Apache lo legge solo una volta all'avvio, .htaccess viene letto su ogni accesso e rallenta il server
Eineki

22
Sarebbe bello avere un file .htaccess di esempio come parte di questa risposta.
Graham Lea,

7
<Files ~ "\.inc$"> Order Allow,Deny Deny from All </Files>
Dracorat,

11
@James: Inoltre, non tutti pensano che Stack Overflow dovrebbe essere un sito "per favore, invia il codice". Se risponde chiaramente alla domanda, allora è una buona risposta. Fornire un esempio in cui non è necessario nessuno incoraggia solo la codifica copia e incolla.
Chuck,

188

Aggiungi questo alla pagina che desideri includere solo

<?php
if(!defined('MyConst')) {
   die('Direct access not permitted');
}
?>

quindi nelle pagine che lo includono aggiungere

<?php
define('MyConst', TRUE);
?>

3
Ho davvero bisogno di imparare a digitare più velocemente. Lo stesso suggerirei, poiché è più sicuro di un metodo che utilizza una variabile per verificare. Poiché con alcune configurazioni di PHP potrebbe essere possibile sovrascrivere la variabile.
Mark Davidson,

3
Ecco come vengono gestite da alcune applicazioni "mainstream". So che Joomla lo fa in questo modo e penso anche a Wiki, Wordpress e altri.
UnkwnTech

1
Forse il messaggio è troppo utile per un hacker (nessun utente reale potrebbe trovare queste pagine), puoi semplicemente inviare un'intestazione di reindirizzamento e interrompere l'elaborazione di php.
bandi

7
Basta inviare un'intestazione 404 ed uscire - la pagina di errore apparirà identica alle normali 404 pagine (almeno su Apache).
Gnud,

4
@ Smile.Hunter: si tratta di bloccare l'accesso alla visualizzazione diretta dei file di script include / library, la risposta funziona. Se hanno creato somefile.phpsul tuo server e aggiunto la tua definizione in esso, ciò non consente loro di accedere direttamente al file include. Permetterà loro di "includere" i tuoi file di libreria, ma se arrivano abbastanza lontano da creare file sul tuo server e conoscere i tuoi script di definizione / inclusione, hai altri problemi che probabilmente negano la scrittura del proprio file con la tua definizione in primo luogo .
James,

114

Ho un file che devo agire diversamente quando è incluso vs quando vi si accede direttamente (principalmente un print()vs return()) Ecco un codice modificato:

if(count(get_included_files()) ==1) exit("Direct access not permitted.");

Il file a cui si accede è sempre un file incluso, quindi == 1.  


12
Questa è in realtà un'idea infernale, controllare il conteggio dei file inclusi. Mi chiedo quale sia la migliore: usare definisce o usare questo metodo? Questo sembra più autonomo.
Akoi Meexx,

La prima volta che ho mai visto qualcuno venire con questo. Non so perché, perché sembra autonomo come può essere, e sta misurando direttamente ciò che realmente vuoi sapere (se è incluso o meno) piuttosto che misurare qualcosa che si presume sia associato (come una certa costante o un certa posizione vietata da .htaccess). Bellissimo.
Jimbo Jonny

Questo è davvero interessante perché l'uso di .htaccess per bloccare tutti i file .php potrebbe non essere possibile in ogni momento in quanto ci possono essere alcuni file nella stessa directory che devono essere chiamati direttamente o anche tramite javascript. Grazie per questa fantastica idea!
Anuj,

3
Funziona solo in PHP5 e versioni successive. Pre-PHP5 vuoi confrontare di nuovo 0 invece di 1.
jmucchiello,

Questa è una soluzione davvero intelligente e ti consente di controllare l'accesso diretto, non solo di bloccarlo, è quello che mi piace. Di solito includo i test unitari nei file stessi e in questo modo posso racchiudere i test unitari in questa istruzione if. Mi chiedo quanto sia efficiente ...
con il

34

Il modo migliore per impedire l'accesso diretto ai file è posizionarli al di fuori della radice del documento del server Web (di solito, un livello sopra). Puoi ancora includerli, ma non è possibile che qualcuno acceda ad essi tramite una richiesta http.

Di solito vado fino in fondo e posiziono tutti i miei file PHP al di fuori del root del documento a parte il file bootstrap - un index.php solitario nel root del documento che inizia a instradare l'intero sito Web / applicazione.


3
Questa è un'ottima soluzione se sei in grado di farlo. Solo di recente ho dovuto iniziare a lavorare con i webhost condivisi e ho scoperto che uno dei tanti fastidi è che tutto deve essere all'interno della docroot.
Beau Simensen,

3
In ogni provider di hosting con cui ho lavorato ho sempre avuto accesso (esattamente) a un livello sopra la radice del documento.
Eran Galperin,

3
Su alcuni host (incluso il mio attuale), puoi indirizzare il tuo dominio su qualsiasi cartella desideri.
Dinah,

1
Questa è anche una buona alternativa .. usando preg_match -> if (preg_match ("~ globalfile \ .php ~ i", $ _SERVER ['PHP_SELF'])) {{((<h3 style = "color: red">) Avviso di sicurezza dell'appliance - Accesso diretto non consentito! Il tuo IP è stato registrato! <h3> '); // Interrompi ulteriore esecuzione}
MarcoZen,

L'URL devzone.zend.com/node/view/id/70 è un 404 ora. La risposta dovrebbe includere il codice originariamente utilizzato dall'URL inesistente.
Funk Forty Niner

31

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 .htaccessfile. 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 htdocscartella 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.


mi piace il numero 2
Baim Wrong,

26

Un'alternativa (o complemento) alla soluzione di Chuck sarebbe quella di negare l'accesso ai file che corrispondono a uno schema specifico inserendo qualcosa di simile nel tuo file .htaccess

<FilesMatch "\.(inc)$">
    Order deny,allow
    Deny from all
</FilesMatch>

Sarebbe meglio usare .inc.php credo, ed è una pratica comune
Lis

14

In realtà il mio consiglio è di fare tutte queste migliori pratiche.

  • Metti i documenti fuori dal webroot OPPURE in una directory a cui è negato l'accesso dal server web AND
  • Utilizzare nei documenti visibili una definizione che i documenti nascosti verificano:
      if (!defined(INCL_FILE_FOO)) {
          header('HTTP/1.0 403 Forbidden');
          exit;
      }

In questo modo se i file diventano in qualche modo fuori posto (un'operazione ftp errata) sono comunque protetti.


8

Ho avuto questo problema una volta, risolto con:

if (strpos($_SERVER['REQUEST_URI'], basename(__FILE__)) !== false) ...

ma la soluzione ideale è posizionare il file al di fuori della radice del documento del web server, come menzionato in un'altra risposta.


7

Faresti meglio a creare un'applicazione con un punto di accesso, cioè tutti i file dovrebbero essere raggiunti da index.php

Metti questo in index.php

define(A,true);

Questo controllo dovrebbe essere eseguito in ogni file collegato (tramite richiedi o includi)

defined('A') or die(header('HTTP/1.0 403 Forbidden'));

7

Volevo limitare l'accesso al file PHP direttamente, ma anche essere in grado di chiamarlo tramite jQuery $.ajax (XMLHttpRequest). Ecco cosa ha funzionato per me.

if (empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_SERVER["HTTP_X_REQUESTED_WITH"] != "XMLHttpRequest") {
    if (realpath($_SERVER["SCRIPT_FILENAME"]) == __FILE__) { // direct access denied
        header("Location: /403");
        exit;
    }
}

3

Il modo più semplice è impostare alcune variabili nel file che includono le chiamate, ad esempio

$including = true;

Quindi nel file che viene incluso, controlla la variabile

if (!$including) exit("direct access not permitted");

2
Questo è pericoloso se register_globals è attivo.
jmucchiello,

25
PHP è pericoloso se register_globals è attivo.
David Precious,

3

Oltre al modo .htaccess, ho visto un modello utile in vari framework, ad esempio in ruby ​​on rails. Hanno una directory pub / separata nella directory root dell'applicazione e le directory della libreria vivono in directory allo stesso livello di pub /. Qualcosa del genere (non ideale, ma hai l'idea):

app/
 |
 +--pub/
 |
 +--lib/
 |
 +--conf/
 |
 +--models/
 |
 +--views/
 |
 +--controllers/

Hai impostato il tuo server web per usare pub / come root del documento. Ciò offre una migliore protezione agli script: mentre possono raggiungere dalla radice del documento per caricare i componenti necessari, è impossibile accedere ai componenti da Internet. Un altro vantaggio oltre alla sicurezza è che tutto è in un unico posto.

Questa configurazione è migliore della semplice creazione di controlli in ogni singolo file incluso perché il messaggio "accesso non consentito" è un indizio per gli aggressori ed è migliore della configurazione .htaccess perché non è basato su una lista bianca: se si rovinano le estensioni dei file non sarà visibile nelle directory lib /, conf / etc.


Dopo molto tempo voglio solo commentare che il modello che descrivi sopra chiamato modello MVC (Model - View - Controller). Se per favore, controlla google e aggiungi qualche informazione in più alla tua risposta. Inoltre MVC supporta non solo le applicazioni Ruby on Rails e ASP.NET, ma anche PHP (vedi Lavarel, CakePHP).

3

Che Joomla! do sta definendo una costante in un file root e controllando se lo stesso è definito nei file inclusi.

defined('_JEXEC') or die('Restricted access');

o altro

si possono tenere tutti i file fuori dalla portata di una richiesta http posizionandoli fuori dalla directory webroot come la maggior parte dei framework come CodeIgniter consiglia.

o anche inserendo un file .htaccess nella cartella include e scrivendo le regole, puoi impedire l'accesso diretto.


3
debug_backtrace() || die ("Direct access not permitted");

3

La mia risposta è in qualche modo diversa nell'approccio ma include molte delle risposte fornite qui. Consiglierei un approccio su più fronti:

  1. .htaccess e restrizioni di Apache di sicuro
  2. defined('_SOMECONSTANT') or die('Hackers! Be gone!');

TUTTAVIA l' defined or dieapproccio ha una serie di fallimenti. In primo luogo, è un vero dolore nelle ipotesi con cui testare ed eseguire il debug. In secondo luogo, si tratta di un refactoring terrificante, noiosamente noioso se si cambia idea. "Trova e sostituisci!" tu dici. Sì, ma quanto sei sicuro che sia scritto esattamente lo stesso ovunque, hmmm? Ora moltiplicalo con migliaia di file ... oO

E poi c'è .htaccess. Cosa succede se il tuo codice è distribuito su siti in cui l'amministratore non è così scrupoloso? Se fai affidamento solo su .htaccess per proteggere i tuoi file, avrai anche bisogno di a) un backup, b) una scatola di fazzoletti per asciugare le lacrime, c) un estintore per spegnere le fiamme in tutto il tempo delle persone usando il tuo codice.

Quindi so che la domanda richiede il "più semplice", ma penso che ciò che richiede sia una "codifica difensiva".

Quello che suggerisco è:

  1. Prima di ogni tuo script require('ifyoulieyougonnadie.php');( non include() e in sostituzione di defined or die)
  2. In ifyoulieyougonnadie.php, fai alcune cose logiche - controlla le diverse costanti, chiama lo script, i test localhost e simili - e quindi implementa il tuo die(), throw new Exception, 403, ecc.

    Sto creando il mio framework con due possibili punti di ingresso - il principale index.php (Joomla framework) e ajaxrouter.php (il mio framework) - quindi, a seconda del punto di ingresso, controllo diverse cose. Se la richiesta ifyoulieyougonnadie.phpnon proviene da uno di questi due file, so che gli shenanigans sono in fase di realizzazione!

    E se aggiungessi un nuovo punto di ingresso? Nessun problema. Ho appena cambiato ifyoulieyougonnadie.phpe sono ordinato, più nessun 'trova e sostituisci'. Evviva!

    E se decidessi di spostare alcuni dei miei script per fare un framework diverso che non ha le stesse costanti defined()? ... evviva! ^ _ ^

Ho scoperto che questa strategia rende lo sviluppo molto più divertente e molto meno:

/**
 * Hmmm... why is my netbeans debugger only showing a blank white page 
 * for this script (that is being tested outside the framework)?
 * Later... I just don't understand why my code is not working...
 * Much later... There are no error messages or anything! 
 * Why is it not working!?!
 * I HATE PHP!!!
 * 
 * Scroll back to the top of my 100s of lines of code...
 * U_U
 *
 * Sorry PHP. I didn't mean what I said. I was just upset.
 */

 // defined('_JEXEC') or die();

 class perfectlyWorkingCode {}

 perfectlyWorkingCode::nowDoingStuffBecauseIRememberedToCommentOutTheDie();

2

Se più precisamente, dovresti usare questa condizione:

if (array_search(__FILE__, get_included_files()) === 0) {
    echo 'direct access';
}
else {
    echo 'included';
}

get_included_files () restituisce un array indicizzato contenente i nomi di tutti i file inclusi (se il file viene eseguito beign, allora è stato incluso e il suo nome è nell'array). Quindi, quando si accede direttamente al file, il suo nome è il primo dell'array, tutti gli altri file dell'array sono stati inclusi.


1
<?php
if (eregi("YOUR_INCLUDED_PHP_FILE_NAME", $_SERVER['PHP_SELF'])) { 
 die("<h4>You don't have right permission to access this file directly.</h4>");
}
?>

posiziona il codice sopra nella parte superiore del file php incluso.

ex:

<?php
if (eregi("some_functions.php", $_SERVER['PHP_SELF'])) {
    die("<h4>You don't have right permission to access this file directly.</h4>");
}

    // do something
?>

if (preg_match ("~ globalfile \ .php ~ i", $ _SERVER ['PHP_SELF'])) {die ('<h3 style = "color: red"> Avviso di sicurezza dell'appliance - Accesso diretto non consentito! Il tuo IP è stato registrato! <h3> '); // Interrompi ulteriore esecuzione} whre ~ è il delimitatore
MarcoZen,

1

Il codice seguente è utilizzato nel CMS di Flatnux ( http://flatnux.altervista.org ):

if ( strpos(strtolower($_SERVER['SCRIPT_NAME']),strtolower(basename(__FILE__))) )
{
    header("Location: ../../index.php");
    die("...");
}

1

Ho trovato questa soluzione solo php e invariabile che funziona sia con http che con cli:

Definire una funzione:

function forbidDirectAccess($file) {
    $self = getcwd()."/".trim($_SERVER["PHP_SELF"], "/");
    (substr_compare($file, $self, -strlen($self)) != 0) or die('Restricted access');
}

Chiamare la funzione nel file che si desidera impedire l'accesso diretto a:

forbidDirectAccess(__FILE__);

La maggior parte delle soluzioni fornite sopra a questa domanda non funziona in modalità Cli.


dove dovrebbe digitare l'URL in modalità CLI?
Il tuo senso comune

È solo per impedire il lancio di php script / inlude in modalità cli. Può essere utile in un progetto con più sviluppatori.
Ka.

1
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { die('Access denied'); };

1
<?php       
$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  if (false !== strpos($url,'.php')) {
      die ("Direct access not premitted");
  }
?>

1

La memorizzazione dei file di inclusione all'esterno della directory accessibile dal Web è stata menzionata alcune volte ed è certamente una buona strategia laddove possibile. Tuttavia, un'altra opzione che non ho ancora visto menzionata: assicurarsi che i file include non contengano alcun codice eseguibile . Se i tuoi file include semplicemente definiscono funzioni e classi e non hanno altro codice, producono semplicemente una pagina vuota quando accedi direttamente.

Consentire assolutamente l'accesso diretto a questo file dal browser: non farà nulla . Definisce alcune funzioni, ma nessuna di esse viene chiamata, quindi nessuna di esse viene eseguita.

<?php

function a() {
    // function body
}

function b() {
    // function body
}

Lo stesso vale per i file che contengono solo classi PHP e nient'altro.


È comunque una buona idea tenere i file al di fuori della directory web ove possibile.

  • Potresti disattivare accidentalmente PHP, nel qual caso il tuo server potrebbe inviare il contenuto dei file PHP al browser, invece di eseguire PHP e inviare il risultato. Ciò potrebbe causare perdite di codice (incluse password del database, chiavi API, ecc.).
  • I file nella directory web sono accovacciati sugli URL che potresti voler usare per la tua app. Lavoro con un CMS che non può avere una pagina chiamata system, perché sarebbe in conflitto con un percorso usato per il codice. Lo trovo fastidioso.

0

Fai qualcosa come:

<?php
if ($_SERVER['SCRIPT_FILENAME'] == '<path to php include file>') {
    header('HTTP/1.0 403 Forbidden');
    exit('Forbidden');
}
?>

Ciò non impedisce che venga caricato nel browser.
UnkwnTech

0

Puoi utilizzare il seguente metodo di seguito, sebbene abbia un difetto, perché può essere falso, tranne se puoi aggiungere un'altra riga di codice per assicurarti che la richiesta provenga solo dal tuo server utilizzando Javascript. Puoi inserire questo codice nella sezione Body del tuo codice HTML, quindi l'errore mostra lì.

<?
if(!isset($_SERVER['HTTP_REQUEST'])) { include ('error_file.php'); }
else { ?>

Inserisci qui l'altro tuo codice HTML

<? } ?>

Terminalo in questo modo, quindi l'output dell'errore verrà sempre mostrato nella sezione body, se è così che vuoi che sia.


Comprendo che tutte le intestazioni del server HTTP_ * non sono affidabili, quindi è meglio non utilizzare questo metodo.
andreszs,

0

suggerisco di non utilizzarlo $_SERVERper motivi di sicurezza.
Puoi usare una variabile come $root=true;nel primo file che ne includeva un'altra.
e utilizzare isset($root)all'inizio del secondo file da includere.


0

Quello che puoi anche fare è proteggere con password la directory e mantenere tutti i tuoi script php lì dentro, ovviamente tranne il file index.php, poiché al momento dell'inclusione la password non sarà richiesta in quanto sarà richiesta solo per l'accesso http. ciò che farà è anche offrirti la possibilità di accedere ai tuoi script nel caso lo desideri, in quanto avrai la password per accedere a quella directory. sarà necessario impostare il file .htaccess per la directory e un file .htpasswd per autenticare l'utente.

bene, puoi anche usare una qualsiasi delle soluzioni fornite sopra nel caso in cui ritieni di non aver bisogno di accedere a quei file normalmente perché puoi sempre accedervi tramite cPanel ecc.

Spero che questo ti aiuti


0

Il modo più semplice è archiviare le inclusioni al di fuori della directory web. In questo modo il server ha accesso a loro ma nessuna macchina esterna. L'unico lato negativo è che devi essere in grado di accedere a questa parte del tuo server. Il lato positivo è che non richiede installazione, configurazione o stress del codice / server aggiuntivo.


0

Non ho trovato i suggerimenti con .htaccess così buoni perché potrebbero bloccare altri contenuti in quella cartella a cui potresti voler consentire all'utente di accedere, questa è la mia soluzione:

$currentFileInfo = pathinfo(__FILE__);
$requestInfo = pathinfo($_SERVER['REQUEST_URI']);
if($currentFileInfo['basename'] == $requestInfo['basename']){
    // direct access to file
}

0
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

farà il lavoro senza intoppi


2
Copia incolla da CodeIgnitor. È bello ma in realtà non fa nulla da solo. Il file BASEPATH const è impostato in un index.phpfile che si trova nella parte inferiore della struttura ad albero. CI riscrive gli URL in modo da non dover accedere direttamente agli script comunque.
jimasun,

so che non ce n'è bisogno, ma se qualcuno prova a farlo
Varshaan,

0

Aggiunta la soluzione menzionata in precedenza con controllo della versione di PHP:

    $max_includes = version_compare(PHP_VERSION, '5', '<') ? 0 : 1;
    if (count(get_included_files()) <= $max_includes)
    {
        exit('Direct access is not allowed.');
    }

2
Non capisco davvero come ciò possa impedire l'accesso diretto
Adam Lindsay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.