2012-01-04 12 views
7

Ho uno script jQuery che utilizza .live() per caricare il suo contenuto di pagina.Come negato lo script di accesso utente direttamente nell'URL

$('#content').load("content.php?" + id); 

Domanda: Come posso negare un utente di accedere al file content.php direttamente tramite un URL?

ho cercato di inserire questo codice in cima content.php ma Accesso negato appaiono nella mia #content div

if (!empty($_SERVER['SCRIPT_FILENAME']) && 'content.php' == basename($_SERVER['SCRIPT_FILENAME'])) 
    die('Access Denied'); 

Qual è il modo corretto per assicurarsi che gli utenti non possono accedere il mio file content.php utilizzando un URL?

+0

Perché vuoi negare loro l'accesso? Se non potevano accedere direttamente al file, allora Ajax non sarebbe in grado di accedere al file. –

+0

Come intendete "impossibile accedere direttamente". Se l'utente può accedere alla risorsa tramite un JavaScript, sarà anche in grado di accedervi aggiungendo l'URL nella sua barra degli indirizzi? O vuoi dire che non dovrebbe essere in grado di accedere a content.php senza passare la corretta querystring, come nel tuo esempio di javascript? –

risposta

6

Si potrebbe utilizzare una sorta di hashing . Ad esempio se content.php ha il parametro id; aggiungi un ulteriore parametro hash che contiene l'hash MD5 di "'una stringa casuale' + id * 15". In content.php si controlla se l'hash & corrisponde; se non negato l'accesso.

Il calcolo deve essere eseguito in PHP (non ajax) perché l'utente non deve conoscere l'algoritmo di hashing.

Con questo metodo l'utente può cercare il codice sorgente e accedere direttamente alla pagina ma non è possibile impedirlo completamente perché il browser deve accedere alla pagina per mostrarlo. Ma l'utente non può accedere alle pagine a cui non ha avuto accesso tramite ajax prima. Potresti usare alcune intestazioni (HTTP_X_REQUESTED_WITH) per impedire alla maggior parte degli utenti di accedere direttamente alla pagina, ma gli utenti esperti cambieranno l'intestazione e accederanno comunque.

+0

Ma in tal caso dovresti visualizzare l'URL completo nell'origine, all'interno della tua chiamata AJAX. Quindi l'utente potrebbe semplicemente sfogliare la fonte per trovare l'URL corretto da usare? Come nel mio commento sulla risposta di Fabrizio, chi vorrebbe davvero proteggere la risorsa? –

+0

Sì; ma l'utente può accedere solo ai contenuti che ha già visto sul lato. Il browser deve accedere alla pagina; quindi deve essere accessibile. – MasterCassim

+0

Questo è vero, in questo modo è possibile proteggere la risorsa da persone senza l'URL completo. Forse interpreto male la domanda, ma mentre la leggo, credo che chieda un modo per rendere possibile l'accesso a una risorsa solo tramite JavaScript, non sfogliando direttamente l'URL, e in tal caso ciò non sarebbe di aiuto. D'altra parte, non vedo perché vorreste una tale limitazione. –

2

Dal momento che si sta chiamando una risorsa tramite ajax una possibile soluzione è l'invio di un particolare colpo di testa nella richiesta di come HTTP_X_REQUESTED_WITH e quindi rilevare il lato server intestazione in questo modo:

/* AJAX check */ 
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') { 

    die($content); 
} 
+4

Questo potrebbe essere sfruttato inviando false intestazioni. – MasterCassim

+0

Questo probabilmente impedirebbe agli utenti "normali" di accedere direttamente alla pagina, perché non guardano la fonte e si rendono conto che possono inviare l'intestazione prevista. Tuttavia, poiché gli utenti "normali" non guardano all'origine e non monitorano il loro traffico HTTP, non conoscono l'URL richiesto all'inizio (poiché la richiesta viene eseguita in background). Quindi da chi ci proteggiamo? –

0

C'è altro contenuto nella pagina principale che è possibile fare riferimento dal file content.php per verificare che lo si sta caricando come parte della pagina principale e non una pagina autonoma? Puoi anche passare qualcosa tramite una sessione dalla pagina principale alla pagina content.php e quindi rimuovere l'elemento alla fine del caricamento di content.php.

3

Se si desidera proteggere l'utilizzo è possibile utilizzare un algoritmo a chiave una tantum. Chiedi al server di generare una chiave che la pagina conterrà in una variabile o in un attributo da qualche parte. Poi sul comando di carico si passa la chiave per content.php in questo modo:

key = $("{some selector to get the key}") 
$('#content').load("content.php?id=" + id + "key=" + key); 

volta che la pagina effettua la chiamata al server utilizzando la chiave del server scadrà la chiave che lo rende inutilizzabile. In questo modo solo le richieste di pagine attive avranno accesso al tuo file content.php.

Questo metodo non è ancora a prova di proiettile ma renderebbe più difficile l'accesso al content.php dall'utente.

0

Se l'URL è accessibile con la richiesta AJAX, è possibile accedervi direttamente e non c'è molto che si possa fare al riguardo.Si può cercare di rilevare se una richiesta è la richiesta AJAX con:

function isAjaxRequest() { 
    return array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'; 
} 

e verificare per esso nel all'inizio dello script:

if (!isAjaxRequest()) 
    die('Access Denied'); 

, ma non si dovrebbe fare affidamento su questo controllo troppo perché è piuttosto facile da bypassare.

Problemi correlati