Cum se creează un script de autentificare securizat în php și MySQL

Cu tot mai multe povești de piraterie în știri, dezvoltatorii caută modalități mai bune de a-și asigura site-ul. Dacă site-ul dvs. are un sistem membru, acesta ar putea fi expus riscului de a fi spart și datele de utilizator ar putea fi compromise. Acest ghid vă va arăta o încercare de a crea o autentificare sigură cu PHP. Ne-am depus toate eforturile în programarea codului, dar securitatea și în special criptarea sunt probleme complexe care se schimbă tot timpul și nu putem spune că dominăm acest domeniu. Prin urmare, am fi ratat cateva trucuri in programarea noastra. Dacă da, anunțați-ne și vom încerca să includem orice îmbunătățire a ceea ce avem.

În urma acestui ghid vă veți ajuta să aveți grijă de multe tipuri de atacuri pe care crackerii le-ar putea folosi pentru a obține controlul conturilor altor utilizatori, pentru a șterge conturile și / sau pentru a schimba datele. Mai jos, prezentăm o listă de atacuri posibile, despre care acest ghid încearcă să se apere:

Abordarea este de a folosi o combinație de filtre de date, criptare și alte metode pentru a face viața un pic mai greu pentru cei care cred că te atacă.

Încercăm să îmbunătățim continuu scenariul prezent. ultima versiune a codului este disponibil în github. S-ar putea să existe diferențe între codul pe care îl descărcați pe acea pagină și codul citat în acest articol. Trebuie să rețineți că obiectivul nostru nu a fost acela că prezentarea paginilor HTML realizate de aplicație arată deloc frumoasă.

De asemenea, trebuie să rețineți că nu închidem etichetele PHP în fișiere care conțin numai cod PHP. Acest lucru este în conformitate cu cele mai multe recomandări privind formatul codului.

În cele din urmă, este necesar să știm că vă cerem să creați toate fișierele non-HTML ale aplicației în diferite directoare din directorul rădăcină al aplicației. Cea mai ușoară modalitate de a crea structura corectă a directoarelor este să descărcați cel mai recent cod făcând clic pe unul dintre legăturile menționate mai sus.

Vă rugăm să vă simțiți liber să folosiți această aplicație ca bază pentru propria implementare, dar să nu o utilizați ca exemplu de bună practică de programare.



Lucruri de care ai nevoie

Pentru că vom folosi mysqli_ * care este un set de clase PHP pentru a accesa baza de date mySQL, veți avea nevoie de următoarele versiuni de PHP și MySQL.

  • Versiunea PHP 5.3 sau o versiune ulterioară
  • Versiunea MySQL 4.1.3 sau o versiune ulterioară

Evident, veți avea nevoie, de asemenea, de un server web configurat să utilizeze PHP pentru a găzdui paginile dvs. Acesta va fi cel mai probabil serverul web ce găzduiește pagina dvs., cu excepția cazului în care vă găzduiți singur.

Pentru a verifica versiunea PHP și MySQL pe serverul dvs., utilizați funcția phpinfo () -.

pași

Partea 1
Configurați-vă serverul

1
Instalați un server web, PHP și MySQL pe serverul dvs.

Majoritatea serviciilor de găzduire au deja instalate PHP și MySQL, dar va trebui să verificați dacă au cele mai recente versiuni de PHP și MySQL, astfel încât acest ghid să vă ajute. Dacă nu aveți cel puțin PHP5.3 și MySQL5, puteți pune la îndoială angajamentul lor față de securitate. Menținerea software-ului actualizat face parte din procesul de securitate.

Dacă aveți propriul server sau computer, trebuie să instalați software-ul necesar în mod normal în funcție de sistem. În general, dacă nu doriți să utilizați configurația din motive de producție și veți dezvolta în Windows sau OS X, va fi recomandată instalarea unui pachet de aplicații (stack) XAMPP. Obțineți versiunea corespunzătoare pentru sistemul dvs. de operare în:

https://apachefriends.org/en/xampp.html

Cu toate acestea, rețineți că, în niciun caz, nu trebuie să utilizați XAMPP pentru a crea un mediu server de producție.

În Linux, utilizați managerul de pachete pentru a descărca și instala pachetele necesare. Unele distribuții, cum ar fi Ubuntu, conțin toate aplicațiile necesare într-un singur pachet. Trebuie doar să faceți următoarele într-o fereastră terminală Ubuntu:

sudo apt-get instalați lamp-server ^ phpmyadmin



Dar chiar dacă instalați elementele necesare, asigurați-vă că configurați MySQL cu o parolă de root sigură.

Partea 2
Configurați baza de date MySQL

1
Creați o bază de date MySQL.

Porniți sesiunea din baza de date ca utilizator de administrator (de obicei "root").

În acest ghid vom crea o bază de date numită "safe_home".

Vezi cum creați o bază de date în phpMyAdmin.

Puteți folosi codul de mai jos sau puteți face același lucru în phpMyAdmin sau în clientul preferat MySQL GUI, dacă doriți:

CREAȚI DATABASA `secure_login`-
Notă: unele servicii de găzduire nu vă vor permite să creați o bază de date cu phpMyAdmin, de aceea învățați faceți-o în cPanel.
  • 2
    Creați un utilizator numai cu privilegiile SELECT, UPDATE și INSERT.

    Crearea unui utilizator cu privilegii restricționate înseamnă că în cazul în care securitatea este vreodată încălcată în scriptul dvs., hackerul nu va putea să șterge sau să lase nimic din baza noastră de date. Prin utilizarea acestui utilizator puteți face aproape ceea ce doriți cu aplicația dvs. Dacă sunteți într-adevăr paranoic, creați un alt utilizator pentru fiecare funcție.

    Desigur, va trebui să vă conectați la MySQL ca un utilizator cu suficiente privilegii pentru a putea crea un alt utilizator. De obicei, acest utilizator va fi root.

    Următoarele detalii sunt de la utilizatorul pe care l-am creat:
  • utilizator: "sec_user"
  • parola: "eKcGZr59zAa2BEWU"

  • Notă: vă recomandăm să schimbați parola pe care am menționat-o anterior atunci când o veți rula pe propriul server. Dacă faceți acest lucru, asigurați-vă că modificați codul de mai jos și codul de conectare al bazei de date PHP în aplicația pe care o vom crea.

    Amintiți-vă că nu va trebui să fie o parolă pe care să vă puteți aminti, astfel încât să o faceți cât mai complicată posibil. De exemplu, acesta este a generator de parole aleatoare.

    Apoi, va exista și codul SQL pentru a crea utilizatorul bazei de date și a-i acorda permisiunile necesare. Dacă preferați, puteți face acest lucru și într-un client bază de date GUI, cum ar fi phpmyadmin:

    CREATE USER `sec_user` @ `localhost` IDENTIFICAT DE `eKcGZr59zAa2BEWU`-GRANT SELECT, INSERT, UPDATE ON `secure_login`. * LA` sec_user `@` localhost`-


    Dacă vedeți că vă sunt ștergerea înregistrărilor din oricare din tabelele acestui modul, trebuie să adăugați ELIMINAȚI la lista de privilegii sau altfel ai putea crea un alt utilizator care are doar privilegiul DELETE și numai în tabelul pe care doriți să-l ștergeți înregistrările în cazul în care nu vrei să faci pe amândouă. Nu este necesar de a acorda privilegiul ELIMINAȚI la toate la prezentul script exemplar.
  • 3
    Creați un tabel MySQL care are un titlu "membru".

    Codul de mai jos va crea un tabel cu cinci câmpuri (identificare, nume de utilizator, email, parolă, sare). Vom folosi tipul de date CHAR pentru câmpurile a căror extensie cunoaștem, deoarece câmpurile "parola" și "sare" vor avea întotdeauna 128 caractere. Utilizarea CHAR în acele cazuri va economisi puterea de procesare:

    CREATE TABLE `secure_login`.`members` (` id` INT PRIMARY KEY NOT AUTO_INCREMENT NULL, `username` VARCHAR (30) NOT NULL,` email` VARCHAR (50), `CHAR password` NOT NULL (128) NOT NULL, `salt` CHAR (128) NOT NULL) MOTOR = InnoDB-

    După cum am menționat mai devreme, puteți să o faceți în orice tip de client pe care îl preferați.
  • 4
    Creați un tabel pentru a stoca încercările de conectare.

    Vom folosi acest tabel pentru a stoca încercările de conectare ale utilizatorilor. Aceasta este o modalitate de a face dificila atacurile de forta bruta:

    CREATE TABLE `secure_login`.`login_attempts` (` INT user_id` (11) NOT NULL, `time` VARCHAR (30) NOT NULL) ENGINE = InnoDB

  • 5
    Creați un rând de testare în tabelul "membri".

    Va fi important să puteți testa scriptul de conectare, astfel încât să prezentăm scriptul pentru a crea un utilizator cu detalii cunoscute:
  • Nume utilizator: test_user
  • e-mail: [email protected]
  • Parola: 6ZaxN2Vzm9NUJT2y

  • Codul va trebui să vă puteți autentifica în calitate de utilizator:

    INSERT INTO `VALORI secure_login`.`members` (1, `test_user`, `[email protected]`, `00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc`, `f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef`) -

    Partea 3
    Creați pagina de conectare pentru baza de date

    1
    Creați o pagină cu configurații globale.

    Creați un director numit "include" în directorul rădăcină al aplicației și apoi creați un nou fișier PHP în acel director. Puneți numele "psl-config.php". Într-un mediu de producție, ar trebui să localizați acel fișier și toate celelalte fișiere "include" în afara radacinii documentului serverului web. Dacă faceți acest lucru, pe care îl recomandăm, va trebui să modificați declarația "include" sau declarațiile necesare cât de mult este necesar, astfel încât aplicația să poată găsi fișierele "include".

    Dacă plasați aceste fișiere în afara radacinii documentului serverului web, fișierul dvs. nu poate fi găsit cu o adresă URL. Apoi, în cazul în care cineva a părăsit extensia PHP din greșeală sau a stricat permisiunile fișierului, fișierul nu poate fi afișat în text într-o fereastră de browser.

    Fișierul va avea variabile globale de configurare. Aspecte, cum ar fi dacă cineva se poate înregistra, dacă este o conexiune securizată (HTTPS), printre altele, în plus față de detaliile bazei de date ar putea merge la acel loc.

  • 2
    Creați pagina de conectare pentru baza de date.

    Acesta va fi codul PHP pe care va trebui să îl utilizați pentru a vă conecta la baza de date mySQL. Creați un nou fișier PHP numit "db_connect.php" în directorul "include" al aplicației și adăugați codul de mai jos. Apoi puteți include fișierul în orice pagină în care doriți să vă conectați la baza de date.

  • Partea 4
    Creați funcții PHP

    Aceste funcții vor face toată prelucrarea scriptului de conectare. Adăugați toate funcțiile la pagina numită "functions.php" din directorul "include" din aplicație.

    1
    Porniți sigur sesiunea PHP.
    Sesiunile PHP sunt reputate nu pentru a fi foarte sigure, deci va fi important să nu puneți "session_start () ;" în partea de sus a fiecărei pagini pe care doriți să o utilizați pentru sesiunile PHP. Vom crea o funcție numită "sec_session_start ()", va iniția o sesiune PHP într-un mod sigur. Ar trebui să apelați această funcție în partea de sus a fiecărei pagini în care doriți să aveți acces la o variabilă de sesiune PHP. Dacă sunteți cu adevărat preocupat de securitatea și confidențialitatea cookie-urilor, aruncați o privire la următorul articol: Cum se creează un sistem securizat de gestionare a sesiunilor în PHP și MySQL.

    Această funcție va face scriptul dvs. de conectare mult mai sigur. Aceasta va determina biscuiții să oprească accesarea cookie-ului care identifică sesiunea cu jаvascript (de exemplu într-un atac XSS). La rândul său, funcția "session_regenerate_id ()", care generează identificarea sesiunii în fiecare încărcare a paginii, va ajuta la prevenirea furtului unei sesiuni. Notă: dacă intenționați să utilizați HTTPS în aplicația dvs. de conectare, setați variabila "$ secure" la "true". Într-un mediu de producție, va fi esențial să utilizați HTTPS.

    Creați un nou fișier numit "functions.php" în directorul "include" al aplicației dvs. și adăugați codul de mai jos.
  • 2
    Creați funcția de conectare.
    Această funcție va compara e-mailul și parola cu baza de date și, dacă există o potrivire, va apărea ca adevărat (adevărat). Adăugați această funcție în fișierul "functions.php":
    ($ email, $ password, $ mysqli) {// Folosind instrucțiunile pregătite înseamnă că SQL injection nu va fi posibil $ stmt = $ mysqli->pregăti ("SELECT id, nume de utilizator, parola, sareFROM membriWHERE email =? LIMIT 1")) {$ stmt->bind_param (`s`, $ email) - // Alăturați-vă "$ email" la parametrul $ stmt->execute () - // Executați interogarea pregătită $ stmt->store_result () - // Obțineți variabilele rezultatului $ stmt->bind_result ($ user_id, $ nume utilizator, $ db_password, $ salt) - $ stmt->fetch () - // Hash parola cu o singură sare $ password = hash (`sha512`, $ password, $ salt) -if ($ stmt->num_rows == 1) {// Dacă există utilizatorul, verifică dacă contul este blocat de mai multe încercări // conexión.if (checkbrute ($ user_id, $ mysqli) == true) {// Contul este bloqueada./ / trimite utilizatorului un e-mail care vă informează că în contul dvs. este fals bloqueada.return} else {// Verificați dacă parola în baza de date // se potrivește cu parola pe care envió.if utilizator ($ DB_PASSWORD == $ parola) {// parola este corectă // Ia utilizatorul agent utilizator $ user_browser = $ _SERVER [ `HTTP_USER_AGENT`] -. // protectie XSS, deoarece această valoare ar putea imprima $ user_id = preg_replace (."/ [^ 0-9] + /". "", $ user_id) - $ _ SESSION [`user_id`] = $ user_id - // Protecție XSS deoarece am putea tipări această valoare $ username = preg_replace ("/ [^ a-zA-Z0-9 _ -] + /"."", $ Nume de utilizator) - $ _ SESSION [ `username`] = $ username - $ _ SESSION [ `login_string`] = diez ( `SHA512`, $ parola $ user_browser) -. // Autentificare exitosoreturn true-} else {// Parola nu este corectă.// Această încercare este înregistrată în baza de date $ Now = time () - $ mysqli->interogare ("INSCRIEȚI ÎN login_attempts (user_id, time) VALUES (`$ user_id`, `$ now`)") -return false-}}} altceva {// Utilizatorul nu există. returnează false-}}}

  • 3
    Funcția forței brute.
    Forțele de atac brute apar atunci când un hacker încearcă să acceseze un cont cu 1000 de parole diferite, generate fie aleator, fie dintr-un dicționar. În scriptul nostru, dacă un cont al unui utilizator nu se conectează după mai mult de 5 încercări, contul acestuia va fi blocat.

    Atacurile de forță brute sunt greu de prevenit, pentru a face acest lucru puteți utiliza testele CAPTCHA, blocați conturile de utilizator și adăugați o întârziere în conectările nereușite, astfel că utilizatorul nu poate accesa încă 30 de secunde.

    Vă recomandăm cu insistență să utilizați un CAPTCHA. Deoarece nu am implementat această funcție în exemplul nostru, sperăm să o facem în curând SecureImage, deoarece nu necesită înregistrare. Ai putea prefera ceva mai cunoscut sub numele de reCAPTCHA de Google.

    Indiferent de sistemul pe care îl decideți să îl utilizați, vă sugerăm să afișați imaginea CAPTCHA după două intrări nereușite pentru a evita inconvenientele inutile ale utilizatorului.

    Când se confruntă cu această problemă, majoritatea dezvoltatorilor blochează pur și simplu adresa IP după un anumit număr de conectări nereușite. Cu toate acestea, există multe instrumente pentru automatizarea procesului. Acestea pot trece printr-o serie de proxy-uri și chiar pot schimba IP-ul în fiecare cerere. Blocarea tuturor acestor adrese IP ar putea bloca și conturile utilizatorilor dvs. legitimi. În codul nostru vom înregistra încercări eșuate și vom bloca contul utilizatorului după cinci încercări nereușite. Acest lucru va trimite un e-mail utilizatorului cu un link pentru resetare, dar nu am implementat acest punct în codul nostru. Apoi vom prezenta funcția "checkbrute ()" până în prezent. Adăugați-l la codul dvs. "functions.php":

    Funcția checkbrute ($ user_id, $ mysqli) {// Ia curent TIMESTAMP $ = momentul acum (). - // Toate incercarile de conectare sunt numărate de la 2 ore înainte de $ valid_attempts = $ acum. - ( 2 * 60 * 60) -if ($ stmt = $ mysqli->pregăti ("SELECT timeFROM login_attemptsWHERE user_id =? ȘI TIMP > `$ valid_attempts`")) {$ stmt->bind_param (`i`, $ user_id) - // Executați interogarea pregătită $ stmt->execuție () - $ stmt->store_result () - // Dacă au existat mai mult de 5 încercări de conectare failed.if ($ stmt->NUM_ROWS > 5) {returnă adevărat-} altceva {return false-}}}
  • 4


    Verificați starea sesiunii începute.
    Vom face acest lucru verificând "user_id" și variabilele de sesiune "login_string". Variabila SESSION "login_string" are informația din browserul utilizatorului împreună cu parola legată printr-o funcție hash. Utilizăm informațiile browserului, deoarece este foarte puțin probabil ca utilizatorul să îl schimbe în mijlocul sesiunii. Acest lucru va ajuta la prevenirea furtului de sesiune. Adăugați această funcție în fișierul "functions.php" din directorul "include folder" al aplicației:

    login_check funcția ($ mysqli) {// Verificați dacă toate variabilele de sesiune sunt configuradas.if (isset ($ _ SESSION [ `user_id`], $ _ SESSION [ `username`], $ _ SESSION [ `login_string`])) {$ user_id = $ _SESSION [ `user_id`] - $ login_string = $ _SESSION [ `login_string`] - $ username = $ _SESSION [ `username`] - // Ia agentul utilizator string $ user_browser = $ _SERVER [. `HTTP_USER_AGENT`] - dacă ($ stmt = $ mysqli->pregăti ("SELECTAȚI parolaPartenerii din FABRICA id =? LIMIT 1")) {// Alăturați-vă "$ user_id" parametrului $ Stmt->bind_param (`i`, $ user_id) - $ stmt->execute () - // Executați interogarea pregătită $ stmt->store_result () - dacă ($ stmt->num_rows == 1) {// Dacă utilizatorul există, el obține variabilele rezultatului $ stmt->bind_result ($ password) - $ stmt->fetch () - $ login_check = hash (`sha512`, $ parola $ user_browser) -if ($ login_check == login_string) {// Conectat !! return true =} altceva {// not connected.return false-}} altfel {// not connected.return false-}} altceva {// not connected.return false-}} altceva {// not connected.return false- }}
  • 5
    Sanea URL-ul PHP_SELF
    Această funcție curăță ieșirea variabilei server PHP_SELF. Este o modificare a unei funcții cu același nume utilizată de sistemul de management al conținutului WordPress:

    funcția esc_url ($ url) {if (`` == $ url) {retur $ url -} $ url = preg_replace (`| [^ a-z0-9- ~ + _.&-, /:% @ $ | * `() x80 - xff] | i`, ``, $ url) - $ strip = array ( `% 0min`, `% 0A`, „% 0D“, `% 0A `) - $ url = (string) $ URL- $ count = 1 în timp ce ($ count) {$ url = str_replace ($ strip,``, $ url, conta $) -} $ url = str_replace ( `- //` `: //`, $ url) - $ url = htmlentities ($ url) - $ url = str_replace ( `&- `,`&# 038- `, $ url) - $ url = str_replace ("`", "&# 039- `!, $ Url) -dacă ($ url [0] ==` / `) {// ne interesează doar link-uri relative $ _SERVER [` PHP_SELF `] întoarcere` „-} else {întoarcere $ url -}}


    Problema cu utilizarea unei variabile de server nefiltrate este aceea că ar putea fi folosită în atacurile de scripting între site-uri. Conform celor mai multe referințe, trebuie doar să o filtrați cu "htmlentities ()", dar este încă insuficientă, de aceea există măsuri de securitate excesive pentru această funcție.

    Alții sugerează lăsarea atributului de acțiune a formularului gol sau setarea acestuia la un șir gol. Dar acest lucru ar putea duce la a faceți clic pe iframe de atac de răpire.
  • Partea 5
    Creați pagini de procesare

    1
    Creați pagina procesului de autentificare (process_login.php)

    Creați un fișier pentru a procesa datele de conectare, cu numele "process_login.php", în directorul "include" din aplicație. Va trebui să accesați acest director deoarece nu are niciun format HTML.

    Vom folosi seria de funcții PHP mysqli_ *, deoarece aceasta este una dintre cele mai actualizate extensii mySQL.

  • 2
    Creați un script pentru a închide sesiunea.

    Scriptul de închidere a sesiunii trebuie să se conecteze, să îl distrugă și apoi să îl redirecteze către altă locație. Notă: vă recomandăm să adăugați aici o protecție CSRF în cazul în care cineva reușește să trimită un link ascuns la această pagină. Pentru mai multe informații despre CSRF, vizitați Codarea groazei.

    Codul curent de deconectare a utilizatorului, pe care trebuie să-l adăugați la fișierul intitulat "logout.php" din directorul "include" al aplicației, este după cum urmează:

  • 3
    Pagina de înregistrare.

    Trebuie să includă codul de înregistrare în două fișiere noi numite „register.php“ în directorul rădăcină al aplicației și „register.inc.php“ în „include“, care va:
  • Obține și validează numele de utilizator pe care utilizatorul dorește să îl adopte.
  • Obține și validează adresa de e-mail a utilizatorului.
  • Obține și validează parola pe care utilizatorul dorește să o utilizeze.
  • Se pune parola cu hash și o returnează pe pagina "register.php" (adică o trimite la ea însăși).

  • Majoritatea validării se face în jаvascript, pe partea clientului. Acest lucru se datorează faptului că utilizatorul nu are motivația de a eluda aceste verificări. De ce ar vrea utilizatorul să creeze un cont care să nu fie atât de sigur? Vom vorbi despre jаvascript în următoarea secțiune.

    Pentru moment, va trebui doar să creați fișierul "register.php" și să includeți codul de mai jos:

    Intrare sigură: Formular de înregistrare

    Înscrieți-vă la noi

  • Numele de utilizator poate conține numai cifre, majuscule, litere mici și subliniere.
  • E-mailurile trebuie să aibă un format valid.
  • Parolele trebuie să aibă cel puțin 6 caractere.
  • Parolele trebuie să fie compuse din:
    • Cel puțin o majusculă (A-Z)
    • Cel puțin o literă mică (a-z)
    • Cel puțin un număr (0-9)
  • Parola și confirmarea trebuie să se potrivească exact.
  • Reveniți la pagina de conectare.



    Fișierul "register.inc.php" din directorul "include" ar trebui să aibă codul de mai jos:

    Adresa de e-mail pe care ați introdus-o nu este validă

    `-} $ parola = filter_input (INPUT_POST,` p“, FILTER_SANITIZE_STRING) -daca (strlen ($ parola) = 128) {// Parola trunchiată trebuie sa fie 128 caracteres.// Altfel, foarte rare Se va întâmpla. $ error_msg. = `

    Setarea nevalidă a parolei.

    „-} // valabilitate a numelui de utilizator și parola a fost verificată în cliente.// Acest lucru va fi suficient, pentru că nimeni nu va beneficia de încălcarea acestor reglas.//$prep_stmt // = "SELECT id de la membri WHERE email =? LIMIT 1"- $ stmt = $ mysqli->prepare ($ prep_stmt) - // Verificați e-mailurile existente. dacă ($ stmt) {$ stmt->bind_param (`s`, $ email) - $ stmt->execuție () - $ stmt->store_result () - dacă ($ stmt->num_rows == 1) {// Un alt utilizator există deja cu acest e-mail $ error_msg. = `

    Un utilizator cu această adresă de e-mail există deja.

    `- $ stmt->close () -} $ stmt->închide () -} altceva {$ error_msg. = `

    Eroare la baza de date Linia 39

    `- $ stmt->close () -} // Verificați numele de utilizator existent. $ prep_stmt = "SELECT id de la membri WHERE username =? LIMIT 1"- $ stmt = $ mysqli->pregăti ($ prep_stmt) -if ($ stmt) {$ stmt->bind_param (`s`, $ username) - $ stmt->execuție () - $ stmt->store_result () - dacă ($ stmt->num_rows == 1) {// Un alt utilizator există deja cu acest nume de utilizator $ error_msg. = `

    Un utilizator cu acest nume de utilizator există deja

    `- $ stmt->close () -} $ stmt->închide () -} altceva {$ error_msg. = `

    Linia de eroare a bazei de date 55

    `- $ stmt->close () -} // în așteptare: // noi trebuie să ia în considerare, de asemenea, situația în care utilizatorul nu are drepturi // să se înregistreze, pentru a verifica ce tip de utilizator încearcă să efectueze operación.if // (gol ($ ERROR_MSG)) {// Crearea unei aleatoria.//$random_salt de sare = diez ( `SHA512`, uniqid (openssl_random_pseudo_bytes (16), TRUE)) - nu a mers // $ random_salt = hash ( `SHA512`, uniqid (mt_rand (1 mt_getrandmax ()), true)) - // Crearea unei parole cu sare. $ Parola = diez ( `SHA512`, $ parola $ random_salt.) - // Se introduce noul utilizator la baza de date. dacă ($ insert_stmt = $ mysqli->pregăti ("INSERTAȚI-L ÎN MEMBRI (nume de utilizator, email, parolă, sare) VALORI (?,?,?,?)")) {$ insert_stmt->bind_param (`ssss`, $ username, $ email, $ password, $ random_salt) - // Executa interogarea prepared.if (! $ insert_stmt->executați ()) {antet (`Locație: ../error.php?err= Eroare de înregistrare: INSERT`) -}} header (`Locație: ./register_success.php`)-}}


    Dacă nu există date POST furnizate formularului, va fi afișat formularul de înregistrare. Butonul de prezentare a formularului solicită funcția jаvascript "regformhash ()". Această funcție va efectua verificările de validare necesare și va trimite formularul când totul este corect. Vom vorbi despre funcțiile jаvascript în secțiunea următoare.

    Dacă există date POST, unele verificări ale serverului vor fi efectuate pentru a le curăța și a le valida. CONSTITUIE că aceste verificări nu au fost finalizate până în prezent. Unele probleme sunt menționate în comentariile din dosar. Până în prezent, verificăm numai că adresa de e-mail are formatul corect, că parola cu hash are extensia corectă și că utilizatorul nu încearcă să înregistreze un e-mail deja înregistrat.

    Dacă totul este corect, noul utilizator va fi înregistrat și o nouă înregistrare va fi scrisă în tabelul membru.

    Partea 6
    Creați fișiere jаvascript

    1
    Creați fișierul "sha512.js".

    Acest fișier este o implementare jаvascript a algoritmului shah12 hash. Vom folosi funcția hash astfel încât parolele să nu fie trimise în text simplu.

    Puteți descărca fișierul pajhome.org.uk

    (De asemenea, va fi salvat în depozitul github).

    Salvați copia acestui fișier într-un director intitulat "js" din directorul rădăcină al aplicației.

  • 2
    Creați fișierul "forms.js".
    Acest fișier, care va trebui să creați în directorul "js" al aplicației, va fi responsabil pentru hash-ul parolelor pentru formele de conectare (formhash () și înregistrare (regformhash ()):

    funcția formhash (formă, parolă) {// Creați o intrare element nou, acesta va fi câmpul de parolă cu hash. var p = document.createElement ("intrare") - // Adăugați elementul nou în formularul nostru. form.appendChild (p) -p.name = "p"-p.type = "ascuns"-p.value = hex_sha512 (password.value) - // Asigurați-vă că parola de text simplu nu este trimisă. password.value = ""- În final trimiteți formularul. form.submit () -} funcția regformhash (forma, uid, e-mail, parola, conf) {// Verificați dacă fiecare câmp are o valorif (uid.value == `` || email.value == `` || parola .value == `` || conf.value == ``) {alert ( „trebuie să furnizeze toate informațiile solicitate Vă rugăm să încercați din nou„) -. return false -} // Verificați numele usuariore = / ^ w + $ / - dacă (! re.test (form.username.value)) {alertă ("Numele de utilizator trebuie să conțină numai litere, numere și subliniere. Încercați din nou") -form.username.focus () - return false -} // Verificați dacă parola are extensia corectă (min 6 caractere) // Verificare dublu de mai jos, dar este inclus pentru ca utilizatorul să aibă un //. mai specific.if ghid (parola.value.length < 6) {alert ( „Parola trebuie să fie de cel puțin 6 caractere Vă rugăm să încercați din nou„) -. Form.password.focus () - return false -} // Cel puțin un număr, o literă mică și litere mari // cel puțin 6 caracteresvar Re = /(?=.*d)(?=.*[az])(?=.*[AZ]).{6,}/-if (! re.test (parola .value)) {alert ( „parole trebuie să conțină cel puțin un număr, o literă mică și un capital Vă rugăm să încercați din nou.“) - return false -} // Verificați parola și confirmarea sunt igualesif (parola .value = conf.value) {alert ( `parola și confirmarea acesteia nu se potrivesc încercaţi din nou.`) - form.password.focus () - return false -} // a crea o nouă intrare element, Acesta va fi câmpul de parolă cu hash. var p = document.createElement ("intrare") - // Adăugați elementul nou în formularul nostru. form.appendChild (p) -p.name = "p"-p.type = "ascuns"-p.value = hex_sha512 (password.value) - // Asigurați-vă că parola de text simplu nu este trimisă. password.value = ""-conf.value = ""- În final trimiteți formularul. form.submit () - return true-}

    În ambele cazuri, jаvascript pune o parolă trunchiată și transferat la POST date pentru a crea și populeze un câmp ascuns.

  • Partea 7
    Creați pagini HTML

    1
    Creați formularul de autentificare (login.php).

    Aceasta este o formă de cod HTML cu două câmpuri de text, intitulat "e-mail" și "parolă". Butonul de trimitere a formularului va apela funcția jаvascript "formhash ()", care va genera o parolă cu hash și va trimite pe server conținutul "email" și "p" (parola cu hash). Va trebui să creați acest fișier în directorul rădăcină al aplicației.

    Când începe sesiunea, este mai bine să folosiți ceva care nu este public. În acest ghid vom folosi e-mailul ca ID de conectare, dar numele de utilizator poate fi apoi utilizat pentru a identifica utilizatorul. Dacă e-mailul este ascuns într-o pagină din cadrul aplicației mai largi, va fi adăugată o altă variabilă necunoscută pentru a sparge conturile.

    Notă: deși am criptat parola, astfel încât nu este trimis în text simplu, este vital să utilizați protocolul HTTPS (TLS / SSL) atunci când trimiterea parolelor la un sistem de producție. Nu este inutil să insistăm că pur și simplu hash o parolă va fi insuficientă. S-ar putea să suferiți un atac "om în mijloc" care ar putea citi hașurile trimise și să le folosească pentru a vă conecta.

    Intrare sigură: conectați-văEroare la conectare!

    „-}?>

    Dacă nu aveți un cont, vă rugămînregistrați.

    Dacă sa terminat, te rogînchideți sesiunea.

    Este conectat.


  • 2
    Creați pagina "register_success.php.

    Creați o nouă pagină web PHP numită "register_success.php" în directorul rădăcină al aplicației. Aceasta este pagina în care veți fi redirecționat către utilizator după ce v-ați înregistrat cu succes. Desigur, puteți face această pagină așa cum doriți sau puteți să o redirecționați către altă pagină (sau nu). Va depinde de tine. Trebuie să localizați pagina în directorul rădăcină al aplicației. Pagina curentă "register_success.php" pe care am scris-o arată astfel:

    Intrare sigură: înscriere reușită

    Înregistrarea cu succes!

    Acum te poți întoarcepagina de conectare și începe sesiunea.


  • 3
    Creați pagina de eroare.

    Creați o nouă pagină HTML în directorul rădăcină al aplicației și denumiți-o "error.php". Aceasta este pagina unde veți fi redirecționat către utilizator în cazul în care apare o eroare în timpul începutul sesiunii, înregistrarea sau atunci când încearcă să stabilească o sesiune sigură. Codul de mai jos va afișa o pagină de eroare generală. Poate ai nevoie de ceva mai sofisticat. Cu toate acestea, rețineți că tot ce este adăugat la pagină ar trebui să fie filtrat corespunzător pentru a proteja împotriva eventualelor atacuri XSS. Codul exemplar al paginii este următorul:

    Intrare securizată: Eroare

    A fost o problemă.


  • Partea 8
    Protejați paginile

    1
    Secvență de comenzi pentru protejarea paginilor.

    Una dintre cele mai frecvente probleme cu sistemele de autentificare este faptul că dezvoltatorul uită să verifice dacă utilizatorul este conectat. Va fi foarte important să utilizați codul de mai jos pe fiecare pagină protejată pentru a verifica dacă utilizatorul este conectat. Asigurați-vă că utilizați această funcție.

    // Adăugați aici conexiunea și funcțiile bazei de date. Vezi 3.1. sec_session_start () - if (login_check ($ mysqli) == true) {// Adăugați conținutul paginii dvs. protejate aici! } else {echo "Nu sunteți autorizat să accesați această pagină. Vă rugăm să începeți sesiunea ".-}

    Ca exemplu pentru ceea ce trebuie să faceți, am inclus o pagină de eșantion protejată. Creați un fișier cu numele "protected_page.php" în directorul rădăcină al aplicației. Fișierul ar trebui să fie similar cu ceea ce vom arăta în continuare:

    Intrare securizată: Pagină protejatăBine ai venit, 

    Acesta este un exemplu de pagină protejată. Pentru a accesa această pagină, utilizatorii trebuie să se conecteze. La un moment dat, vom verifica și rolul utilizatorului, astfel încât paginile să poată determina tipul de utilizator autorizat să acceseze pagina.

    Reveniți lapagina de conectare.

    Nu sunteți autorizat să accesați această pagină. vă rog autentificare.


    Aplicația noastră va redirecționa utilizatorul la această pagină după ce sa înregistrat cu succes. Evident, implementarea dvs. nu va trebui să fie aceeași.

    sfaturi

    • Pleacă de la funcția md5 în scripturile de conectare, este luat în considerare algoritmul hash al md5 nesigur.
    • Cu foarte puține modificări în aceste scripturi de exemplu veți putea să lucrați cu alte sisteme SQL, cum ar fi SQLite sau PostgreSQL.
    • Utilizați HTML și CSS pentru a formata formularul de acces și de ieșire pentru paginile care vă plac.
    • Dacă doriți să utilizați un algoritm hash diferit în loc de sha512, încercați Whirlpool. Evitați utilizarea lui Gost, sha1 (dacă nu este bine sărat și are mai multe iterații) și, așa cum am menționat deja, md5. Încurajați utilizatorii să creeze parole unice, securizate, cu majuscule, litere mici, numere și simboluri. Luați în considerare solicitarea utilizatorilor să creeze un nume de conectare diferit de numele de utilizator pentru al face mai sigur.

    avertismente

    • Pagina de pornire și înregistrarea ar trebui să utilizeze HTTPS. Scripturile din acest articol nu vă obligă să faceți acest lucru și, de fapt, ar fi mai ușor să nu faceți acest lucru în timpul dezvoltării, dar nu ar trebui să utilizați aceste scripturi într-un mediu de producție decât dacă utilizați HTTPS.
    • Asigurați-vă că utilizatorul nu vă poate vedea scripturile PHP, ceea ce s-ar putea întâmpla din cauza configurației incorecte a serverului. Există posibilitatea ca utilizatorii să colecteze informații despre baza dvs. de date, cum ar fi numele și parolele, dacă codul dvs. PHP este vizibil. În mod ideal, toate scripturile incluse în alte secvențe sau pagini sunt localizate într-un director din afara sistemului de fișiere al serverului și sunt menționate cu o cale relativă, de exemplu, adăugați: "../ .. /includes/myscript.inc.php ".
    • Nimic nu este 100% sigur. Amintiți-vă să urmați cele mai recente știri de securitate pentru a continua îmbunătățirea securității scripturilor dvs.
    • Acest script de forță anti-brute care blochează contul utilizatorului poate fi utilizat foarte ușor. Vă recomandăm cu insistență să folosiți o tehnică de forță brute cum ar fi CAPTCHA.
    • Vă recomandăm să utilizați o CAPTCHA pe pagina de conectare pentru a împiedica forța brute și atacurile DoS. Verificare CAPTCHA va apărea pe formular după două încercări nereușite de conectare, cu toate că nu au fost încă puse în aplicare în codul de probă.
    • Ai putea obține o soluție mai bună cu un cadru cum ar fi Zend 2, Symfony sau CakePHP. Toate aceste cadre au aranjamente pentru sesiuni sigure și module de securitate pentru a ajuta la procesul de conectare. De asemenea, dacă utilizați un cadru, probabil veți vedea că scrieți mai multe aplicații.
    Distribuiți pe rețelele sociale:

    înrudit
    Cum să înveți programareaCum să înveți programarea
    Cum să ștergeți un tweetCum să ștergeți un tweet
    Cum se anulează o încercare gratuită Amazon PremiumCum se anulează o încercare gratuită Amazon Premium
    Cum se închide sesiunea pe InstagramCum se închide sesiunea pe Instagram
    Modul de partajare a jocurilor pe PS3Modul de partajare a jocurilor pe PS3
    Cum se configurează cea de-a doua verificare de autentificare în YahooCum se configurează cea de-a doua verificare de autentificare în Yahoo
    Cum se configurează un sistem pentru a fi sigurCum se configurează un sistem pentru a fi sigur
    Cum să dezvoltați programe securizate pentru webCum să dezvoltați programe securizate pentru web
    Cum se dezvoltă software-ulCum se dezvoltă software-ul
    Cum să eliminați datele de pe site-uri web din Safari iOSCum să eliminați datele de pe site-uri web din Safari iOS
    » » Cum se creează un script de autentificare securizat în php și MySQL

    © 2011—2020 ertare.com