itholoinfo.com.com

Cum se creează un script de autentificare sigură în PHP și MySQL

Cu tot mai multe rapoarte de hackeri care reușesc să eludeze securitatea site-ului, dezvoltatorii caută forme mai eficiente de protecție. Dacă site-ul dvs. are un sistem de membru, acesta riscă să fie compromis, iar datele utilizatorului pot fi compromise. Acest articol vă va arăta cum oricine poate încerca să sporească securitatea de conectare folosind PHP. Codul nu este perfect, dar securitatea și criptarea sunt foarte complexe și sunt actualizate în mod constant. Prin urmare, nu putem garanta că acest domeniu de cunoștințe este explicat aici.

Dacă observați că am ratat subiecte importante, vă rugăm să ne contactați pentru a putea încerca întotdeauna să îmbunătățim articolul. Urmând sfaturile de mai jos, vă puteți apăra împotriva diferitelor tipuri de atacuri pe care le utilizează crackerii pentru a prelua controlul asupra conturilor utilizatorilor, pentru a șterge conturile sau pentru a modifica datele. Iată lista de posibile atacuri împotriva cărora ne putem apăra:

Abordarea este de a folosi o combinație de filtrare a datelor, criptografie și alte metode care fac viața băieților răi mult mai complicate.

Căutăm întotdeauna să îmbunătățim acest scenariu. Versiunea cea mai recentă a acestui cod este disponibilă la github. Pot exista unele diferențe între codul pe care îl descărcați și codul utilizat în acest articol. De asemenea, este important să știm că aspectul paginilor HTML nu a fost prioritatea noastră.

De asemenea, observați că nu închideți filele PHP pe fișierele care conțin numai cod PHP. Așteptăm cu nerăbdare majoritatea recomandărilor de formatare pentru codificare.

În sfârșit, trebuie să creați toate aplicațiile, altele decât fișierele HTML, în mai multe directoare din aplicația principală a directorului. Cea mai ușoară modalitate de a obține structura corectă a directoarelor este să descărcați ultimul cod urmând link-urile furnizate mai sus.

Simțiți-vă libertatea de a utiliza această aplicație ca bază pentru implementarea proprie, dar nu serveste ca un șablon perfect pentru codificare!



Materiale necesare

Deoarece vom folosi setul de PHP myqli_ * pentru a accesa baza de date mySQL, veți avea nevoie de următoarele versiuni PHP și MySQL:

  • * PHP versiunea 5.3 sau o versiune ulterioară
  • * MySQL versiunea 4.1.3 sau o versiune ulterioară

Veți avea nevoie, de asemenea, de un server configurat să utilizeze PHP pentru a găzdui paginile dvs. Cel mai probabil va fi același furnizor al găzduirii site-ului dvs. web, cu excepția cazului în care faceți propria dvs. găzduire de pagini web.

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

pași

Partea 1
Configurați-vă serverul

  1. 1
    Instalați un server de rețea, PHP și MySQL pe serverul dvs.

    Cele mai multe servicii de găzduire web în rețea au deja instalate PHP și MySQL. Trebuie doar să verificați ultimele versiuni pentru a funcționa instrucțiunile din acest articol. În cazul în care nu au chiar versiunile PHP5.3 și MySQL5, poate că este cazul să punem la îndoială siguranța pe care o oferă. Acest lucru se datorează faptului că actualizarea software-ului face parte din procesul de securitate.

    Dacă aveți pe server propriul server, cel mai bine este să instalați programul implicit folosit în mod normal pentru sistemul dvs. În general, dacă nu doriți să utilizați configurarea în scopuri de producție și lucrați cu Windows sau OS / X, instalarea XAMPP este o alegere excelentă. Obțineți versiunea corespunzătoare pentru sistemul dvs. de operare la linkul:

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

    Amintiți-vă că XAMPP nu ar trebui să fie niciodată folosit pentru a crea un mediu server de producție pentru dvs.

    Dacă utilizați Linux, utilizați managerul de pachete pentru a descărca și instala toate pachetele necesare. Unii distribuitori precum Ubuntu conțin toate aplicațiile necesare într-un singur loc. Doar utilizați un terminal Ubuntu și faceți următoarele:

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



    Chiar dacă instalați elementele necesare, este important să verificați dacă MySQL este configurat cu o parolă puternică de root.

Partea 2
Configurați baza de date MySQL

  1. 1
    Creați o bază de date MySQL.

    Conectați-vă la baza de date ca administrator (de obicei, utilizator rădăcină)

    În acest articol, vom crea o bază de date numită "secure_login".

    Iată cum se face în articol https://pt.itholo.ru/Instalar-o-phpMyAdmin-em-Seu-PC-do-Windows

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

    CREAȚI DATABASA `secure_login`-
    Notă: Unele servicii de găzduire a site-urilor web nu vă permit să creați o bază de date utilizând phpMyAdmin, Aflați cum să faceți acest lucru în cPanel.
  2. 2
    Creați un utilizator care are doar următoarele privilegii: SELECTARE, UPDATE și INSERT.

    Prin crearea unui utilizator cu privilegii limitate, un hacker nu a putut șterge nimic din baza de date, chiar dacă ar putea găsi o încălcare a securității. Folosind aceste privilegii, poți să faci aproape orice cu aplicația ta. Și dacă vă faceți griji că sunteți paranoic, creați un alt utilizator pentru fiecare rol.

    Rețineți că trebuie să fiți conectat la MySQL ca un utilizator cu privilegii suficiente (de exemplu, un utilizator root), în scopul de a crea un alt utilizator.

    Iată detaliile utilizatorului pe care l-am creat:
    • utilizator: "Sec_user"
    • parola: "EKcGZr59zAa2BEWU"

    Notă: Este recomandabil să schimbați parola dată mai sus când rulați propriul server. Când faceți acest lucru, asigurați-vă că modificați codul de mai jos și codul de conectare la baza de date PHP în aplicația care urmează să fie creată.

    Nu va trebui să vă amintiți această parolă, așa că faceți una cât mai complicată posibil. Consultați link-ul următor generator de parole: generator de parole aleatoare

    Mai jos este codul SQL pentru crearea bazei de date a utilizatorilor și modul de atribuire a permisiunilor pentru anumite proceduri. O alternativă este să efectuați această sarcină în baza de date a clientului GUI, cum ar fi phpmyadmin:

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


    Dacă doriți să ștergeți înregistrările de la oricare dintre tabelele din acest modul, adăugați DELETE în lista de privilegii sau pentru a crea un alt utilizator care are doar privilegiul DELETE, și numai tabelul care conține datele pe care doriți să-l ștergeți (dacă nu doriți să ștergeți datele ambele tabele). Nu trebuie să acordați privilegii DELETE pentru niciuna dintre sarcinile din acest script pe care le urmăriți ca exemplu.
  3. 3
    Creați un tabel în MySQL cu numele "membri".

    Codul de mai jos creează un tabel cu cinci câmpuri (id - nume, nume de utilizator - numele de utilizator, e-mail, parola - parola, sare - date aleatoare folosite pentru a spori securitatea și pentru a adapta parola). Utilizăm tipul de date CHAR pentru câmpurile a căror extensie cunoaștem, cum ar fi "parola" și "sare", care vor avea întotdeauna 128 de caractere. Când utilizați CHAR în acest proces, obțineți puterea de procesare:

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

    Puteți face acest lucru pe orice tip de client pe care îl doriți.
  4. 4
    Creați un tabel pentru a înregistra încercările de conectare.

    Vom folosi acest tabel pentru a înregistra încercările de conectare ale utilizatorilor. Aceasta este una dintre modalitățile de a împiedica atacurile mai violente:

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

  5. 5
    Creați un test secvențial în tabelul "membri".

    Este important să puteți testa scriptul de autentificare. Deci, iată un script pentru un utilizator al cărui date știți:
    • Nume utilizator: test_user
    • Adresa dvs. de email: [email protected]
    • parola: 6ZaxN2Vzm9NUJT2y

    Codul de care aveți nevoie pentru a vă conecta ca acest utilizator este după cum urmează:

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

Partea 3
Creați o pagină de conectare la bază de date

  1. 1
    Creați o pagină de setări globale

    Creați un folder numit "include" în directorul principal al aplicației și apoi creați un nou fișier PHP în acel director.
    Denumiți acest fișier ca psl-config.php. Într-un mediu de producție, puteți lăsa acest fișier și orice altele care sunt incluse mai târziu, în afara documentului rădăcină al serverului de rețea. Vă recomandăm cu insistență să faceți acest lucru, precum și să modificați includerea și să solicitați comenzi după cum este necesar, astfel încât aplicația să poată găsi fișierele de includere.

    Lăsând fișierele incluse în afara documentului rădăcină al serverului de rețea înseamnă că acestea nu pot fi găsite printr-o adresă URL. Prin urmare, dacă cineva uita de a pune „PHP“ extensie la sfârșitul anului sau de a crea probleme cu permisiunile de fișiere, acesta nu poate fi afișat ca text în fereastra browser-ului.

    Fișierul conține variabile globale de configurare. Informațiile, cum ar fi dacă cineva se poate înregistra, dacă conexiunea este sigură sau nu (HTTPS) și alte detalii despre baza de date pot fi lăsate aici ...

  2. 2
    Creați o pagină de conectare a bazei de date

    Acesta este codul PHP pe care îl vom folosi pentru a vă conecta la baza de date mySQL.
    Creați un nou fișier PHP numit db_connect.php în directorul de includere al aplicației și adăugați codul de mai jos. Puteți include fișierul pe orice pagină pe care doriți să o conectați la baza de date.

Partea 4
Creați funcții PHP

Aceste funcții vor face toată prelucrarea scriptului de autentificare. Adăugați toate funcțiile într-o pagină numită "functions.php" în directorul de includere al aplicației.

  1. 1
    Porniți o sesiune PHP sigură.
    Dacă într-adevăr sunt preocupați de securitate, este important să nu doar „session_start (),“ în partea de sus a fiecărei pagini în care doriți să utilizați sesiuni PHP (spun ca nu sunt renumite pentru a fi sigur). Să creăm o funcție numită "sec_session_start", care va începe în siguranță o sesiune php. Ar trebui să apelați această funcție în partea de sus a fiecărei pagini de la care doriți să accesați o variabilă de sesiune php.

    Această funcție face scriptul dvs. de conectare mult mai sigur. Împiedică buclele să acceseze ID-ul sesiunii cookie prin jаvascript (de exemplu, într-un atac XSS). Funcția "session_regenerate_id ()" preia ID-ul sesiunii pe fiecare pagină încărcată, ajutând la prevenirea furtului de sesiune. Notă: dacă utilizați HTTPS în aplicația dvs. de conectare, setați variabila "$ secure" la true. Într-un mediu de producție, este esențial să utilizați HTTPS.

    Creați un nou fișier numit functions.php în directorul de aplicații și adăugați următorul cod:
  2. 2
    Creați funcția de conectare.
    Această funcție va verifica dacă e-mailul și parola sunt compatibile cu ceea ce este în baza de date. Dacă da, se întoarce ca "adevărat". Adăugați această funcție în fișierul functions.php:
    ($ email, $ password, $ mysqli) {// Utilizarea definițiilor predefinite înseamnă că injectarea SQL (un tip de atac) nu este posibilă. în cazul în care ($ STMT = $ mysqli-> pregăti ( "SELECT id, nume de utilizator, parola, e-mail saltFROM membersWHERE = LIMIT 1?")) {$ stmt-> bind_param ( `s`, $ e-mail) - // liste „$ e-mail . „la parametrul $ stmt-> execute () - // execută sarcina set $ stmt-> store_result (.) - // obține variabile din rezultate. $ Stmt-> bind_result ($ user_id, $ username, $ DB_PASSWORD, $ sare) - $ stmt-> fetch () - // face hash parola cu o parolă $ sare excusivo = hash ( `SHA512`, $ parola. . $ sare) -dacă (stmt- $> num_rows == 1) {// dacă există utilizatorul, verificat dacă contul este blocat din cauza limitei // loginuri au fost depășite în cazul în care (checkbrute (user_id $, $ mysqli) == true) {// contul este blocat // Trimite un e-mail utilizatorului care contul este blocat returnează false (false) -} else {// Verificați dacă parola se potrivește cu înregistrarea în baza de date // parola utilizatorului este enviada.if ($ DB_PASSWORD == $ parola) {// parola este corectă! // Ia-string agent utilizator al utilizatorului. User_browser = $ $ _SERVER [ `HTTP_USER_AGENT`] - // securitate XSS imprimate ca valoarea $ user_id = preg_replace ( "/ [^ 0-9] + /" "" $ user_id) - $ _ SESSION [ `user_id`] user_id = $ - // protectie XSS imprimate ca valoare $ username = preg_replace ( "/ [^ a-zA-Z0-9 _ -] + /" "" $ username) - $ _ SESSION [ `username`] = $ username - $ _ SESSION [ `login_string`] = diez ( `SHA512`, $ parola $ user_browser.) - // Autentificare completat sucesso.return true-} else {// parola nu este corectă // înregistrată în această încercare baza de date $ = acum timp () - $ mysqli-> interogare ( "INSERT INTO login_attempts (user_id, timp) values ​​( `$ user_id`, `$ acum`)") - returnează fals}}} else {// Un astfel de utilizator nu există. Întoarcere falsă}}}

  3. 3
    Funcția Brute Force.
    Forțele violente sau forțele brute se întâmplă atunci când hackerii încearcă mii de parole diferite într-un singur cont, indiferent dacă sunt parole generate aleatoriu sau dintr-un dicționar. În scriptul nostru, dacă un utilizator nu reușește în încercarea de conectare de mai mult de 5 ori, contul acestuia va fi blocat.

    Atacurile de forță brute sunt dificil de prevenit. O formă de prevenire include utilizarea testului CAPTCHA, care blochează conturile de utilizator și adaugă o întârziere încercărilor de conectare eșuate, astfel încât utilizatorul să nu mai încerce din nou pentru următoarele 30 de secunde.

    Vă recomandăm cu insistență utilizarea CAPTCHA. Nu am implementat încă această funcție în codul exemplu, dar lucrăm să îl facem disponibil în curând. Pentru moment, utilizați SecureImage, unde nu este necesar să se înregistreze. Sau puteți folosi ceva mai cunoscut, cum ar fi reCAPTCHA de la Google.

    Indiferent de sistemul pe care vă decideți, vă sfătuim să afișați imaginea CAPTCHA după două încercări de conectare eșuate pentru a evita perturbarea inutilă a utilizatorului.

    Când se confruntă cu atacuri de forță brute, majoritatea dezvoltatorilor blochează adresa IP după o serie de încercări de conectare nereușite. Dar există o serie de instrumente care fac ca procesul de generare a atacurilor să fie automat așa - aceste instrumente pot trece printr-o serie de proxy-uri și chiar pot schimba IP ori de câte ori este nevoie. Prin blocarea tuturor acestor adrese IP, ați putea bloca și utilizatorii legitimi. În codul nostru, vom înregistra încercările eșuate și vom bloca utilizatorul după cinci încercări eșuate. Deci, utilizatorul va primi un e-mail către utilizator cu un link de resetare, dar nu am implementat încă acest cod în codul nostru. Iată un cod pentru funcția checkbrute () imediat ce este scris. Adăugați-l la codul functions.php:

    ($ user_id, $ mysqli) {// Înregistrează timpul curent $ now = time () - // Toate încercările de conectare sunt contorizate în ultimele 2 ore. $ valid_attempts = $ acum - (2 * 60 * 60) -if ($ stmt = $ mysqli-> prepare ("SELECT timeFROM login_attempts 
    UNDE user_id = și timpul> `valid_attempts $` „)) {$ stmt-> bind_param ( `i`, $ USER_ID) -. // Execută sarcina $ stmt- prestabilit> execute () - $ stmt-> store_result () - // Dacă nu a fost mai mult de 5 încercări nereușite de conectare în cazul în care ($ stmt-> num_rows> 5) {return true-} else {return}}} fals
  4. 4
    Verificați starea de conectare.
    Aceasta se face verificând variabilele sesiune "user_id" și "login_string". Variabila SESSION "login_string" are informații despre hash și adresa IP împreună cu parola. Utilizăm adresa IP și informațiile browserului, deoarece este foarte puțin probabil ca utilizatorul să schimbe adresa IP sau browserul în timpul sesiunii. Procedând astfel, preveniți un atac de atac asupra sesiunii (deturnarea sesiunii, literal). Adăugați această funcție în fișierul functions.php din directorul include în aplicația dvs.:



    Funcția login_check ($ mysqli) {// Verificați dacă toate sesiunile de variabile au fost stabilite în cazul în care (isset ($ _ SESSION [ `user_id`] $ _ SESSION [ `username`] $ _ SESSION [ `login_string`])) {$ USER_ID = $ _SESSION [ `user_id`] - $ login_string = $ _ SESSION [ `login_string`] - $ username = $ _SESSION [ `username`] -. // Ia șirul de utilizator $ user_browser = $ _SERVER [ `HTTP_USER_AGENT`] - if ($ stmt = $ mysqli-> pregăti ( "SELECT passwordFROM membersWHERE id =? LIMIT 1")) {// Atribuie $ user_id „la parametrul. $ Stmt-> bind_param (i, $ user_id) - $ stmt-> execute () - // Efectuați interogarea preparată stmt- $> store_result (.) - În cazul în care ($ stmt-> num_rows == 1) {/ / Dacă utilizatorul există, obțineți variabile din rezultat. $ Stmt-> bind_result ($ parola) - stmt- $> fetch () - $ login_check -dacă = hash (== $ $ login_check login_string) {// Online !!! ( `SHA512` $ $ user_browser parola.) întoarcere true-} else {// nu întoarcere autentificat}} fals else {// nu întoarcere autentificat}} fals else {// nu întoarcere autentificat}} fals else {// nu a fost autentificat fals retur }}
  5. 5
    Goliți URL-ul PHP_SELF
    Următoarea funcție șterge rezultatul variabilei server PHP_SELF.
    Este o modificare a funcției care are același nume utilizat de WordPress Content Management System:

    funcția esc_url ($ url) {if (`` == $ url) {retur $ url -} $ url = preg_replace (`| [^ a-z0-9- ~ + _. ($ `), $ url) - $ strip = array (`% 0d `,`% 0a `,`% 0D ` (Url = $ count) {$ url = str_replace ($ strip, ``, $ url, $ count) - url = str_replace (`- $ url - ($ url) - $ url = str_replace (`amp-,` # url) - $ url = htmlentities ($ url) Suntem interesați doar de link-uri similare de la $ _SERVER [`PHP_SELF`] return `` -} altceva {return $ url-}}


    Problema cu utilizarea unei variabile de server nefiltrate este aceea că poate fi utilizată într-un script script încrucișat. Majoritatea referințelor pe acest subiect spun că pur și simplu filtrați variabila folosind htmlentities (). Vestea proastă este că această măsură nu poate fi suficient de sigură chiar și cu toate măsurile de precauție conținute în această funcție.

    Altele vă vor instrui să lăsați goale acțiunea de alocare sau să o setați la nul. Dar făcând acest lucru, lăsați mediul vulnerabil la atac iframe clicjacking atac.

Partea 5
Crearea paginilor de procesare

  1. 1
    Creați pagina de procesare a conectării (process_login.php)

    Creați un fișier pentru procesarea datelor de conectare, numit process_login.php în directorul de includere al aplicației.
    Acesta a fost directorul ales pentru a nu lăsa urme în HTML.

    Vom folosi setul de funcții PHP mysqli_ * deoarece este cea mai actuală extensie a mysql.

  2. 2
    Creați un script de logout.

    Scriptul dvs. de logout ar trebui să înceapă sesiunea, să o distrugă și apoi să redirecționeze utilizatorul către o altă pagină. Notă: Este mai bine să adăugați o protecție CSRF în acest pas dacă cineva trimite o legătură ascunsă pe pagină. Pentru mai multe informații despre CSRF, vizitați site-ul Web Codarea groazei.

    Codul curent utilizat pentru a deconecta utilizatorul și care trebuie adăugat la un fișier numit logout.php în directorul aplicației include:

  3. 3
    Înregistrează pagina.

    Codul de înregistrare este inclus în două fișiere noi, unul numit register.php în directorul principal al aplicației și altul numit register.inc.php în directorul inclus. Ea face următoarele:
    • Obține și validează numele de utilizator dorit de utilizator.
    • Obține și validează e-mailul utilizatorului.
    • Obține și validează parola pe care utilizatorul dorește să o utilizeze.
    • Pune parola hash a parolei și o transmite pe pagina register.php (adică codul afișează parola pentru ea însăși)

    Cele mai multe validări se fac în jаvascript în versiunea clientului. Acest lucru se datorează faptului că utilizatorul nu are nicio motivație să treacă prin toate aceste verificări. De ce ar vrea un utilizator să creeze un cont mai puțin sigur decât cel normal? Vom discuta jаvascript în următorul subiect.

    Pentru moment, creați doar un fișier numit fișier register.php și includeți în el următorul cod:

    Intrare securizată: Formular de înregistrare

    Înregistrează-te cu noi

  4. Numele de utilizator trebuie să conțină numai cifre, litere mari și minuscule și subliniază ("_")
  5. E-mailurile trebuie să urmeze un format de e-mail valid.
  6. Parolele trebuie să aibă cel puțin 6 caractere.
  7. Parolele trebuie să conțină
    • Cel puțin o majusculă (A..Z)
    • Cel puțin o literă mică (a..z)
    • Cel puțin un număr (0 ... 9)
  8. Parola dvs. ar trebui să verifice exact
  9. Reveniți la pagina de conectare.



    Fișierul register.inc.php din directorul include include următorul cod:

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

    (parola) = {password_filename ()) {// Parola cu hash trebuie să aibă 128 de caractere. // Altfel se întâmplă ceva foarte ciudat. $ error_msg. = `

    Setarea nevalidă a parolei.

    „-} // numele de utilizator și parola Îmbătrânirea conferite partea cliente.// Nu trebuie să existe probleme în această etapă, deoarece nimeni nu câștigă // încalcă aceste regras.//$prep_stmt =„SELECT id de la membrii UNDE e-mail ? = LIMIT 1 „- $ sTMT = $ mysqli-> pregăti ($ prep_stmt) -dacă ($ sTMT) {$ stmt-> bind_param ( `s`, $ e-mail) - $ stmt-> execute () - $ stmt- > store_result () - if ($ stmt-> num_rows == 1) {// Un utilizator cu acest e-mail există deja $ error_msg. = `

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

    `-}} altceva {$ error_msg. =`

    Eroare de bază de date

    „-} // LISTA locurilor de muncă: // Trebuie să vină cu soluții pentru atunci când utilizatorul nu are dreptul de a // înregistra, verifica ce fel de utilizator încearcă să realizeze // operação.if (gol ($ ERROR_MSG)) {/ / Creați un aleatoare sare $ random_salt = diez ( `SHA512`, uniqid (openssl_random_pseudo_bytes (16), TRUE)) - // Crearea unei parole cu sare $ = parola hash ( `SHA512`, $ parola $ random_salt.) - // introduceți noul utilizator în baza de date în cazul în care ($ = $ insert_stmt mysqli-> pregăti ( "INSERT INTO membri (nume de utilizator, e-mail, parola, sare) values ​​(?,?,?,?)")) {$ insert_stmt-> bind_param ($ username, $ e-mail, parola $, $ random_salt `SSS`) - // Rulați sarcina de pre-estabelecida.if ($ insert_stmt-> execute ()) {header (“Locul de amplasare: ../error. php? err = Eroare de înregistrare: INSERT `) -}} header (` Locație: ./register_success.php`)-}}


    Dacă nu există date POST transmise în formular, apare formularul de înregistrări. Butonul "trimite" cheama funcția jаvascript numită regformhash (). Ea efectuează verificările de validare necesare și depune formularul. Funcțiile jаvascript vor fi discutate în subiectul următor.

    Dacă există date POST, se fac verificări pe partea de server pentru a le curăța și a le valida. Refuz că aceste verificări nu sunt complete atunci când sunt scrise. Unele probleme sunt menționate în comentariile din dosar. Pentru moment, am verificat doar că adresa de e-mail urmărește formatul corect, că parola hashed are un număr acceptabil de cifre și că utilizatorul nu încearcă să înregistreze un e-mail care a fost deja înregistrat.

    Dacă totul trece prin verificare, noul utilizator este înregistrat la completarea unui nou registru în tabelul membrilor site-ului.

Partea 6
Creați fișiere jаvascript

  1. 1
    Creați un fișier sha512.js.

    Acest fișier este o implementare jаvascript a algoritmului de ștergere sha512. Vom folosi funcția hash, astfel încât parolele noastre să nu fie trimise sub formă de text simplu.

    Fișierul poate fi descărcat aici: pajhome.org.uk

    (Este, de asemenea, salvat în depozitul github)

    Salvați o copie a acestui fișier într-un director numit "js", provenind din directorul principal al aplicației.

  2. 2
    Creați fișierul forms.js.
    Acest fișier va gestiona hash-ul parolelor pentru orice formular. (formhash ()) și înregistrare (regformhash ()):

    funcția formhash (formă, parolă) {// Creați un element de intrare nou, care va fi câmpul pentru parola hashed. var p = document.createElement ("input") - // Adăugați un element nou în formularul nostru. form.appendChild (p) -p.name = "p" -p.type = "ascuns" -p.value = hex_sha512 (password.value) - // Aveți grijă să nu lăsați parola în text simplu nu este trimis. password.value = "" - // În cele din urmă, 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 }} - return false -} // Verificați numele de utilizator = / ^ w + $ / - în cazul în care (re.test (form.username.value)) {alert ( "Numele de utilizator trebuie să conțină litere, cifre și numai subliniere Vă rugăm să încercați din nou.") - form.username.focus () - return false -} / / verificați dacă parola este suficient de lung (cel puțin 6 caractere) // verificarea este duplicat de mai jos, dar de îngrijire suplimentară este de a oferi orientări mai specifice usuárioif // (password.value.length < 6) {alert(`Passwords must be at least 6 characters long. Please try again`)-form.password.focus()-return false-}// Pelo menos um número, uma letra minúscula e outra maiúscula // Pelo menos 6 caracteres var re = /(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{6,}/-if (!re.test(password.value)) {alert(`Passwords must contain at least one number, one lowercase and one uppercase letter. Please try again`)-return false-}// Verificar se a senha e a confirmação são as mesmasif (password.value != conf.value) {alert(`Your password and confirmation do not match. Please try again`)-form.password.focus()-return false-}// Crie um novo elemento de input, o qual será o campo para a senha com hash. var p = document.createElement("input")-// Adicione o novo elemento ao nosso formulário. form.appendChild(p)-p.name = "p"-p.type = "hidden"-p.value = hex_sha512(password.value)-// Cuidado para não deixar que a senha em texto simples não seja enviada. password.value = ""-conf.value = ""-// Finalizando, envie o formulário. form.submit()-return true-}

    În ambele cazuri, jаvascript face hash-ul parolei și îl transmite prin datele POST atunci când creează și populează un câmp ascuns.

Partea 7
Creați pagini HTML

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

    Acesta este un formular HTML cu două câmpuri de text, numite "email" și "parola". jаvascriptul va genera apoi hash-ul parolei și va trimite serverul "e-mail" și "p" (parola hash). Ar trebui să creați acest fișier în directorul principal al aplicației.

    Când vă conectați, este mai bine să folosiți ceva care nu este public. Pentru acest ghid, folosim e-mailul ca login - numele de utilizator poate fi folosit mai târziu pentru a identifica utilizatorul. Dacă e-mailul nu apare pe niciuna dintre paginile unei aplicații mai mari, va fi mai mult un impediment pentru cei care încearcă să creeze un cont.

    Notă: Deși am criptat parola, astfel încât să nu fie trimisă sub formă de text simplu, este esențial să urmați protocolul HTTPS (TLS / SSL) atunci când trimiteți parole către un sistem de producție. Vă atragem atenția asupra faptului că hash-ul din parola nu este suficient de sigur. Un atac de tip man-in-the-middle poate fi apelat pentru a citi hash-ul trimis și apoi utilizați acele informații pentru a vă conecta.

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

    „-}>?

    Dacă nu aveți autentificare, vă rog registru

    Dacă ați terminat, vă rog ieșiți.

    Sunteți conectat (ă) în prezent


  2. 2
    Creați o pagină numită register_success.php

    Creați o nouă pagină PHP în rețea numită register_success.php în aplicația principală a directorului.
    Aceasta este pagina la care utilizatorul este redirecționat după înregistrarea cu succes. Dar puteți personaliza această pagină așa cum doriți, redirecționați utilizatorul către o altă pagină sau chiar opriți redirecționarea acestuia. Este alegerea ta. Pagina trebuie să fie în directorul principal al aplicației. Actuala pagină register_success.php pe care o scriem arată astfel:

    Secure Login: Succesul înregistrării

    Înregistrarea a reușit!

    Acum te poți întoarce la pagina de conectare și conectați-vă


  3. 3
    Creați o pagină de eroare

    Creați o nouă pagină HTML în directorul principal al aplicației.
    Denumiți-l ca error.php. Aceasta este pagina către care utilizatorii vor fi redirecționați dacă apare o eroare în timpul procesului de conectare sau de înregistrare sau când încearcă să stabilească o sesiune sigură. Codul de mai jos oferă o pagină de eroare destul de fundamentală. Veți avea nevoie de ceva mai sofisticat. Este important ca intrarea de pe pagină să fie filtrată pentru a proteja împotriva atacurilor XSS. Codul pentru pagina de probă este:

    Intrare securizată: Eroare

    A fost o problemă


Partea 8
Protejarea paginilor

  1. 1
    Script de protecție a paginilor.

    Una dintre cele mai frecvente probleme cu sistemele de autentificare este că dezvoltatorul uită să verifice dacă utilizatorul este conectat. Este foarte important să utilizați codul de mai jos pe fiecare pagină protejată pentru a vedea dacă utilizatorul este conectat. Utilizați următoarea funcție:

    // Adăugați aici funcții și conexiuni de bază de date. Vezi 3.1. sec_session_start () - if (login_check ($ mysqli) == true) {// Adăugați conținutul paginii dvs. protejate aici! } altceva {echo `Nu sunteți autorizat să accesați această pagină, vă rugăm să vă autentificați.`-}

    Am inclus o pagină protejată pentru a servi drept exemplu. Creați un fișier numit protected_page.php în directorul principal al aplicației. Fișierul ar trebui să conțină ceva de genul:

    Intrare securizată: Pagina protejatăbun venit 

    Aceasta este o pagină protejată pentru a servi drept exemplu. Pentru a avea acces, utilizatorii trebuie să fie conectați. La un moment dat, vom verifica și rolul pe care îl joacă utilizatorul, astfel încât să putem determina tipul de utilizator care este autorizat să acceseze pagina.

    Înapoi la pagina de conectare

    Nu aveți permisiunea de a accesa această pagină. vă rog autentificare.


    Aplicația noastră redirecționează spre această pagină după autentificarea finalizată cu succes. Implementarea dvs. nu este necesară pentru a face acest lucru.

sfaturi

  • Cu câteva modificări, aceste scripturi de mostre pot fi modificate pentru a lucra cu alte sisteme SQL, cum ar fi SQLite sau PostgreeSQL.
  • Dacă doriți să utilizați un algoritm de hash, altul decât sha512, încercați Whirlpool. Evitați Gost, sha1 (dacă nu sunt întăriți complet cu sare și iterații multiple) și, așa cum am menționat mai devreme, md5. Încurajați utilizatorii să creeze parole puternice, unice care conțin atât litere mari, cât și litere mici, precum și numere și simboluri. De asemenea, gândiți-vă dacă utilizatorii dvs. pot crea o generare de bani de conectare separată de numele de utilizator pentru a spori securitatea.
  • Utilizați codurile HTML și CSS pentru a formata formularul de conectare și a reveni la pagini în funcție de preferințele dvs.
  • Stați departe de funcția md5 () în scripturile de conectare. Algoritmul hash al md5 este în prezent considerat ca fiind nesigur nesigur.

avertismente

  • Atât pagina de conectare cât și pagina de înregistrare trebuie să utilizeze HTTPS. Scripturile din acest articol nu vă obligă să faceți acest lucru și este mai ușor să nu mai utilizați acest lucru. Dar rețineți că aceste scripturi nu ar trebui să fie utilizate într-un mediu de producție fără a utiliza HTTPS.
  • Asigurați-vă că scriptul PHP este invizibil pentru utilizator, care poate sfârși prin a vedea scriptul datorită unei instalări incorecte a serverului. Este posibil ca utilizatorii să adune informații despre baza lor de date ca nume și parole în cazul în care codul lor PHP este vizibil. În mod ideal, orice script care este inclus în alte script-uri sau pagini este localizat într-un director în afara sistemului de fișiere al serverului și folosit ca referință utilizând o cale relativă, cum ar fi "../../includes/myscript .inc.php ".
  • Nimic nu este 100% sigur. Amintiți-vă să fiți la curent cu cele mai recente știri de securitate pentru a continua îmbunătățirea securității scrităților.
  • Forța Anti Brute a acestui script, care blochează un cont de utilizator, poate fi ușor utilizată incorect. Vă recomandăm să folosiți o tehnică anti-brute cum ar fi CAPTCHA.
  • Puteți găsi o soluție mai bună decât acest articol utilizând un cadru cum ar fi Zend 2, Symfony sau CakePHP. Toate acestea oferă structură pentru sesiuni și module securizate pentru a ajuta procesul de conectare. Rețineți, de asemenea, că puteți scrie aplicații mai bune dacă utilizați un cadru.
  • Vă sfătuim să utilizați CAPTCHA pe pagina de conectare pentru a face dificile atacurile Brute Force și DoS. Vă recomandăm ca CAPTCHA să apară în formular după două încercări eșuate. Acest lucru nu este încă implementat în codul nostru.
Distribuiți pe rețelele sociale:

înrudit
Cum de a crea o honeypotCum de a crea o honeypot
Cum să hack un site webCum să hack un site web
Cum să adăugați Google Analytics pe site-ul dvs.Cum să adăugați Google Analytics pe site-ul dvs.
Cum de a schimba parolele contului de utilizator fără a cunoaște acelașiCum de a schimba parolele contului de utilizator fără a cunoaște același
Cum se configurează o rețea privată virtuală (VPN)Cum se configurează o rețea privată virtuală (VPN)
Cum se creează un e-mail de unică folosințăCum se creează un e-mail de unică folosință
Cum să creați o conectare SSL pentru site-ul dvs. WebCum să creați o conectare SSL pentru site-ul dvs. Web
Cum se creează un site în JoomlaCum se creează un site în Joomla
Cum se creează un virusCum se creează un virus
Cum să părăsiți rețeaua wireless invizibilăCum să părăsiți rețeaua wireless invizibilă
» » Cum se creează un script de autentificare sigură în PHP și MySQL
© 2021 itholoinfo.com.com