prevenire la manomissione dell'URL in php
Domanda
Questa è un'applicazione del motore di test con 5 documenti impostati da me...come 5 pagine php
Flusso della domanda
Login.html
check.php // per verificare se le credenziali sono corrette
se corretto allora
main.php //l'utente fa clic su "fai il test" in questa pagina che gli mostra 1 dei 5 documenti...
ma una volta effettuato l'accesso posso semplicemente cambiare l'URL con l'URL del documento di prova che desidero... i nomi del documento r 1.php 2.php....
come posso fermare tutto questo...??
if(!isset($_SESSION['page'])//Tp
continue; //Tp
else
{
header('Location:login.php');
exit;
} //Tp
$_SESSION['page']=$_SERVER['SCRIPT_NAME'];//tp
è corretto...come ho detto ci sono 5 pagine....
in ogni pagina ho questo codice....
Controllo se la variabile di sessione è impostata ... se è impostata ... significa che ha già visitato la pagina ..... ma questo codice non funziona ... Ho usato la variabile _session ['pagina' ] prima di dichiararlo ???
Soluzione
I problemi che stai riscontrando potrebbero essere risolti per lo più organizzando il codice attorno a uno script di gestione predefinito.(vedi le mie linee guida qui sotto.)
Esistono due modi fondamentali per passare informazioni a tale script (come ho detto in un commento sopra).Il modo di base è tramite una variabile GET, come http://www.example.com/main.php?p=1
.
Se desideri avere URL più adatti ai visitatori, puoi utilizzare a RewriteRule
in un .htaccess
file per convertire gli URL piacevoli negli URL che il tuo gestore capirà.(Avrai bisogno mod_rewrite abilitato.)
Potrebbe essere eccessivo per questa domanda particolare, ma ecco alcune linee guida per le app Web sicure.Penso che siano tutti rilevanti:
- Metti le tue informazioni sensibili al di fuori della radice web pubblica.
- Per impostazione predefinita, non visualizzare alcuna informazione.Abilitare la visualizzazione delle informazioni solo se l'utente è positivamente autorizzato.
- Idealmente, questo include gli URL (se digitano un URL valido ma non sono autorizzati, non far loro sapere che hanno raggiunto un URL valido).Un modo è reindirizzare (impostare l'intestazione della posizione come stavi facendo) alla pagina di accesso se non sono autorizzati.
- Crea uno script di gestione predefinito. Questo script centrale includerà tutti i file necessari e chiamerà tutte le funzioni necessarie.Passa tutte le informazioni sulla richiesta a questo gestore e chiedigli di generare tutto l'HTML.
- Requisito per n. 3: Incapsula il tuo codice in funzioni e classi.In questo modo, il tuo gestore predefinito può chiamarli quando è pronto, solo se ne hai bisogno e non semplicemente perché sono stati inclusi.Ciò ti consente un controllo molto maggiore sul flusso della tua app.
- Invece di
echo
inserendo HTML in punti casuali nel codice, restituisci tutto l'output HTML al tuo gestore principale, che lo raccoglierà e lo stamperà tutto in un unico posto quando sarà pronto.Casualeecho
I messaggi sparsi in giro facilitano la comparsa di buchi di sicurezza. - Non fidarti dell'input dell'utente.Se intendi utilizzare un valore da cui ottieni
$_GET
O$_POST
, assicurati che sia un valore valido prima di utilizzarlo.
Modificare:
(Questo è più specifico e diretto al tuo codice così com'è adesso)
Ci sono 3 motivi per cui il tuo codice non funzionerà come previsto:
Hai omesso una parentesi di chiusura nella prima riga
if(!isset($_SESSION['page'])
.Il modo in cui è scritto il tuo codice, if
$_SESSION['page']
è già impostato quando l'utente visita la pagina, verrà reindirizzato alla pagina di accesso.Puoi risolvere questo problema inserendo il fileheader('Location:login.php'); exit;
nelif
clausola e rimuovendo laelse
clausola completamente:if(!isset($_SESSION['page'])) { header('Location:login.php'); exit; } $_SESSION['page']=$_SERVER['SCRIPT_NAME'];
È necessario impostare
$_SESSION['page']
al primo accesso in modo che possano visualizzare la prima pagina.
Consiglierei di utilizzare un numero intero per $_SESSION['page']
invece del nome dello script.In questo modo puoi impostare $_SESSION['page']
a 1 quando accedono e ogni volta che visualizzano correttamente una pagina, incrementano $_SESSION['page']
per uno.Prendere in considerazione $_SESSION['page']
significare il prossimo articolo che l'utente potrà visualizzare.
È possibile impostare un $pageid
su ogni carta.Ogni volta che provano a visualizzare una pagina, se $_SESSION['page']
è meno di $pageid
, non consentire loro di visualizzare la pagina.
Altri suggerimenti
Il modo migliore è quello di costruire vera autenticazione e autorizzazione nella vostra applicazione. Poi l'URL che risponda alle esigenze di carta per verificare che l'utente è autorizzato a visualizzare la pagina prima di servirlo.
Qualunque cosa si sta facendo in check.php, farlo sulla pagina carta stessa.
Un sacco di alternative. Una coppia:
-
non codificano il nome dei nomi di carta nella URL, ma restituire il contenuto della carta selezionato da una pagina chiamata, ad esempio, test-paper.php.
-
traccia sui giornali che l'utente ha il diritto di vedere nella sessione dell'utente. Il check-in ogni pagina di carta di prova se l'utente è autorizzato a vedere questo uno e restituire un 403 Forbidden (o una pagina di errore) se non lo sono.
Molti di più, ne sono sicuro.