2012-12-28 15 views
5

Ecco il layout:PHP e soluzione di autenticazione .htaccess

web root 
    - admin (dir) 
     - index.php 
     - js 
     - img 
     - other files/dirs 
    - dir 
    - files 

Fino ad ora, ho protetto il dir di amministrazione con .htaccess passwd perché voglio il controllo di accesso completo per tutti i file in quella dir (tra cui js script, jpg , pdf ecc.). D'altra parte, il mio CMS personalizzato fornisce l'autenticazione utilizzando sesssion/cookie PHP per altri URL. Quello che voglio ottenere è usare la stessa autenticazione PHP per la directory protetta .htaccess, evitando il prompt popup per utente/password per gli utenti già autenticati da PHP. In sintesi:

  • voglio dir amministratore per utilizzare le regole .htaccess per l'autenticazione
  • Se un utente è già autenticato utilizzando PHP (login in un form HTML, su un file non protetto), bypassare il secondo processo di autenticazione .htaccess quando si accede al contenuto di amministrazione dir
  • Se un non PHP utente autenticato prova ad accedere a contenuti nella directory di amministrazione, il popup di autenticazione HTTP deve essere attivato

maggior parte delle cose che ho leggi suggerire di spostare la directory di amministrazione all'esterno della web root e accedere a t file da uno script PHP con readfile, che non voglio fare. C'è contenuto dinamico su quella directory, oltre che statico. So che apache attiverà il popup auth prima di caricare qualsiasi risorsa, quindi la domanda è come rendere apache consapevole che l'utente è già autenticato. Qualche altro suggerimento/soluzione alternativa?

+1

Effettua l'autenticazione HTTP con php> http://php.net/manual/en/features.http-auth.php> http://koivi.com/archives/php-http-auth/ –

+2

Dai un'occhiata qui, è possibile risolverlo solo con PHP: http://php.net/manual/en/features.http-auth.php e senza un file .htaccess. Per la Cookie Stuff date un'occhiata qui: http://www.askapache.com/htaccess/htaccess-fresh.html#Get_Cookie_Value. Dopo che l'utente ha effettuato l'accesso, viene impostato un cookie. È necessario che il file htaccess controlli questo cookie. Questo non funziona molto bene con le sessioni di php, dal momento che il cookie di sessione contiene solo un hash di sessione. –

risposta

7

È possibile utilizzare la variabile SetEnvIf nel file .htaccess per verificare se è impostato un determinato valore di cookie. Per esempio (questo non è molto sicuro, ma solo per l'illustrazione):

AuthType Basic 
AuthName "Protected Login" 
AuthUserFile "/path/to/.htpasswd" 
AuthGroupFile "/dev/null" 
SetEnvIf Cookie PHPSESSID=.* PASS=1 
Order deny,allow 
Deny from all 
Allow from env=PASS 
Require valid-user 
Satisfy any 

La linea SetEnvIf Cookie PHPSESSID=.* PASS=1 controlla se un cookie è impostato con una sessione PHP id e se sì, che è sufficiente per Satisfy il processo di autenticazione e lo Allow from env=PASS consente di saltare il prompt di accesso se questo è vero.

Ancora una volta, questo esempio non è molto sicuro come un cookie di sessione PHP è già impostato quando session_start() è chiamato senza un tentativo di autenticazione di successo, quindi sarebbe meglio impostare un valore del cookie più criptico/random che è difficile da indovinare. Per esempio:

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1 

questo modo, se si imposta un valore di cookie di AJNC3Z921dmc4O8P2 dopo l'autenticazione di successo attraverso PHP, questo sarà sufficiente per passare il processo di autenticazione. Assicurati di impostare un tempo di scadenza del cookie adeguato per evitare che le persone possano passare il prompt di accesso per un periodo prolungato.

+1

Funziona alla grande, grazie a Oldskool! Non so per ora quanto sia sicura l'intera cosa dei cookie, ma controllerò comunque in ogni script PHP le autorizzazioni appropriate per accedere ai contenuti dinamici su quella directory. Raccomando di usare una chiusura $ sulla espressione regolare, come questa: 'SetEnvIf Cookie AUTHCOOKIE = randomstring $ PASS 1', altrimenti' randomstring1' corrisponderà. – Stingus

Problemi correlati