La campana.

Ci sono quelli che hanno letto questa notizia prima di te.
Iscriviti per ricevere articoli freschi.
E-mail
Nome
Cognome
Come vuoi leggere la campana
Senza spam.

Tecnologia di sessione B. PHP. siamo modo semplice Archiviazione di informazioni per l'utente di un singolo utente. Ad esempio: beni aggiunti al cestello della spesa, le impostazioni di notifica, ecc. Quando il sito viene richiesto per la prima volta al server, il browser viene salvato nei cookie unici identificatore di sessione Utente. Quindi l'identificatore o il grappolo dell'identificatore con l'indirizzo IP identifica l'utente. Questo può essere utilizzato per salvare lo stato tra le richieste delle pagine. Gli identificatori di sessioni vengono solitamente inviati al browser attraverso il cookie di sessione e vengono utilizzati per ottenere i dati della sessione disponibili.

Le sessioni sono usate tecnologia semplice: PHP riceverà i dati della sessione esistente utilizzando l'identificatore trasmesso (di solito dalla sessione biscotto), O, se nulla è stato superato nulla, verrà creata una nuova sessione. PHP riempirà la variabile SuperGlobal $ _Session per le informazioni sulla sessione dopo che la sessione è in esecuzione. Quando PHP completa, serializza automaticamente il contenuto della variabile $ _Session SuperGlobal e invia per salvare utilizzando il gestore di sessione per registrare la sessione.

Per impostazione predefinita, PHP utilizza il gestore interno file. Per salvare le sessioni, che è installato nella sessione.Save_Handler INI Variabile. Questo gestore salva i dati sul server nella directory specificata nella Direttiva Session.Save_Path.

L'esempio più semplice di utilizzare la sessione, ad esempio, l'uscita del numero di contatti alla pagina per ciascun utente:

Come possono le sessioni sono possibili

Sul sito Web PHP nella sessione Descrizione Sezioni C'è una nota (http://php.net/manual/ru/session.examples.basic.php):

Sessioni utilizzando file (predefinito in PHP.), Blocca immediatamente il file di sessione quando la sessione sta aprendo la funzione Session_Start () o indirettamente quando si specifica la sessione .AUTO_START. Dopo il blocco, nessun altro script può accedere allo stesso file di sessione finché non viene chiuso o quando lo script è completato o quando viene chiamata la funzione Session_Write_CLose ().

Molto probabilmente sarà un problema per i siti che usano attivamente Ajax. E fare diverse richieste simultanee. Il modo più semplice per risolvere questo problema sarà la chiamata della funzione Session_Write_CLose () immediatamente non appena vengono effettuate tutte le modifiche richieste nella sessione, preferibilmente più vicina all'inizio dello script. È inoltre possibile utilizzare un altro meccanismo di sessione che supporta l'accesso competitivo.

Recentemente, il problema che blocca le sessioni sta diventando più frequente. Questo è in parte dovuto alla complicazione dei siti e dalla necessità di produrre più calcoli sul server più forte, nonché con una grande distribuzione Ajax.. Sfortunatamente, la logica dell'applicazione non è sempre, specialmente se è complicata, consente di limitare efficacemente il tempo di bloccare i processi concorrenti. La situazione è aggravata dal fatto che 3-5 tali clienti sono in grado di segnare rapidamente appeso e inattivo in anticipo di processi di vertica PHP, risultando nel sito inizierà a emettere Errore 5xx. .

L'esempio più semplice delle sessioni di blocco:

// solo per uno script ?>

Se apri prima questo file nella prima scheda, quindi nel secondo - la seconda scheda attenderà finché il primo si trasforma nel primo. Questo è, infatti, la seconda scheda attenderà fino al primo il primo non rilascia il file di sessione (che occupa in un caso particolare di 30 secondi). Questo problema Ben descritto nel blog dell'azienda 1c-bitrix. su habrahabr.

Quali opzioni per risolvere questo problema esistono

È possibile utilizzare il database per la memorizzazione di sessioni Mysql. o Postgresql. (che non è giusto, data le possibilità della maggior parte dei database e la possibile velocità di lavoro in questo compito), Memcached. (non garantisce lo stoccaggio della sessione, è possibile rimuoverlo) e Redis.noi consideriamo stoccaggio ottimale. A velocità, non è inferiore a Memcached, ma può garantire la sicurezza dei dati.

E il vantaggio più importante Redis. - Se conservato in esso, le sessioni non sono bloccate.

All'interno del nostro Pannello di controllo (), è possibile abilitare le sessioni di archiviazione in Redis per tutti i siti sul conto. Per fare questo, vai alla sezione " Siti", quindi celebrare un segno di spunta -" Sessioni del negozio di tutti i siti in Redis".

Materiali aggiuntivi

Sezioni

Ssh.

FTP.

Applicazioni web

  • Informazioni generali di installazione dell'applicazione (Ambiente virtuale Docker)

Diagnosi dei problemi

Domini

  • Cancellazione del nome del dominio in zona.ru / .rf per il quale Berget è un cancelliere
  • Trasferimento del nome di dominio Amministrazione Diritti.RU / .RF / .SU e Zone internazionali (Domain Domain Domain)

Saluti, comunità rispettata.

Prima di tutto, voglio ringraziare per una risorsa molto utile. Più di una volta trovato molte idee interessanti e consigli pratici qui.

Lo scopo di questo articolo è di evidenziare le pietre sott'acqua dell'uso delle sessioni in PHP. Naturalmente, c'è una documentazione su PHP e un sacco di esempi, e questo articolo non fa finta di farlo guida completa. È progettata per rivelare alcune sfumature di lavoro con sessioni e proteggere gli sviluppatori da tempo di trascorrere inutili.

L'esempio più comune di utilizzo delle sessioni è, ovviamente, l'autorizzazione dell'utente. Iniziamo con l'implementazione più elementare per svilupparlo in modo coerente come appaiono nuovi compiti.

(Per risparmiare spazio e il tempo, limiteremo noi stessi negli esempi solo dalle funzioni di lavoro con sessioni, invece di costruire un'applicazione di prova a pieno titolo con una bella gerarchia di classi, elaborazione di errori completi e altre cose corrette) .

STARTSESSION FUNCTION () (// Se la sessione è già in esecuzione, interrompere l'esecuzione e restituire True // (Sexy.Auto_Start Parameter nel file delle impostazioni Php.ini deve essere disattivato - il valore predefinito) se (session_id ()) ritorno True; else return sessi a sessione_start (); // Nota: alla versione 5.3.0, la funzione Session_Start () ha restituito true anche in caso di errore. // Se si utilizza una versione sotto 5.3.0, eseguire un controllo Session_id aggiuntivo ( ) // Dopo aver chiamato Session_Start ()) Funzione DestroySession () (se session_id ()) (// Se è presente una sessione attiva, rimuovere la sessione di cookie, Sexcookie (Session_name (), session_id (), tempo () - 60 * 60 * 24); // e Destroy Session Session Session (); session_destroy ();))

Nota: Resta inteso che la conoscenza di base delle sessioni PHP al Reader ha, pertanto il principio di funzionamento delle funzioni Session_Start () e Session_Destroy () non coprirà qui. I compiti della forma di layout e il modulo di autenticazione dell'utente non si riferiscono all'argomento dell'articolo, quindi li ometteremo anche. Lasciatemi ricordarti solo che per identificare l'utente in ogni richiesta successiva, dobbiamo essere salvati al momento dell'ingresso di successo nella variabile di sessione (con il nome utente, ad esempio) l'ID utente, che sarà disponibile in tutto il successivo richieste all'interno della vita della sessione. È inoltre necessario implementare il trattamento del risultato della nostra funzione di avviamento (). Se la funzione ha restituito false - per visualizzare la forma di ingresso nel browser. Se la funzione è restituita true e la variabile di sessione contenente un identificativo utente autorizzato (nel nostro caso - userid), esiste - per visualizzare una pagina di un utente autorizzato (per ulteriori informazioni sull'elaborazione degli errori, vedere Appendice dal 2013-06-07 in la sezione sulle variabili di sessione).

Mentre tutto è chiaro. Le domande iniziano quando è necessario implementare l'assenza di attività utente (timeout della sessione), abilitare il lavoro simultaneo in un browser di diversi utenti, oltre a proteggere le sessioni da uso non autorizzato. Questo sarà discusso di seguito.

Controllo della mancanza di attività dell'utente con PHP incorporato

La prima domanda, che spesso deriva dagli sviluppatori di ogni sorta di console per gli utenti - il completamento automatico della sessione in assenza di attività dall'utente. Non c'è nulla di più facile che farlo usando le funzionalità PHP integrate. (Questa opzione non differisce in particolare affidabilità e flessibilità, ma consideralo per completezza dell'immagine).

Funzione startsession () (// Timeout Mancanza di attività utente (in secondi) $ sessionlifetime \u003d 300; se (session_id ()) return true; // imposta la durata del cookie ini_set ("session.cookie_lifetime", $ sessionlifetime); // Se il timeout non ha il set di attività dell'utente, impostare la durata della sessione sul server // Nota: per il server del prodotto, si consiglia di impedire a questi parametri nel Php.ini se ("sessionlifetime) INI_SET (" session.gc_maxlifetime ", $ sessionlifetime); if (session_start ()) (setCookie (session_name (), session_id (), tempo () + $ sessionlifetime); return true;) else return false;)

Alcune spiegazioni. Come sapete, PHP determina quale sessione è necessario eseguire, con il nome del cuoco, trasmesso dal browser nell'intestazione della richiesta. Il browser, a sua volta, riceve questo cookie dal server in cui la funzione Session_Start () funzioni. Se la durata dei cookie nel browser è scaduta, non verrà trasferita nella query, il che significa che PHP non sarà in grado di determinare quale sessione deve essere avviata ed è coerente come la creazione di una nuova sessione. Il parametro Php Session.GC_MaxlifeTime Impostazioni, che è impostato sul nostro timeout della mancanza di attività dell'utente, imposta la durata della sessione PHP ed è controllata dal server. Funziona il controllo della durata della sessione come segue (esiste un esempio di un archivio di sessione in file temporanei come opzione più comune e predefinita nel PHP).

Al momento della creazione di una nuova sessione nella directory installata come directory per la memorizzazione delle sessioni nel parametro Impostazioni PHP Session.Save_Path, il file denominato Sess_ viene creato. dove - Identificatore di sessione. Inoltre, in ciascuna richiesta, al momento del lancio della sessione già esistente, PHP aggiorna il tempo di modifica di questo file. Pertanto, in ogni prossima query PHP, per differenza tra l'ora corrente e l'ora dell'ultima modifica del file di sessione, è possibile determinare se la sessione è attiva, o la sua durata è già scaduta. (Il meccanismo di rimozione dei vecchi file di sessione è considerato più dettagliato nella sezione successiva).

Nota: Qui va notato che il parametro Session.GC_MaxlifeTime è valido per tutte le sessioni all'interno di un server (più precisamente, all'interno di un processo PHP principale). In pratica, ciò significa che se ci sono diversi siti sul server, e ognuno ha il proprio timeout della mancanza di attività dell'utente, quindi installare questo parametro su uno dei siti verrà installato e per altri siti. Lo stesso vale per l'hosting condiviso. Per evitare una situazione del genere, vengono utilizzate directory sessioni separate per ciascun sito all'interno di un singolo server. L'impostazione del percorso verso il catalogo della sessione viene effettuato utilizzando il parametro Session.Save_Path nel file di impostazioni Php.ini o chiamando la funzione INI_SET (). Dopo che questa sessione di ciascun sito verrà archiviata in directory separate e il parametro Session.GC_MaxlifeTime installato su uno dei siti sarà valido solo nella sua sessione. Non riteneremo in dettaglio questo caso, soprattutto perché abbiamo una versione più flessibile dell'assenza dell'attività dell'utente.

Controllo della mancanza di attività dell'utente utilizzando le variabili di sessione

Sembrerebbe, l'opzione precedente con tutta la sua semplicità (solo un paio di linee aggiuntive di codice) dà tutto ciò di cui abbiamo bisogno. Ma cosa succede se non ogni richiesta può essere considerata come risultato dell'attività dell'utente? Ad esempio, un timer è impostato sulla pagina, che esegue periodicamente la richiesta AJAX per ricevere aggiornamenti dal server. Tale richiesta non può essere considerata un'attività utente, il che significa che l'estensione automatica della durata della sessione non è corretta in questo caso. Ma sappiamo che PHP aggiorna automaticamente il tempo di modifica del file di sessione ogni volta che viene chiamata la funzione Session_Start (), il che significa che qualsiasi richiesta porterà all'estensione del tempo di vita della sessione e la mancanza di attività dell'utente non verrà mai. Inoltre, l'ultima nota della sezione precedente sulle complesse del parametro Session.GC_MaxlifeTime può apparire a qualcuno troppo confuso e complesso nell'attuazione.

Per risolvere questo problema, ci rifiutiamo di utilizzare i meccanismi PHP integrati e introdurmo diverse nuove variabili di sessione che ci consentiranno di controllare la mancanza di attività dell'utente da soli.

Funzione startSession ($ ISessionLifetime \u003d true) ($ sessionlifetime \u003d 300; se (session_id ()) restituisce true; // installare la durata della cucinazione prima di chiudere il browser (controllerai tutto sul lato server) INI_SET ("Session.Cookie_Lifetime", 0); se (! Sessi sessi_start ()) restituisce false; $ t \u003d time (); se ($ sessionlifetime) (// se è specificata la mancanza di attività dell'utente, // controlla il tempo che è passato dall'ultima attività dell'utente // (l'ultimo tempo di query quando la variabile della sessione di lastActivity è stata aggiornata) se (ISSET ($ _ Sessione ["LastActivity"]) && $ T - $ _ Sessione ["LastActivity"]\u003e \u003d $ SessionLifetime) (// Se il tempo passato dall'ultima attività dell'utente, / / \u200b\u200bpiù timeout mancanza di attività, il che significa che la sessione è scaduta, e devi completare il distrugamento (); restituire false;) altrimenti (// se il timeout non è ancora arrivato, / / e se la query è arrivata come risultato dell'attività dell'utente, // Aggiorna l'attuale corrente di lastActivity Variable BP Emeni, // che si estende il tempo della sessione è ancora in secondi sessionlifetime se ($ isuserettività) $ _Session ["LastActivity"] \u003d $ T; )) Restituire true; )

Ricapitolare. In ogni richiesta, controlliamo se il timeout sarà raggiunto dal momento dell'ultima attività dell'utente prima del momento corrente, e se si ottiene - distruggiamo la sessione e interrompiamo la funzione, restituendo false. Se il timeout non viene raggiunto e il parametro $ ISUERATTIVITY con il valore del true - aggiorna il tempo dell'ultima attività dell'utente. Tutto ciò che dobbiamo fare è determinare nello script di chiamata se la richiesta è il risultato dell'attività dell'utente e, in caso contrario, chiamare la funzione di avvio con il valore del parametro $ ISUERATIVITY uguale a false.

Aggiornamento dal 2013-06-07.
Elaborazione del risultato della funzione SessionStart ()

I commenti non hanno prestato attenzione al fatto che il rimborso di False non comprende pienamente la causa dell'errore, ed è assolutamente giusto. Non ho pubblicato qui un trattamento dettagliato di errori (lo scopo dell'articolo e non è piccolo), poiché ciò non si applica direttamente all'argomento dell'articolo. Ma considerando commenti, chiamerò.

Come puoi vedere, la funzione SessionStart può restituire false in due casi. O la sessione non può essere avviata a causa di alcuni errori interni Server (ad esempio, le impostazioni di sessione errate in php.ini) o la durata della sessione è scaduta. Nel primo caso, dobbiamo trasferire l'utente sulla pagina con un errore che ci sono problemi sul server e il modulo di gestione del supporto. Nel secondo caso, dobbiamo tradurre l'utente sul modulo di input e portare il messaggio appropriato a esso che il tempo di sessione è scaduto. Per fare ciò, dobbiamo inserire i codici di errore e restituire il codice corrispondente invece di false, e nel metodo di chiamata, controllarlo e agire di conseguenza.

Ora, anche se esiste ancora la sessione sul server, verrà distrutta al primo appello ad esso se il timeout della mancanza di attività dell'utente è scaduto. E questo accadrà indipendentemente da che ora le sessioni sono installate nelle impostazioni Global PHP.

Nota: Cosa succede se il browser è stato chiuso e i cookie con il nome della sessione è stato distrutto automaticamente? La richiesta al server, la volta successiva che si apre il browser, non conterrà la sessione dei cookie e il server non sarà in grado di aprire la sessione e controllare la mancanza di attività dell'utente. Per noi, è equivalente a creare una nuova sessione e non influisce sulla funzionalità e sulla sicurezza. Ma c'è una domanda equa - e chi distruggerà la vecchia sessione, se lo abbiamo ancora distrutto dopo la scadenza di Taimaut? O ora si bloccherà nel catalogo delle sessioni per sempre? Per pulire le vecchie sessioni in PHP, c'è un meccanismo chiamato Garbage Collection. Inizia al momento della richiesta successiva al server e pulisce tutte le vecchie sessioni sulla base della data ultima modifica File di sessione. Ma l'inizio del meccanismo della raccolta dei rifiuti non si verifica su ciascuna richiesta al server. La frequenza (o meglio, la probabilità) di avvio è determinata da due parametri delle impostazioni Session.GC_Probability e Session.GC_DIVISOR. Il risultato della divisione del primo parametro al secondo ed è la probabilità di avviare il meccanismo di raccolta dei rifiuti. Pertanto, in modo che il meccanismo di pulizia delle sessioni sia lanciato con ciascuna richiesta di Severor, questi parametri devono essere impostati su valori uguali, ad esempio "1". Questo approccio garantisce la purezza della directory della sessione, ma ovviamente è troppo sovrapposto per il server. Pertanto, nei sistemi di prodotti predefiniti, il valore session.gc_divisor è impostato, uguale a 1000, il che significa che il meccanismo di raccolta dei rifiuti verrà lanciato con una probabilità di 1/1000. Se si sperimenta queste impostazioni nel file php.ini, è possibile notare che nel caso descritto sopra, quando il browser chiude e cancella tutti i cookie, nel catalogo delle sessioni, per qualche tempo sono ancora ancora le vecchie sessioni. Ma non dovrebbe preoccuparsi, perché Come già accennato, non influisce in alcun modo la sicurezza del nostro meccanismo.

Aggiornamento dal 2013-06-07.

Impedire che lo script si blocca a causa del blocco del file di sessione

Nei commenti ha sollevato la questione dell'appellazione degli script in esecuzione simultaneamente a causa del blocco del file di sessione (come l'opzione più luminosa - lungo sondaggio).

Per iniziare, noto che questo problema non dipende direttamente dal carico del server o dal numero di utenti. Naturalmente, più richieste, le più lenti vengono eseguite gli script. Ma questa è una dipendenza da cosquidi. Il problema viene visualizzato solo all'interno della stessa sessione quando il server arriva diverse richieste per conto di un utente (ad esempio, uno di essi è un sondaggio lungo, e il resto sono richieste normali). Ogni richiesta è cercare di accedere allo stesso file di sessione e se la query precedente non ha sbloccato il file, allora il successivo si rivolge ad aspettare.

Per chiudere i file di sessione da minimizzare, si consiglia vivamente di chiudere la sessione chiamando la funzione Session_Write_CLose () immediatamente dopo che tutte le azioni con variabili sessive vengono eseguite. In pratica, ciò significa che non dovrebbe essere memorizzato nelle variabili di sessione in una riga e contattarli durante l'esecuzione dello script. E se è necessario memorizzare alcuni dati di lavoro nelle variabili di sessione, le leggono immediatamente contemporaneamente quando si avvia la sessione, salva in variabili locali per l'uso successivo e chiudere la sessione (significa chiudere la sessione utilizzando la funzione Session_Write_Close e non la distruzione usando session_destroy).

Nel nostro esempio, ciò significa che immediatamente dopo aver aperto la sessione, controllando il tempo della sua vita e dell'esistenza di un utente autorizzato, dobbiamo considerare e salvare tutti gli altri app Variabili di sessione (se ci sono tali), dopodiché è possibile chiudere la sessione chiamando session_write_close () e continuare l'esecuzione dello script, se si tratta di un sondaggio lungo o di una query regolare.

Protezione delle sessioni da uso non autorizzato

Immagina la situazione. Uno dei tuoi utenti clins Troyan, che rapisce il bouquet del browser (in cui la nostra sessione è memorizzata) e lo invia all'e-mail specificata. L'attaccante ottiene i cookie e lo usa per una query falsa per conto del nostro utente autorizzato. Il server accetta con successo e elabora questa richiesta, come se fosse proveniente da un utente autorizzato. Se non implementato verifica aggiuntiva Gli indirizzi IP, un tale attacco porterà ad un account utente di hacking di successo con tutte le conseguenze successive.

Perché è stato possibile? Ovviamente, poiché il nome e l'identificatore della sessione sono sempre gli stessi allo stesso tempo della sessione, e se si ottiene questi dati, è possibile inviare facilmente richieste per conto di un altro utente (naturalmente, entro la durata della vita di questa sessione). Forse questo non è il tipo più comune di attacchi, ma teoricamente, tutto sembra davvero realizzabile, soprattutto considerando che i diritti dell'amministratore non hanno nemmeno bisogno di un tale trojan per rapinare i cookie del browser dell'utente.

Come posso proteggere dagli attacchi di questo tipo? Ancora una volta, ovviamente, limitando la durata dell'identificatore della sessione e modificando periodicamente l'identificativo entro una sessione. Possiamo anche modificare il nome della sessione, rimuovendo completamente il vecchio e creando una nuova sessione copiando tutte le variabili di sessione da quella vecchia. Ma non influisce sull'essenza dell'approccio, quindi, per semplicità, è limitato all'identificatore della sessione.

È chiaro che più piccola è la durata dell'identificatore della sessione, meno tempo sarà all'attaccante per ottenere e applicare i cookie per la richiesta dell'utente falsa. Nel caso perfetto, è necessario utilizzare un nuovo identificatore per ogni richiesta, che ti consentirà di minimizzare la possibilità di utilizzare la sessione di qualcun altro. Ma consideriamo il caso generale quando il tempo di rigenerazione dell'identificatore della sessione è impostato arbitrariamente.

(Abbassare la parte del codice che è già stato considerato).

Funzione startSession ($ isuserettività \u003d true) (// tempo di vita dell'identificatore della sessione $ idlifetime \u003d 60; ... se ($ idlifetime) (// Se la durata dell'identificatore della sessione è impostato, // controlla l'ora che è passato dalla sessione o dall'ultima rigenerazione della sessione // (l'ultimo tempo di query quando è stata aggiornata l'ora legata della sessione della variabile) se (ISSET ($ _ sessione ["Avvio"])) (se $ T - $ _ sessione [ "Avvio"]\u003e \u003d $ idlifetime) (// Identificatore di sessione di stile di vita temporale // Genera un nuovo identificatore session_regenerate_id (TRUE); $ _Session ["Avvio"] \u003d $ T;)) Else (// Qui otteniamo se la sessione è appena stato creato // imposta il tempo di generazione dell'identificatore della sessione al momento corrente $ _Session ["Avvio"] \u003d $ t;)) return true;)

Quindi, quando si crea una nuova sessione (che si verifica al momento del login dell'utente di successo), impostiamo la variabile della sessione iniziale memorizzata per noi l'ultima generazione dell'identificatore della sessione, al valore uguale al tempo del server. Successivamente, in ogni richiesta, controlliamo se abbastanza tempo (IDLIFETTIME) non è passato dall'ultima generazione dell'identificatore, e se è passato - la generiamo uno nuovo. Pertanto, se un attaccante che ha ricevuto i cookie di un utente autorizzato che ha ricevuto l'identificatore dell'identificatore dell'identificatore non ha il tempo di usarlo, la richiesta falsa sarà considerata dal server come non autorizzata e l'utente malintenzionato cadrà sul Pagina d'ingresso.

Nota: Il nuovo identificatore di sessione entra nei cookie del browser quando si chiama la funzione Session_REGENERATE_ID () (), che invia nuovi cookie, simile alla funzione Session_Start (), quindi non abbiamo bisogno di aggiornare i cookie da soli.

Se vogliamo garantire il più possibile le nostre sessioni, è sufficiente stabilire la durata della vita dell'identificatore o generalmente per sopportare la funzione Session_regenerate_id () per parentesi e rimuovere tutti i controlli, che porterà alla rigenerazione dell'identificatore in ciascuna richiesta. (Non ho controllato l'impatto di un tale approccio di velocità e posso solo dire che la funzione session_regenerate_id (true) esegue essenzialmente 4 passaggi: generazione di un nuovo identificatore, creando un'intestazione con sessione di cucinare, eliminare il vecchio e creando una nuova sessione file).

Digressione lirica: Se i Troyans risultano così intelligenti dal fatto che non invierà i cookie a un attaccante, e organizza l'invio di una richiesta falsa predeterminata immediatamente al ricevimento del cuoco, il metodo sopra descritto, molto probabilmente, non sarà in grado di proteggere da tali Un attacco, perché tra il tempo di ricevere i cookie di Troia e inviare falsi la query quasi non sarà differenza, e la probabilità è grande che a questo punto non riceverà la rigenerazione dell'identificatore della sessione.

La possibilità di lavorare contemporaneamente in un browser per conto di diversi utenti

L'ultimo compito che vorrei considerare è la possibilità di lavori simultanei in un browser di diversi utenti. Questa funzione è particolarmente utile nella fase di test quando è necessario emulare il funzionamento simultaneo degli utenti, ed è consigliabile farlo nel tuo browser preferito e non utilizzare l'intero arsenale disponibile o aprire diverse istanze del browser nel "Incognito " modalità.

Nei nostri esempi precedenti, non abbiamo definito il nome della sessione, quindi viene utilizzato il nome predefinito impostato in PHP. Ciò significa che tutte le sessioni che sono state create da noi finora hanno inviato il browser Cook sotto il nome di Phpslessid. Ovviamente, se il nome di cottura è sempre lo stesso, quindi non c'è possibilità all'interno di un browser per organizzare due sessioni con lo stesso nome. Ma se abbiamo usato il nostro nome di sessione per ogni utente, il problema sarebbe stato risolto. E fallo.

Startsessività della funzione ($ isuserettività \u003d true, $ prefisso \u003d null) (... se (session_id ()) restituisce true; // Se i parametri passano il prefisso dell'utente, // imposta il nome di sessione univoco, incluso questo prefisso, // altrimenti installare Generale per tutti i nome utente (ad esempio, Myproject) Session_Name ("MyProject". ($ Prefisso? "_." $ Prefisso: "")); INI_SET ("Session.Cookie_Lifetime", 0); IF (! Session_Start ()) Restituire false; ...)

Ora rimane per prendersi cura di trasmettere lo script di chiamata alla funzione STARTSESSION () è un prefisso unico per ciascun utente. Questo può essere fatto, ad esempio, attraverso il transfix ai parametri Ottieni / POST di ciascuna richiesta o tramite cookie aggiuntivi.

Conclusione

In conclusione, darò il codice completo delle nostre funzioni con cui lavorare sessioni php.che include tutte le attività discusse sopra.

Funzione startSession ($ isuserettività \u003d true, $ prefisso \u003d null) ($ sessionlifetime \u003d 300; $ idlifetime \u003d 60; se (session_id ()) return true; session_name ("MyProject". ($ Prefisso? "_". $ Prefisso: "" ")); ini_set (" session.cookie_lifetime ", 0); se (! session_start ()) return false; $ t \u003d time (); se ($ sessionlifetime) (IF (ISSET ($ _ Sessione [" LastAttività "]) && $ t - $ _ sessione [" lastattività "]\u003e \u003d $ sessionlifetime) (distruggsia (); restituire false;) altrimenti (se ($ isuserettività) $ _Session [" LastActity "] \u003d $ T;)) Se ($ idlifetime) (se (ISSET ($ _ Sessione ["Avvio"]))) (se ($ T - $ _ sessione ["Avvio"]\u003e \u003d $ idlifetime) (session_regenerate_id (true); $ _Session ["Avvio" ] \u003d $ t;)) altrimenti ($ _Session ["Avvio"] \u003d $ t;)) return true;) distruggationssion () (if_unset (); setCookie (session_name (), session_id (), tempo () -60 * 60 * 24); session_destroy ();))

Spero che questo articolo farà risparmiare tempo a coloro che non hanno mai davvero approfondito nel meccanismo di sessione, e darà una comprensione sufficiente di questo meccanismo a coloro che stanno appena iniziando a conoscere con PHP.

.
In questo articolo aggiungeremo alla nostra registrazione dai un'occhiatae.- mailindirizzi, login automatico e restauro ha dimenticato la password . Prima di procedere con la lezione, assicurarsi di avere una funzione sul server posta ().

Inizia aggiungendo campi alla tabella « utenti.» . Abbiamo bisogno di un campo per la memorizzazione di un indirizzo e-mail, un campo per lo stato dell'utente (0 - non attivato, 1 - attivato) e il campo con la data di registrazione.





Quindi devi essere corretto salva_user.php.Aggiungendo la verifica della correttezza dell'indirizzo e-mail e inviando una lettera per confermare la registrazione. La lettera contiene un collegamento con due variabili trasmesse oTTENERE.: Accedi e generati, unici per ogni utente, codice. Il codice di cui abbiamo bisogno che l'utente non può attivare il suo account senza una lettera, e questo ci darà fiducia che l'indirizzo post introdotto sia davvero appartenente a lui. Aggiungi il seguente codice dopo l'esecuzione dei dati dalle variabili globali:

IF (ISSET ($ _ POST ["Email"]))) ($ Email \u003d $ _Post ["Email"]; IF ($ Email \u003d\u003d "") (UNSSET ($ e-mail);))
Se (vuoto ($ login) o vuoto ($ password) o vuoto ($ codice) o vuoto ($ e-mail))
// Aggiungi una variabile cone.- mailindirizzo
// Se l'utente non ha inserito un login o una password, quindi forniamo un errore e interrompiamo lo script
{
Esci ("Hai inserito non tutte le informazioni, torna indietro e compila tutti i campi!"); // Avvia l'esecuzione di scenari
}
Se (! preg_match ("/ [Email protetta]+ \\. (2.3) / I ", $ e-mail)) // Controlla gli indirizzi e-mail espressioni regolari Correttezza
(Esci ("E-mail non è corretta!");)

La richiesta di aggiunta di un nuovo utente deve essere affrontata e la data di registrazione. Se i dati vengono inseriti correttamente nel database e l'utente è registrato, è necessario inviare un messaggio all'indirizzo:

// Se no, salviamo i dati
$ Result2 \u003d mysql_query ("Inserisci negli utenti (accesso, password, avatar, e-mail, data) (" $ login "," $ password "," $ avatar "," $ Email ", ora ())") ;
// controlla se ci sono errori
Se ($ Result2 \u003d\u003d "TRUE")
{
$ Result3 \u003d mysql_query ("Seleziona ID dagli utenti in cui Login \u003d" $ Login "", $ DB); // Rimuovere l'ID utente. Grazie a lui lo faremo codice unico Attivazione, perché due identificatori identici non possono essere.
$ Myrow3 \u003d mysql_fetch_array ($ risultato3);
$ Attivazione \u003d MD5 ($ MyRow3 ["ID"]). MD5 ($ login); // il codiceattivazioneaccount. Immettere l'identificativo e il login della funzione MD5. È improbabile che una combinazione dell'utente sia in grado di farcela manualmente manualmente attraverso la barra degli indirizzi.
$ soggetto \u003d "Conferma della registrazione"; //Soggetto del messaggio
$ MESSAGE \u003d "Ciao! Grazie per la registrazione su citename.ru \\ nvas Login:". $ Login. "\\ N
Segui il link per attivare il tuo account: \\ Nhttp: //localhost/test3/activation.php? Login \u003d ". $ Login." & Code \u003d ". $ Attivazione." \\ NC rispetto, \\ N
Citename.ru amministrazione "; // Contenuto pubblicato
Mail ($ e-mail, $ soggetto, $ messaggio, "Tipo di contenuto: testo / piano; charset \u003d windows-1251 \\ r \\ n"); // Mandare un messaggio

Echo "Sei inviato alla lettera di posta elettronica con una solarizzazione, per confermare la registrazione. Attenzione! Il collegamento è valido per 1 ora. Pagina principale"; // stiamo parlando della lettera inviata dall'utente
}

Messaggio inviato! Ora l'utente lo aprirà e vai al link indicato alla pagina che controllerà il codice di attivazione. Assicurarsi che il codice sia fedele, confermiamo la registrazione, modificando il valore del campo nel database attivazione. Con "0" a "1".

Creare un file. attivazione.php.

Includere ("bd.php"); // Filebd.. pHP. deve essere nella stessa cartella di tutti gli altri, se non lo è, basta cambiare la strada
$ Risultato4 \u003d mysql_query ("Seleziona Avatar dagli utenti in cui Attivazione \u003d" 0 "e UNIX_TIMESTAPP () - UNIX_TIMESTAPP (data)\u003e 3600); // Rimuovere gli avatar di tali utenti che non hanno attivato il loro account entro un'ora. Pertanto, devono essere rimossi dalla base, così come i file dei loro avatar
Se (mysql_num_rows ($ Result4)\u003e 0) (
$ Myrow4 \u003d mysql_fetch_array ($ Risultato4);
fare.
{
// Rimuovere gli avatar nel ciclo se non sono standard
Se ($ MyRow4 ["Avatar"] \u003d\u003d "avatar / net-avatara.jpg") ($ a \u003d "Non fare nulla";)
ALTRO (
Scollese ($ myrow4 ["avatar"]); // Elimina il file
}
}
While ($ myrow4 \u003d mysql_fetch_array ($ Result4));
}
Mysql_query ("Elimina dagli utenti dove attivazione \u003d" 0 "e unix_timestamp () - UNIX_TIMESTAPP (data)\u003e 3600); // Elimina utenti dalla base
se (ISSET ($ _ Ottenere ["Codice"])) ($ codice \u003d $ _ ottenere ["codice"];) //codice di conferma
ALTRO.
(Esci ("Sei andato alla pagina senza codice di conferma!");) // se non specificatocodice., quindi rilasciare un errore
IF (ESSET ($ _ Ottieni ["Login"])) ($ Login \u003d $ _ Ottieni ["Login"];) // Accedi per attivare
ALTRO.
(Esci ("Sei andato alla pagina senza login!");) // Se non si specifica il login, quindi forniamo un errore
$ Risultato \u003d mysql_query ("Seleziona ID dagli utenti in cui Login \u003d" $ Login "", $ dB); // Rimuovere l'ID utente con questo login
$ Attivazione \u003d MD5 ($ mirow [ID "]). MD5 ($ login); // Creare lo stesso codice di conferma
Se ($ attivazione \u003d\u003d $ codice) ( // Confronta il risultante dauRL e codice generato
Mysql_query ("Aggiorna utenti imposta attivation \u003d" 1 "dove login \u003d" $ login "", $ db); // Se sei uguale, quindi attivare l'utente
Echo "La tua e-mail è confermata! Ora puoi andare al sito sotto il tuo login! Home page";
}
Errore (echo "! La tua e-mail non è confermata! Home";
// se risultante dauRL e il codice generato non è uguale, quindi forniamo un errore
}
?>

L'indirizzo e-mail è confermato, ora sappiamo che questo indirizzo è di proprietà questo utenteÈ possibile inviare una password ad essa se l'utente lo dimenticherà o altre notifiche. Ma qual è la differenza tra gli utenti attivati, da non attivati? E quelli e altri possono andare al sito, quindi, dobbiamo limitare l'accesso a non attivato. Apri il file. testReg.. pHP. E aggiungi un'altra condizione nella query al database:

$ Risultato \u003d mysql_query ("Seleziona * dagli utenti in cui login \u003d" $ Login "e password \u003d" $ password "e attivo \u003d" 1 "", $ dB); // Rimuovere tutti i dati sull'utente dal login dal database.
// Abbiamo completato "E.attivazione.\u003d "1", cioè, l'utente verrà cercato solo tra attivato. È consigliabile aggiungere questa condizione ad altri assegni di dati utente simili.

Se l'utente dimenticherà la password, quindi per un caso in cui devi ritirare un collegamento a pagina principalePer il quale può ripristinarlo, così come puoi inserire immediatamente una casella di controllo per il login automatico.

Ingresso automatico






Registrati


Hai dimenticato la password?

C'è un link, ma non c'è file. Scriviamo spedire._ passaggio. pHP.. In esso chiediamo all'erogazione dell'utente e all'indirizzo e-mail. Se l'e-mail e l'accesso inseriti è nel database, lo invieremo ad esso nuova passwordSe l'utente ha dimenticato il vecchio, perché eravamo convinti quando si registrano che l'indirizzo email è valido.

se (ISSET ($ _ POST ["LOGIN"]))) ($ LOGIN \u003d $ _POST ["LOGIN"]; IF ($ LOGIN \u003d\u003d "") (UNSET ($ LOGIN);)) // entriamo nell'utente inserito dall'utente nella variabile di accesso $, se è vuota, quindi distruggiamo la variabile
IF (ISSET ($ _ POST ["Email"]))) ($ Email \u003d $ _Post ["Email"]; IF ($ Email \u003d\u003d "") (UNSSET ($ e-mail);)) // Abbiamo inserito l'utente e-mail inserito dall'utente, se è vuoto, quindi distruggiamo la variabile
IF (ESSET ($ LOGIN) e ISSET ($ e-mail)) ( // Se ci sono variabili necessarie

Includere ("bd.php");

$ Risultato \u003d mysql_query ("Seleziona ID dagli utenti in cui Login \u003d" $ Login "ed e-mail \u003d" $ e-mail "e attivo \u003d" 1 "", $ dB); // comemenzognaw.utentee.- maschio
$ myrow \u003d mysql_fetch_array ($ risultato);
se (vuoto ($ mirow ["id]) o $ mirow [id"] \u003d\u003d "") (
// Se non vi è un utente attivato con tale accesso e indirizzo e-mail
Exit ("L'utente con un tale indirizzo e-mail non è stato rilevato in qualsiasi database CIA :) La pagina principale");
}
// Se l'utente viene trovato con tale accesso e e-mail, è necessario generare una password casuale per lui, aggiornarla nel database e inviare a e-mail
$ DaTENOW \u003d data ("YMDHIS"); // rimuovi la data
$ New_password \u003d MD5 ($ dateNow); // crittografa la data
$ New_password \u003d Substr ($ New_password, 2, 6); // Rimuovere 6 caratteri dal cifrario dal secondo. Questa sarà la nostra password casuale. Quindi, lo scriviamo al database crittografando lo stesso modo del solito.

$ New_password_sh \u003d Strrev (MD5 ($ New_password)). "B3P6F"; // grizzato
Mysql_query ("Update Users Set Password \u003d" $ New_password_sh "dove login \u003d" $ login "", $ db); // aggiornato.nelbase
// Formando un messaggio

$ Messaggio \u003d "Ciao," $ Login. "! Abbiamo generato una password per te, ora puoi inserire il sito citname.ru, usandolo. Dopo l'ingresso, è desiderabile cambiarlo. Password: \\ N." $ New_password; //Messaggio di testo
Posta ($ e-mail, "recupero della password", $ messaggio, "Tipo di contenuto: testo / piano; charset \u003d windows-1251 \\ r \\ n"); // spediremessaggio

Eco " La tua e-mail ha inviato una lettera con password. Sarai spostato dopo 5 secondi. Se non vuoi aspettare, quindi clicca qui. "; // reindirizzare l'utente
}
ALTRO ( // Se i dati non sono stati ancora introdotti
Eco "


Hai dimenticato la password?


Hai dimenticato la password?



Inserisci il tuo login:



Inserisci il tuo indirizzo email:






";
}
?>

Successivamente faremo un ingresso automatico. Funzionerà in questo modo: con una buona voce con una casella di controllo pressata nel cookie, AUTO \u003d "Sì" si adatta. Se il server vede che nel browser Auto \u003d "Sì", inizierà la sessione e le variabili prenderanno lo stesso, nel cookie. Quindi c'è una prova di eseguire sessioni del database.

Aperto testReg.. pHP. E aggiungi il codice dopo una voce di successo:

IF (ESSET ($ _ POST ["Salva"])) (
// Se l'utente vuole conservare i suoi dati per un ingresso successivo, teniamo nei cookie del suo browser

SetCookie ("ID", $ MyRow ["ID"], tempo () + 9999999);)
iF (ISSET ($ _ POST ["AUTOVHOD"])) (
// Se l'utente desidera inserire automaticamente il sito
SetCookie ("Auto", "Sì", tempo () + 9999999);
SetCookie ("Login", $ _Post ["Login"], tempo () + 9999999);
setCookie ("Password", $ _Post ["Password"], tempo () + 9999999);
SetCookie ("ID", $ MyRow ["ID"], tempo () + 9999999);)

Ora è necessario avviare la sessione nel posto giusto se hai un ingresso automatico. Aperto index.php. E scrivi all'inizio della pagina:

// L'intera procedura funziona alle sessioni. È in esso che i dati dell'utente sono memorizzati mentre si trova sul sito. È molto importante lanciarli all'inizio della pagina !!!
session_start ();
Includere ("bd.php"); // BD.Php File dovrebbe essere nella stessa cartella di tutti gli altri, in caso contrario, basta cambiare semplicemente il modo
Se (ISSET ($ _ cookie ["Auto"]) e ISSET ($ _ cookie ["Login"]) e ISSET ($ _ cookie ["password"]))
{// se le variabili necessarie
se ($ _cookie ["auto"] \u003d\u003d "sì") ( // Se l'utente desidera inserire automaticamente, quindi avviare la sessione
$ _Sessione ["Password"] \u003d Strrev (MD5 ($ _ cookie ["password"])). "B3P6F"; // nei cookie, la password non è stata crittografata e in sessioni solitamente memorizzate crittografate
$ _Sessione ["Login"] \u003d $ _ cookie ["login"]; // sessionea partire dallogin
$ _Sessione ["ID"] \u003d $ _ cookie ["ID"]; //ID utente
}
}

Ora non aiuteremo nemmeno l'output per cambiare l'utente! NEL uSCITA. pHP. Le sessioni sono cancellate che sono ancora create indice.. pHP.Grazie ai cookie che sono conservati per un tempo molto lungo! Prendiamo il file uSCITA. pHP.E poi non è funzionale nel caso del login automatico. Abbiamo solo bisogno di cancellare l'ingresso automatico dei cookie dopo aver rimosso le variabili dalla sessione:

SetCookie ("Auto", "", Time () + 9999999); // Pulire l'ingresso automatico

Devi anche aggiungere a aggiornare._ utente.. pHP. Dopo aver aggiornato il login nella sessione:

$ _Sessione ["Login"] \u003d $ Login; // Aggiornamento Accedi alle sessioni
IF (ISSET ($ _ cookie ["login"])) (
SetCookie ("Login", $ Login, Time () + 9999999); // Aggiornamentoaccederenelcuochi
}

E lo stesso con una password

$ Risultato4 \u003d mysql_query ("Update Users Set Password \u003d" $ Password "dove login \u003d" $ old_login "", $ db); // aggiornamentoparola d'ordine
Se ($ RESIST4 \u003d\u003d "TRUE") ( // Se è vero, quindi aggiornarlo nella sessione
$ _Sessione ["Password"] \u003d $ Password;
IF (ISSET ($ _ cookie ["password"])) (
SetCookie ("Password", $ _ Posta ["Password"], tempo () + 9999999); // Aggiornamentoparola d'ordinenelcuochi, se unsonoc'è
}

Questo è tutto. Spero che ci riuscirai! In bocca al lupo!

Buon giorno amici! Diamo un'occhiata alla registrazione degli utenti su PHP. Per cominciare, determiniamo le condizioni per la nostra registrazione dell'utente:

  • Password crittografa con algoritmo MD5.
  • La password sarà "salina"
  • Accedi per il controllo dell'occupazione
  • Attivare la lettera dell'utente.
  • Registrazione e archiviazione dei dati in Dbms mysql.

Per scrivere questo script, dobbiamo capire quale utente è registrato. La registrazione di un utente è ottenere un vero utente, l'elaborazione e la memorizzazione dei dati.

Se spieghi con parole semplici, il check-in è solo un record e una memorizzazione di determinati dati su cui possiamo autorizzare l'utente nel nostro caso - questo è un login e una password.

Autorizzazione - Fornire una determinata persona o un gruppo di diritti di soggetti per svolgere determinate azioni, nonché il processo di verificare questi diritti durante il tentativo di adempiere a tali azioni. Allo stesso modo, utilizzando l'autorizzazione, possiamo distinguere l'accesso a uno o un altro contenuto sul nostro sito web.

Considerare la struttura dei cataloghi degli script per implementare la nostra registrazione con l'autorizzazione. Dobbiamo rompere gli script sui componenti logici. Moduli di registrazione e autorizzazione che possediamo una directory separata. Anche in directory separate, inseriremo una connessione al database Mysql., File con funzioni utente, file di stile CSS. E il nostro modello. Html.. Questa struttura ti consente di navigare rapidamente gli script. Immagina di avere un grande sito con un grappolo di moduli, ecc. E se non c'è ordine, sarà molto difficile trovare qualcosa in tale casino.

Dal momento che memorizzeremo tutti i dati in Dbms mysql., Creiamo un tavolo non grande in cui memorizzeremo i dati di registrazione.

Per prima cosa è necessario creare una tabella nel database. Nome della tabella bez_reg. Dove bEZ. - Questo è un prefisso del tavolo e remi Nome della tabella.

Struttura della tabella: bez_reg.

- - La struttura del `Bez_reg Table` - Creare la tabella se non esiste" Bez_reg` (ID` Int (11) non null auto_increment, `login` varchar (200) non nullo,` pass` varchar (32) non nullo, `Sale` varchar (32) non nullo,` active_hex`

Ora crea script di base per ulteriori lavori.

File index.php.

File config.php.

"); ?>

File 404.html.

Errore 404

Errore 404

La pagina si è verificata 404

Ritorno

File BD.PHP.

File Index.html.

Registrazione di utenti PHP MySQL con l'attivazione della scrittura

File funct.php.

"." \\ n "; if (is_array ($ dati)) (foreach ($ dati come $ VAL) $ err. \u003d"

  • . "$ VAL."
  • "." \\ n ";) Else $ Err. \u003d"
  • "$ Dati".
  • "." \\ n "; $ sbatti. \u003d""." \\ n "; ritorna $ err;) / ** wrapper semplice per query a mysql * @param string $ sql * / funzione mysqlquery ($ sql) ($ res \u003d mysql_query ($ sql); / * Controllare il risultato . Mostra una richiesta reale inviata a MySQL, così come un errore. Conveniente durante il debug. * / IF (! $ RES) ($ MESSA MESSAGE \u003d "QUERY INVALIGATA:". Mysql_error (). "\\ N"; $ messaggio. \u003d "Completamente:". $ SQL; Die ($ Messaggio);) Restituisce $ RES;) / ** Generatore di sale semplice * @param string $ sql * / funct sale () ($ sale \u003d substr (MD5 (UNIQID ()) , - 8); ritorno $ sale;)

    Iniziamo a scrivere la registrazione. Per cominciare, avremo bisogno di creare un modello di modulo di registrazione in modo che l'utente possa rendere i suoi dati per l'elaborazione. Successivamente, avremo bisogno di scrivere un gestore del modulo stesso, che controllerà la correttezza dei dati dell'utente inseriti. Dopo aver verificato con successo i dati scrivili al nostro database e invia una lettera all'utente per attivare il proprio account.

    File reg.php.

    Ti sei registrato con successo! Si prega di attivare il tuo account !!"; // Produciamo un'attivazione di un account IF (ISSET ($ _ Ottieni [tasto"]))))))) (// Controllare il tasto $ SQL \u003d "Seleziona * da` ". BEZ_DBPREFIX." Reg` . "Escap_str ($ _Get [tasto"]). "" "; $ Res \u003d mysqlquery ($ sql); if (mysql_num_rows ($ res) \u003d\u003d 0) $ er err \u003d" La chiave di attivazione non è vera! "; / / Controllare la presenza di errori e visualizziamo se l'utente (conteggio ($ ERR)\u003e 0) echo ShowerRormessage ($ ERR); else (// riceviamo l'indirizzo dell'utente $ riga \u003d mysql_fetch_assoc ($ res); $ Email \u003d $ riga ["Login"]; // Attivare l'utente $ sql \u003d "update". bez_dbprefix. "Reg` set` status` \u003d 1 dove accedi "E-mail." "$ \u003d mysqlquery ($ sql); // invia una lettera per attivare $ title \u003d "(! Lang: il tuo account su http: // sito attivato correttamente"; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [Email protetta](+ \\.) + (2.6) $ / i ", $ _Post [" Email "])) $ err \u003d" e-mail "non inserito correttamente." \\ N ";) se (vuoto ($ _ post [" Passare "])) $ err \u003d" Il campo della password non può essere vuoto "; se (vuoto ($ _ Posta [" pass2])) $ er err \u003d "il campo di conferma della password non può essere vuoto"; // controlla la presenza di errori e Visuando un utente se (conteggio ($ ERR)\u003e 0) ECHO ShowerRormessage ($ ERR); altro (/ * Continuiamo a controllare il controllo dei dati inserito per password: / IF ($ _ POST ["PASS"]! \u003d $ _Post ["PASS2"]) $ ERR \u003d "Le password non corrispondono"; // Controllare la presenza di errori e visualizzare l'utente se (conteggio ($ er err)\u003e 0) echo docciaRormessabe ($ ERR); altro Se abbiamo un tale utente nel database / $ SQL \u003d "Seleziona" Accedi a "Accedi a". BEZ_DBPREFIX. "Reg` where" login` \u003d "". fuga_str ($ _ post ["Email"]). "" "$ res \u003d mysqlquery ($ sql); if (mysql_num_rows ($ res)\u003e 0) $ err \u003d "purtroppo login: . "$ _Post [" Email "]." Occupato! "; // Controllare la presenza di errori e visualizza l'utente se (conteggio (ERR)\u003e 0) Echo ShowerRormessage ($ ERR); altro (// Get High Salt $ Salt \u003d Salt (); // Password Solim $ pass \u003d MD5 (MD5 ($ _ Posta ["Pass"]). $ sale); / * Se tutto è buono, scrivi i dati sul database * / $ sql \u003d "inserire in" Valori di BEZ_DBPREFIX. ("", "". Fuga_str ($ _ post ["Email"]). "", "". $ Pass. "", "". MD5 ($ sale) . "", 0) "; $ res \u003d mysqlquery ($ sql); // Invia una lettera per attivare $ URL \u003d bez_host." Meno / reg /? Modalità \u003d Reg & Key \u003d ". MD5 ($ sale); $ MD5 Titolo \u003d "(! Lang: registrazione su http: / / Website"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    File reg_form.html.

    Registrazione di utenti PHP MySQL con l'attivazione della scrittura

    E-mail *:
    Parola d'ordine *:
    conferma password *:

    Campi con icona. * Obbligatorio per il riempimento

    Poiché la registrazione degli utenti è pronta per noi, è ora di scrivere l'autorizzazione. Creare un modulo per l'autorizzazione dell'utente, quindi scrivi il gestore del modulo di autorizzazione e dura lo script show.php. Che ci mostrerà autorizzati nel sistema o meno.

    File auth.php.

    0) Echo ShowerRormessage ($ ERR); Altrimenti (/ * Creare una richiesta per selezionare dal database per verificare l'utente dell'utente * / $ SQL \u003d "Seleziona * da`". Bez_Dbprefix. "Reg` Where "Login` \u003d" ". Fuga_str ($ _ post [ "Email"]). "" "E`" Stato` \u003d 1 "; $ res \u003d mysqlquery ($ sql); // Se l'accesso archizzi, controlla la password se (mysql_num_rows ($ res)\u003e 0) (// dati dalla tabella $ Row \u003d mysql_fetch_assoc ($ res); IF (MD5 (MD5 ($ _ Posta ["Pass"]). $ riga ["sale"]) \u003d\u003d $ riga ["Pass"]) ($ _Session ["Utente"] \u003d TRUE; // Reimposta i parametri dell'intestazione ("Posizione:". Bez_host. "Meno / reg /? Modalità \u003d Auth"); Esci;) Altro Echo ShowerRormessage ("Password non valida!");) Altro Echo ShowerRormessage ("Login . "$ _Post [" Email "]." non trovato! ");))?\u003e

    Per coloro che hanno l'ultima versione PHP pubblicando questo script usando PDO. Perché espansione Mysql. È obsoleto ed eliminato dalla nuova versione di PHP. Scarica registrazione e autorizzazione PHP MySQL DOP

    Archivio aggiornato 24.02.2015g.

    Attenzione: Se si utilizza questo script sul server Tipo locale Denalità, XAMPP., Non dovresti aspettare le lettere sulla tua casella di posta. Le lettere si trovano nella spina inviare una mail. NEL Denalità Puoi trovarli in arrivo. Z: \\ tmp \\! Sendmail \\ Apri questi file che puoi in qualsiasi client di posta elettronica.

    Impareremo a rendere semplice autenticazione utente sul sito. Sul sito ci possono essere pagine solo per utenti autorizzati e funzionerà pienamente, se si aggiungono il nostro blocco di autenticazione a loro. Per crearlo, è necessario un database MySQL. Può avere 5 colonne (minimo) e forse di più se si desidera aggiungere informazioni sugli utenti. Chiamiamo il database "Userauth".

    Creeremo in esso i seguenti campi: ID per il conteggio del numero utente, UID per un numero identificativo utente univoco, nome utente per nome utente, e-mail per il tuo indirizzo e-mail e password per la password. È possibile utilizzare per autorizzare l'utente e il database già esistente, solo, come nel caso di un nuovo database, creare la seguente tabella.

    Codice mysql.

    Creare la tabella 'Utenti` (ID "Int (11) non null auto_increment,` uid` int (11) non nullo, `nome utente` Non ,` e-mail` Testo non , `password` `ID`)) motore \u003d Charset predefinito Myisam \u003d UTF8 AUTO_INCREMENT \u003d 1;

    Ora crea un file "sql.php". È responsabile della connessione al database. Questo codice, in primo luogo, crea variabili per il server e l'utente quando si collega al server. In secondo luogo, sceglierà un database in questo caso "Usererauth". Questo file deve essere collegato a "log.php" e "reg.php" per accedere al database.

    Codice PHP.

    // il tuo nome utente mysql $ pass \u003d "Reduce"; // password $ CONN \u003d MySQL_Connect ($ server, $ utente, $ pass); // Connessione al server $ db \u003d mysql_select_db ("userauth", $ CONN); // Seleziona il database Se (! $ DB) ( // Se non è possibile selezionare un database Echo "Scusa, errore: (/\u003e"; // mostra un messaggio di errore Uscita (); // ti permette di lavorare il resto degli script PHP } ?>

    Prossima pagina di entrata, lascia che si chiami "login.php". Innanzitutto, controlla i dati inseriti per errori. La pagina ha campi per il nome utente, la password, il pulsante Invia e il collegamento da registrare. Quando l'utente fa clic sul pulsante "Login", il modulo verrà elaborato tramite il codice dal file "log.php", quindi accedere al sistema.

    Codice PHP.

    0) { // Se ci sono errori di sessione $ err \u003d "

    "; // Avvia una tabella Foreach ($ _Session [" ERRMSG "] come $ MSG) ( // riconoscimento di ciascun errore $ err. \u003d " "; // registralo nella variabile ) $ err. \u003d "
    "$ Msg."
    "; // chiudendo il tavolo UNSET ($ _SESSION ["ERRMSG"]); // Elimina sessione } ?> Modulo di accesso
    Nome utente
    Parola d'ordine
    registrare

    Quindi scriviamo uno script per accedere. Chiamiamolo "log.php". Ha una funzione per la pulizia dei dati di input da iniezioni SQL che il tuo script può essere viziato. In secondo luogo, riceve queste forme e li controlla sulla correttezza. Se i dati di input sono corretti, lo script invia all'utente alla pagina degli utenti autorizzati, in caso contrario, imposta errori e invia l'utente alla pagina di accesso.

    Codice PHP.

    // Avvia sessione per la registrazione Funzione Fix ($ STR) (// Pulizia $ STR \u003d Campi Trim ($ STR); IF (Get_Magic_QUOTES_GPC ()) ($ STR \u003d Stripslashes ($ ST);) // array per salvare errori $ erflag \u003d false; // Flag Errore $ USERNAME \u003d Fix ($ _ Posta ["Nome utente"]); //Nome utente $ Password \u003d Fix ($ _ Posta ["Password"]); // Password) // Controllo password se ($ Password \u003d\u003d "" ") ($ ERRMSG \u003d" Password mancante "; // Errore $ ERFLAG \u003d TRUE; // solleva la bandiera in caso di errore) // Se il flag di errore viene sollevato, si rimanda al modulo di registrazione // scrive errori session_write_close (); // sessione di chiusura // Reindirizzamento Uscita (); ) // richiesta del database $ Qry \u003d "Seleziona * da` Utili utenti dove" username` \u003d "$ USername" e` password` \u003d "". MD5 ($ password). "" "; $ Risultato \u003d mysql_query ($ Qry); // Controllare, se la richiesta ha avuto successo (ci sono dati su di esso) se (mysql_num_rows ($ risultato) \u003d\u003d 1) (while ($ riga \u003d mysql_fetch_assoc ($ risultato)) ($ _Session ["UID"] \u003d $ riga ["UID"]; // Ricevi UID dal database e posizionalo nella sessione $ _Sessione ["Nome utente"] \u003d $ Username; // imposta se il nome dell'utente coincide con la sessione session_write_close (); // sessione di chiusura Intestazione ("Ubicazione: membro.php"); // Reindirizzamento )) Altrimenti ($ _Session ["ERRMSG"] \u003d "Nome utente o password non valido"; // errore session_write_close (); // sessione di chiusura Intestazione ("Ubicazione: login.php"); // Reindirizzamento Uscita (); )?\u003e.

    Facciamo la pagina di registrazione, chiamalo "register.php". Sembra una pagina di accesso, ha solo diversi campi, e invece di riferimento alla registrazione - un collegamento a login.php nel caso in cui l'utente abbia già un account.

    Codice PHP.

    0) { // Se ci sono errori di sessione $ err \u003d "

    "; // Avvia la tabella Foreach ($ _Session [" ERRMSG "] come $ MSG) ( // imposta ogni errore $ err. \u003d " "; // scrive in una variabile ) $ err. \u003d "
    "$ Msg."
    "; // Fine della tabella nonse ($ _Sessione [" ERRMSG "]); // distrugge la sessione } ?> Modulo di registrazione
    Nome utente
    E-mail
    Parola d'ordine
    Ripeti la password
    ho un account

    Ora faremo lo script di registrazione nel file "reg.php". Sarà abilitato "sql.php" di connettersi al database. La stessa funzione viene anche utilizzata come nello script di input per pulire il campo di input. Variabili installate per possibili errori. Avanti - una funzione per creare un identificatore univoco che non è mai stato fornito prima. Quindi i dati dal modulo di registrazione e controllato vengono recuperati. C'è un controllo che l'indirizzo e-mail sia specificato nel formato desiderato, oltre a se la password sia specificata correttamente. Quindi lo script controlla se il database dell'utente è con lo stesso nome e se ci sono report di errore. E infine, il codice aggiunge un utente al database.

    Codice PHP.

    // Avvia sessione per la registrazione Funzione Fix ($ STR) (// Campi di pulizia $ STR \u003d @trim ($ STR); IF (Get_Magic_QUOTES_GPC ()) ($ STR \u003d Stripslashes ($ STR);) restituisce mysql_real_escape_string.($ Str); ) $ errmsg \u003d array (); // array per la memorizzazione di errori $ erflag \u003d false; // Errore flag $ UID \u003d "12323543534523453451445234534514452345345144523453451445685454465685454"; // ID univoco $ username \u003d fix ($ _ post ["username"]); //Nome utente $ Email \u003d $ _Post ["Email"]; // Email $ Password \u003d Fix ($ _ Posta ["Password"]); // Password $ RPASSWORD \u003d FIX ($ _ POST ["RPASSWORD"]); // ripetizione password // Controllare il nome dell'utente se ($ username \u003d\u003d "" ") ($ errmsg \u003d" nome utente mancante "; // errore $ erflag \u003d true; // solleva la bandiera in caso di errore ) // Controllare l'e-mail se (! Eregi ("^ [_ A-Z0-9 -] + (\\. [_ A-Z0-9 -] +) * @ + (\\. +) * (\\. (2.3 )) $ ", $ e-mail)) (// deve essere conforme al formato: [Email protetta] $ errmsg \u003d "Email non valida"; // Errore $ errflag \u003d true; // solleva la bandiera in caso di errore } // Controllo password se ($ Password \u003d\u003d "") ($ ERRMSG \u003d "Password mancante"; // errore $ erflag \u003d true; // solleva la bandiera in caso di errore } // Controllo della ripetizione della password se ($ RPASSWORD \u003d\u003d "") ($ ERRMSG \u003d "RIPETTO PASSWORD MANCANCE"; // Errore $ errflag \u003d true; // solleva la bandiera in caso di errore } // convalida password IF (STRCMP ($ PASSWORD, $ RPASSWORD)! \u003d 0) ($ ERRMSG \u003d "Le password non corrispondono a" // Errore $ erflag \u003d true; // solleva la bandiera in caso di errore } // controlla, se il nome utente è gratuito Se ($ username! \u003d "") ($ Qry \u003d "Seleziona * da` Utili utenti dove" username` \u003d "$ username" "; // Richiedi a mysql $ Risultato \u003d mysql_query ($ Qry); IF ($ Risultato (se (mysql_num_rows ($ risultato)\u003e 0) ( // Se il nome è già utilizzato $ errmsg \u003d "nome utente già in uso"; // messaggio di errore $ Errflag \u003d true; // solleva la bandiera in caso di errore ) mysql_free_result ($ risultato); )) // Se i dati non hanno superato la convalida, dirigono il modulo di registrazione Se ($ ERFLAG) ($ _SESSION ["ERRMSG"] \u003d $ ERRMSG; // messaggio di errore session_write_close (); // sessione di chiusura Intestazione ("Ubicazione: register.php"); // Reindirizzamento Uscita (); ) // Aggiunta di dati al database $ Qry \u003d "Inserisci in" Userauth`.Sers`Sers (`Uid`,` Nome utente`, `Email`,` password`) Valori ("$ UID", "$ USERNAME", "$ Email", " ". MD5 ($ password)." ")"; $ Risultato \u003d mysql_query ($ Qry); // Controllare, se una richiesta di successo per l'aggiunta Se ($ Risultato) (echo "Grazie per la registrazione," $ username. ". Per favore inserisci qui"; Uscita ();) Else (Die (" Errore, fare riferimento a più tardi ");)?\u003e

    Hai ancora bisogno di creare uno script per uscire dall'utente dal sistema. Interrompe la sessione per l'utente con questo identificativo e un nome univoco, quindi reindirizza l'utente alla pagina di accesso.

    Codice PHP.

    Infine, lo script "auth.php" può essere utilizzato per rendere le pagine disponibili solo per gli utenti autorizzati. Controlla i dati di input e, se sono corretti, consente all'utente di visualizzare le pagine e, in caso contrario, chiede di accedere. Inoltre, se qualcuno cerca di hackerare il sito creando una delle sessioni, sarà interrotta come in generale.

    Codice PHP.

    Una delle condizioni del codice sopra è oggetto della domanda.

    Il seguente codice deve essere inserito nella pagina per gli utenti autorizzati, è chiamato, ad esempio "member.php", e potresti essere chiamato come si prega di.

    Codice PHP.

    Hai accesso a questa pagina. Esci ( )

    L'autenticazione dell'utente è pronta!

    La campana.

    Ci sono quelli che hanno letto questa notizia prima di te.
    Iscriviti per ricevere articoli freschi.
    E-mail
    Nome
    Cognome
    Come vuoi leggere la campana
    Senza spam.