Creați un script de autentificare securizat cu PHP și MySQL
Veți auzi din ce în ce mai multe despre codurile sparte și, prin urmare, dezvoltatorii caută cele mai bune modalități de a-și asigura site-urile web. Dacă aveți un sistem de membru pe site-ul dvs., atunci oamenii ar putea încerca să intre în pauză, lăsând datele utilizatorilor dvs. neprotejate. Acest tutorial vă va arăta o modalitate de a crea o autentificare sigură cu PHP. Codul este la fel de bun ca și noi, dar securitatea și în special criptarea sunt probleme complexe și există întotdeauna schimbări și nu putem spune că dominăm complet întreaga zonă. Deci, poate că niște trucuri nu sunt incluse în codul nostru. Dacă da, anunțați-ne și vom încerca să includem îmbunătățiri în codul nostru. În urma acestui ghid vă veți ajuta să vă protejați de multe tipuri de atacuri pe care atacatorii le pot folosi pentru a obține controlul asupra conturilor de utilizator, pentru a șterge conturile și / sau pentru a schimba datele. Iată o listă a tipurilor de atacuri pe care acest ghid va încerca să vă protejeze de:
conținut
- Ce ai nevoie
- Metodă
- Partea 1configurarea serverului
- Partea 2configurați baza de date mysql
- Partea 3creați o pagină de conectare a bazei de date
- Partea 4creați funcțiile php
- Partea 5creați pagini de procesare
- Partea 6creați fișierele jаvascript
- Partea 7creați paginile html
- Partea 8protejați paginile
- Sfaturi
- Avertismente
- injectii SQL
- Sesiunea deturnare (preluarea unei sesiuni)
- Interceptarea rețelei
- Scrierea script-urilor
- Atacurile brute-force
Abordarea este o combinație de filtrare a datelor, criptare și alte metode pentru a face viața băieților răi un pic mai greu. Încercăm constant să îmbunătățim acest scenariu. ultima versiune a codului poate de la github fi descărcat. Prin urmare, pot exista diferențe față de codul citat aici și versiunea pe care ați descărcat-o. De asemenea, trebuie să știți că nu am încercat în nici un fel să facem ieșirea HTML a acestui program să arate destul. S-ar putea să fi observat că nu închidem etichetele PHP în fișiere care conțin doar cod PHP. Acest lucru este recomandat în multe reguli de formatare a codurilor. Multe fișiere non-HTML trebuie să fie scrise într-o varietate de directoare sub directorul rădăcină al aplicației. Cea mai ușoară modalitate de a crea structura corectă a directoarelor este să descărcați ultimul cod de la unul dintre legăturile de mai sus. Utilizați această aplicație ca bază pentru implementarea proprie, dar nu o utilizați ca exemplu de programare bună!
Ce ai nevoie
Deoarece folosim clasele mysqli_ * PHP pentru a accesa baza de date MySQL, aveți nevoie de următoarele versiuni de PHP și MySQL:
- Versiunea PHP 5.3 sau o versiune ulterioară
- Versiunea MySQL 4.1.3 sau mai nouă
Desigur, aveți nevoie și de un server web capabil de PHP și pe care sunt localizate paginile dvs. Acesta este cel mai probabil serverul web al furnizorului dvs., cu excepția cazului în care executați propriul server.
Pentru a verifica versiunile de PHP și MySQL pe serverul dvs., utilizați phpinfo () --Funcția.
metodă
Partea 1
Configurarea serverului
Majoritatea serviciilor de gazduire web au deja instalate PHP si MySQL. Tot ce trebuie să faceți este să verificați dacă versiunile de PHP și MySQL sunt suficient de actualizate pentru ca acest tutorial să funcționeze. Dacă nu aveți cel puțin PHP 5.3 și MySQL 5, atunci probabil că doriți să întrebați furnizorul dvs. câteva întrebări despre atitudinea sa față de securitatea datelor oricum. Păstrarea actualizării software-ului dvs. face parte din siguranță.
Dacă aveți propriul server sau computer, atunci ar trebui să instalați software-ul necesar ca normal în sistemul dvs. În general, dacă nu aveți nevoie de această facilitate pentru utilizarea continuă (comercială) și lucrați sub Windows sau OS / X, atunci este mai bine să instalați un stack XAMPP. Obțineți versiunea potrivită pentru sistemul dvs. de operare de la:
https://apachefriends.org/en/xampp.html
Rețineți însă că în nici un caz nu ar trebui să utilizați XAMPP pentru a crea un server pentru utilizarea continuă (comercială).
Utilizați managerul de pachete sub Linux pentru a descărca și instala pachetele necesare. Unele distribuții, cum ar fi Ubuntu, au împachetat toate programele necesare într-un singur pachet. Introduceți următoarele într-un terminal din Ubuntu:
sudo apt-get instalați lamp-server ^ phpmyadmin
Cu toate acestea, instalați componentele de care aveți nevoie, asigurați-vă că configurați MySQL cu o parolă de root sigură.
Partea 2
Configurați baza de date MySQL
Înregistrați-vă în baza de date ca administrator (de obicei ca root).
În acest tutorial vom crea o bază de date numită "secure_login".
comparații [[1]].
Puteți folosi codul de mai jos sau faceți unul corespunzător din phpMyAdmin / programul MySQL GUI preferat dacă doriți:
CREAȚI DATABASA `secure_login`
Dacă creați un utilizator cu drepturi limitate, aceasta înseamnă că, chiar dacă cineva a intrat, hackerul nu poate șterge nimic sau nu poate elimina tabelele din baza de date. Dacă aveți aceste drepturi, puteți face în continuare tot ce doriți să faceți în această aplicație. Dacă sunteți foarte paranoic, puteți crea, de asemenea, un alt utilizator pentru fiecare caracteristică.
Desigur, ca utilizator cu drepturi suficiente, trebuie să fiți conectat la MySQL pentru a crea un utilizator. Acest lucru se face, de obicei, ca rădăcină.
Iată detaliile utilizatorilor creați:
Notă: este o idee bună să modificați parola de mai sus dacă o rulați pe propriul server. Asigurați-vă că personalizați și codul de mai jos și codul de conectare a bazei de date PHP în aplicație.
Nu uitați că nu trebuie să fie o parolă pe care să vă puteți aminti, astfel încât să o puteți face cât mai complicată posibil. Există unul aici Generator de parole pentru parole aleatoare.
Mai jos este codul SQL pentru a crea utilizatorul bazei de date și să îi dea drepturile necesare. Puteți, de asemenea, să o faceți într-un program de bază de date GUI, cum ar fi phpmyadmin dacă doriți:
CREATE USER `sec_user` @ `localhost` IDENTIFICAT DE `eKcGZr59zAa2BEWU`-GRANT SELECT, INSERT, UPDATE ON `secure_login`. * LA` sec_user `@` localhost`-
Dacă simțiți că doriți să ștergeți intrările din tabelele din acest modul, atunci se poate șterge la lista de drepturi pentru a adăuga sau crea un utilizator nou cu ȘTERGE numai privilegii și numai pentru masa din care doriți să ștergeți intrările, dacă nu doriți să ștergeți din ambele. Pentru acest exemplu de script, nu aveți nevoie de privilegii DELETE.
Codul de mai jos creează un tabel cu cinci câmpuri (id, nume de utilizator, e-mail, parolă, sare). Utilizăm tipul de date CHAR pentru câmpurile în care știm deja lungimea, de exemplu câmpurile "parola" și "sare" au întotdeauna 128 de caractere. Acest tip de date economisește performanța procesorului aici:
CREATE TABLE `secure_login`.`members` (` id` INT PRIMARĂ KEY`AUTO_INCREMENT NOT NULL, `username` VARCHAR (30) NOT NULL, email`` VARCHAR (50) NOT NULL,` CHAR password` (128) NOT NULL, `sare` CHAR (128) NU NULL) ENGINE = InnoDB
Așa cum am spus, puteți să o faceți cu orice software.
Vom folosi acest tabel pentru a salva încercările de conectare pentru un utilizator. Acesta este un fel în care facem mai greu atacurile de forță brute:
CREATE TABLE `secure_login`.`login_attempts` (` user_id` INT (11) NOT NULL, `Time` VARCHAR (30) NOT NULL) ENGINE = `InnoDB
Este important să puteți testa scriptul de autentificare. Iată un script pentru a crea un utilizator cu detalii cunoscute:
Codul de care aveți nevoie pentru a vă conecta ca acest utilizator este:
INSERT INTO `VALORI secure_login`.`members` (1, `test_user`, `[email protected]`, `00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc`, `f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef`) -
Partea 3
Creați o pagină de conectare a bazei de date
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. Se numește psl-config.php. Într-un mediu de utilizare persistentă, ar trebui să salvați acest fișier, iar celălalt să includeți fișiere în afara directorului rădăcină pentru documente. Dacă faceți acest lucru (și îl recomandăm cu tărie), va trebui să ajustați declarațiile dvs. de includere sau de solicitare pentru a permite aplicației să găsească fișierele de includere.
Dacă le salvați în afara directorului rădăcină pentru documente, atunci fișierul dvs. nu poate fi găsit prin intermediul unei adrese URL. Dacă cineva a uitat accidental extensia "php" sau a modificat permisiunile fișierului, fișierul nu va fi afișat ca text în fereastra browserului.
Fișierul conține variabile globale de configurare, lucruri precum dacă cineva se poate conecta, dacă este o conexiune securizată (HTTPS) și altele. Detalii despre baza de date pot fi găsite și aici ...
Php / *** Acestea sunt informațiile de conectare pentru baza de date * / define ( "gazdă", "localhost") - // gazdă cu care va conectati willst.define ( "USER", "sec_user") - // Numele de utilizator al bazei de date. define ("PASSWORD", "4Fa98xkHVd2XmnfK") - // Parola bazei de date. define ( "DATABASE", "secure_login") - // Datenbankname.define ( "CAN_REGISTER", "orice") - define ( "DEFAULT_ROLE", "membru") - definește ( "SECURIZAT", FALSE) - // NUMAI PENTRU DEZVOLTARE !!
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 db_connect.php în directorul inclus al aplicației și inserați codul următor. Apoi, puteți lipi fișierul oriunde doriți să vă conectați la baza de date.
phpinclude_once `psl-config.php`- // Din moment ce functions.php nu este inclus $ mysqli = new mysqli (HOST, USER, PASSWORD, DATABASE)
Partea 4
Creați funcțiile PHP
Aceste funcții se ocupă de procesarea scriptului de autentificare. Adăugați toate funcțiile unei pagini functions.php în directorul inclus al aplicației.
Sesiunile PHP sunt cunoscute ca fiind nesigure, deci este important să nu introduceți doar "session_start () ;" în partea de sus a fiecărei pagini pentru care doriți să utilizați sesiuni PHP. Vom scrie o funcție "sec_session_start ()" care începe în siguranță o sesiune PHP. Ar trebui să numiți această funcție în partea de sus a fiecărei pagini în care doriți să accesați o variabilă de sesiune PHP. Dacă sunteți îngrijorat de securitatea și confidențialitatea cookie-urilor dvs., consultați acest articol: [[3]].
Această caracteristică vă face scriptul de conectare mult mai sigur. Împiedică atacatorii să acceseze cookie-ul pentru sesiuni folosind jаvascript (de exemplu, într-un atac XSS). De asemenea, funcția "session_regenerate_id ()", care creează ID-ul sesiunii de fiecare dată când reîncărcați, ajută la prevenirea preluării unei sesiuni. Notă: dacă utilizați HTTPS în aplicația dvs. de conectare, setați variabila securizată $ la true. Într-un mediu de utilizare permanent, este foarte important să utilizați HTTPS.
Creați un nou fișier functions.php în directorul inclus al aplicației dvs. și adăugați următorul cod:
Phpinclude_once `PSL-config.php`-funcția sec_session_start () {$ session_name =` sec_session_id`- // ierti un nume de sesiune de $ = SIGURĂ securizat - // Acest lucru previne jаvascript poate accesa ID-ul sesiunii de $ HttpOnly =. adevărat - // Forțează cookie-uri numai pentru sesiune benutzen.if (ini_set ( `session.use_only_cookies`, 1) === FALSE) {header ( „Locul de amplasare: ../error.php?err=Could nu iniția o sesiune în condiții de siguranță (ini_set) ") - exit () -} // adu parametrii cookie-urilor $ cookieParams = session_get_cookie_params (.) - session_set_cookie_params ($ cookieParams [" durata de viață "], $ cookieParams [" cale "], $ cookieParams [" domeniu „] , $ sigure, $ HttpOnly) - session_name // Setați numele sesiunii la -session_start sus angegebenem.session_name ($) () - // Porneste session_regenerate_id PHP sesiune () - // Reactualizează sesiune, șterge vechi. }
Această funcție compară adresa de e-mail și parola cu baza de date. Se întoarce adevărat dacă există o intrare corespunzătoare. Adăugați această funcție în fișierul functions.php:
conectare funcția ($ e-mail, parola $, $ mysqli) {// împiedica utilizarea declarațiilor SQL pregătite Injektion.if STMT ($ = $ mysqli-> pregăti ( „SELECT id, nume de utilizator, parola, sare de membru în cazul în care e-mail =? LIMIT 1 ")) {$ stmt-> bind_param ( `s`, $ e-mail) - // Bind" $ e-mail „la parametrul $ stmt-> execute () - .. // executare interogare preparat de la $ stmt-> store_result ( ) -. // fetch variabile de la $ rezultat stmt-> bind_result (user_id $, $ username, $ DB_PASSWORD, $ sare) - $ stmt-> fetch () - // hash parola cu sare unica $ = parola hash. ( „SHA512“, $ parola. $ sare) -dacă ($ stmt-> num_rows == 1) {// Dacă există utilizatorul, se verifică dacă contul este blocat // (prea multe încercări de logare dacă verifica bruta ($ user_id, $ mysqli) == true) {// cont este blocat // Trimite e-mail la utilizatori care au blocat contul istreturn fALSE} else {// Verificați dacă parola în baza de date cu / / User specified matches.if ($ db_password == $ password) {// parola este corectă! string user-agent al utilizatorului $ user_browser = $ _ SERVER [ `HTTP_USER_AGENT`] -. // XSS protecție, deoarece în cele din urmă am valoare imprimată user_id = preg_replace $ ( "/ [^ 0-9] + /", "", $ user_id) - $ _ SESSION [ `user_id`] = $ user_id - // protectie XSS, deoarece în cele din urmă am valoare tipărite $ username = preg_replace ( "/ [^ a-zA-Z0-9 _ -] + /" "", $ username) - $ _ SESSION [ `username`] = $ username - $ _ SESSION [ `login_string`] = diez ( `SHA512`, $ parola. $ User_browser) - // Autentificare erfolgreich.return true-} else {// parola este incorectă // Testul este stocat în baza de date $ acum = timpul () - $ mysqli-> interogare ( „INSERT INTO login_attempts (USER_ID, timp) VALORI ( `$ user_id`, `$ acum`) „) - întoarce FALSE}}} else {// nu există FALSE Benutzer.return}}}
Un atac de forță brute înseamnă că cineva încearcă tot felul de parole, fie generate aleator, fie dintr-un dicționar. În scriptul nostru, un cont este blocat dacă au existat cinci încercări de conectare eșuate.
Atacurile de forță brute sunt greu de prevenit. Câteva modalități pe care le putem preveni este utilizarea unui test CAPTCHA pentru blocarea conturilor de utilizator și instalarea unei întârzieri în timp după încercările de conectare nereușite, astfel încât utilizatorul să nu poată începe următoarea încercare după 30 de secunde.
Vă recomandăm să utilizați CAPTCHA. Deoarece nu am implementat-o încă în codul nostru de probă (dar sperăm că putem face acest lucru în curând), puteți Imagine securizată utilizați, deoarece nu trebuie să vă înscrieți. Puteți desena ceva mai familiar, cum ar fi reCAPTCHA de la Google.
Indiferent de sistemul pe care îl alegeți, vă sugerăm să afișați imaginea CAPTCHA după două încercări de conectare nereușite, pentru a nu provoca disconfort inutil utilizatorului.
Într-un atac de forță brute, majoritatea dezvoltatorilor blochează pur și simplu adresa IP după un anumit număr de încercări de conectare nereușite. Dar există multe instrumente care automatizează astfel de atacuri și pot folosi proxy-uri diferite și chiar modifică IP-ul la fiecare încercare. Dacă blocați toate aceste adrese IP, puteți bloca utilizatorii reali. În codul nostru, stocăm încercări de conectare eșuate și blocăm contul de utilizator după cinci încercări de conectare nereușite. Acest lucru ar trebui să declanșeze și trimiterea unui mesaj de poștă electronică care va da utilizatorului o legătură la resetare, dar nu este încă implementată. Iată codul pentru funcția checkbrute () atunci când vă conectați. Adăugați-le la funcțiile.php:
Verificarea funcțională brută ($ user_id, $ mysqli) {// obține curent = $ acum timestamp-ul de timp () - // Toate incercarile de conectare din ultimele două ore sunt numărate $ valid_attempts = $ acum -. (2 * 60 * 60) - dacă ($ stmt = $ mysqli-> prepare ("SELECT timeFROM login_attempts
UNDE user_id = AND timp> `valid_attempts $` `)) {$ stmt-> bind_param ( `i`, $ user_id) - store_result $ stmt-> - // Executa interogarea preparată de la $ stmt-> execute (). () - // Dacă ar fi fost mai mult de cinci încercări nereușite în cazul în care ($ stmt-> num_rows> 5) {return true-} else {return FALSE}}}
Facem acest lucru verificând variabila SESSION "user_id" și "login_string". Variabila SESSION "login_string" conține informațiile de browser ale browserului cu parola. Utilizăm informațiile din browser deoarece este foarte puțin probabil ca utilizatorul să schimbe browserele în mijlocul sesiunii. Acest lucru vă ajută să împiedicați preluarea sesiunilor. Adăugați funcția în fișierul functions.php din folderul aplicației dvs. include:
Funcția login_check ($ mysqli) {// Verificați dacă sunt setate toate variabilele de sesiune dacă (isset ($ _ SESSION [ `user_id`], $ _ SESSION [ `username`], $ _ SESSION [ `login_string`])) {$ USER_ID = $ _SESSION [ `user_id`] - $ login_string = $ _ SESSION [ `login_string`] - $ username = $ _ SESSION [ `username`] - // obține șirul user-agent al utilizatorului $ user_browser = $ _ SERVER [ „HTTP_USER_AGENT. „] -dacă ($ stmt = $ mysqli-> pregăti ( "SELECT parola de membru unde id =? LIMIT 1")) {// Bind "$ user_id" la parametrul. $ Stmt-> bind_param ( `i`, $ user_id) - $ stmt-> execute (). - // Execută pregătit interogare $ stmt-> store_result () - if ($ stmt-> num_rows == 1) {/ / Dacă există utilizatorul, gaura variabile de $ rezultat stmt-> bind_result ($ parola) -. $ stmt-> fetch () - (. `SHA512`, $ parola $ user_browser) $ login_check = -dacă hash ($ login_check == login_string) {// logat !!!! reveni true-} else {// Nu esti logat return false}} else {// Nu esti logat return false}} else {// Nu esti logat return false}} else {// Nu esti logat return false}}
Această funcție curăță ieșirea variabilei server PHP_SELF. Este o modificare a unei funcții cu același nume utilizat de WordPress Content Management System:
Funcția esc_url ($ url) {if ( `` == $ url) {întoarcere $ url -} $ url = preg_replace ( „| [^ o-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, $ count) -} $ url = str_replace (` - // ` `: //`, $ url) - $ url = htmlentities ($ url) - $ url = str_replace (` amp `` `$ url) - $ url = str_replace ( "`" ` # 039- `$ url) -dacă ($ url [0] ==!` / `) {// Ne dorim doar link-uri relative de la $ _SERVER [` PHP_SELF `] întoarcere` „-} else {return $ url- }}
Dacă utilizați variabila de server nefiltrate, atunci aceasta poate fi utilizată într-un atac scripting de tip cross-site. Majoritatea surselor spun doar că ar trebui să fie filtrate cu htmlentities (), dar asta nu pare să fie suficient, deci hai să ne jucăm în siguranță.
Uneori este sugerat să lăsați atributul de acțiune în formularul gol sau să îl setați la un șir nul. Dar asta lasă forma deschisă pentru tine iframe atac clickjacking.
Partea 5
Creați pagini de procesare
Creați un fișier care procesează datele de conectare, numite process_login.php în directorul inclus al aplicației. Acesta aparține acestui director deoarece nu conține marcaj HTML.
Folosim funcțiile mysqli_ * PHP deoarece acestea sunt una dintre cele mai noi extensii MySQL.
Phpinclude_once `db_connect.php`-include_once` functions.php`-sec_session_start () - // Funcția noastră de casă în condiții de siguranță într-o sesiune de starten.if PHP (isset ($ _ POST [ `email`], $ _POST [ „p `])) {$ email = $ _POST [` email `] - $ parola = $ _POST [` p „] - // trunchiată Passwort.if (conectare ($ e-mail, parola $, $ mysqli) == true) {// Autentificare header de succes ( `Locul de amplasare: ../protected_page.php`)-} else {// header Intrare a eșuat (` Locația: ../index.php?error=1`)-}} else {// Variabilele POST corecte nu au fost trimise la această pagină. ecou "Cerere nevalidă"
Scriptul de logout trebuie să înceapă sesiunea, să o distrugă și apoi să o trimită undeva. Notă: poate fi bine să adăugați protecție CSRF în cazul în care cineva vă trimite un link ascuns în această pagină. Mai multe informații despre CSRF pot fi găsite la Codificarea groazei.
Codul curent înregistrează utilizatorul și trebuie să-l adăugați la un fișier logout.php din directorul inclus:
Phpinclude_once „include / functions.php`-sec_session_start () - // Setați toate valorile sesiunii înapoi $ _SESSION = array () - // fetch parametrii de sesiune $ params = session_get_cookie_params () - // sterge cookie-ul curent. setcookie (session_name (), ``, timpul () - 42,000, $ params [ "cale"], $ params [ "domeniu"], $ params [ "sigure"], $ params [ "HttpOnly"]) - // distruge session_destroy sesiune () - antet ( `Locul de amplasare: index.php ../`) -
Codul de conectare se află în două fișiere noi register.php din directorul rădăcină al aplicației și în registrul include register.inc.php. El face următoarele:
Cea mai mare parte a revizuirii este în jаvascript pe pagina de utilizator. Puteți face acest lucru deoarece utilizatorul nu are nici un motiv să ocolească acest control. De ce ar vrea un utilizator să creeze un cont care ar fi mai puțin sigur? Explicăm jаvascript în secțiunea următoare.
Mai întâi creați fișierul register.php și scrieți următorul cod:
phpinclude_once `include / register.inc.php` include_once `include / functions.php` -?>Intrare securizată: Formular de înregistrare phpif (! gol ($ error_msg)) {echo $ error_msg -}?>
- Numele de utilizator trebuie să conțină numai numere, litere mari și minuscule și subliniere.
- Adresele de e-mail trebuie să aibă un format valid.
- Parolele trebuie să aibă cel puțin șase caractere.
- Trebuie să fie incluse parolele
- cel puțin o majusculă (A..Z)
- cel puțin o literă mică (a..z)
- cel puțin o cifră (0 ... 9)
- Parola și confirmarea trebuie să se potrivească exact.
Reveniți la pagina de conectare.
Fișierul register.inc.php din directorul include include următorul cod:
Phpinclude_once `db_connect.php`-include_once` PSL-config.php - $ ERROR_MSG = "-dacă" (isset ($ _ POST [ `username`], $ _POST [ `email`], $ _POST [ `p`] )) {// Purge și verifica datele $ username = filter_input (INPUT_POST, `numele de utilizator`, FILTER_SANITIZE_STRING) - $ e-mail = filter_input (INPUT_POST, `e-mail`, FILTER_SANITIZE_EMAIL) - $ e-mail = filter_var ($ e-mail, FILTER_VALIDATE_EMAIL) -daca (! filter_var ($ e-mail, FILTER_VALIDATE_EMAIL)) {// ERROR_MSG nu un e-mail validă $. = `Adresa de e-mail pe care ați introdus-o nu este validă
`-} $ parola = filter_input (INPUT_POST,` p“, FILTER_SANITIZE_STRING) -daca {// în cazul în care trunchiate parola 128 de caractere sein.// Dacă nu, atunci ceva este foarte ciudat (! Strlen ($ parola) = 128) se întâmplă $ error_msg. = `Setarea nevalidă a parolei.
„-} // nume de utilizator și parola a fost verificată de partea utilizatorului .// Ar trebui să fie suficient, pentru că nimeni nu are un avantaj, în cazul în care aceste reguli // werden.//$prep_stmt = accidentat„SELECT id de la membrii unde email-ul = ? 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 această adresă de e-mail există deja $ error_msg. = `Un utilizator cu această adresă de e-mail există deja.
`-}} altceva {$ error_msg. =`Eroare de bază de date
} // do încă - „: // Trebuie să aibă grijă de cazul în care utilizatorul nu are nici o permisiune // pentru inregistrare prin verificarea ce fel de utilizator încearcă // această durchzuführen.if operațiune (gol ($ ERROR_MSG)) {// Crearea unei aleatoare de sare $ random_salt = diez ( `SHA512`, uniqid (openssl_random_pseudo_bytes (16), TRUE)) -. // Crearea Saltet parola $ = parola hash ( `SHA512`, $ parola $ random_salt) - // transporta (insert_stmt $ = $ mysqli-> pregăti ( "INSERT INTO membri (nume de utilizator, e-mail, parola, sare) VALORI (,,,) ???")) noul utilizator în baza de date în cazul în care {$ insert_stmt- (random_salt `SSS` $ username, $ e-mail, parola $, $)> bind_param - // executa cererea aus.if preparat {header (“Locul de amplasare: ../ (insert_stmt- $> execute ())! ? error.php ERR = eșec de înregistrare: INSERT `) -}} antet (` Locul de amplasare: ./register_success.php`)-}}
Dacă în formular nu au fost trimise date POST, va fi afișat formularul de înregistrare. Butonul "Trimitere" solicită funcția jаvascript regformhash (). Acest formular face verificările necesare și trimite formularul dacă totul este bine. Funcțiile jаvascript sunt explicate în secțiunea următoare.
Dacă există date POST, unele lucruri sunt verificate pe server și datele sunt curățate. Rețineți că aceste recenzii nu sunt complete în prezent. Câteva lucruri sunt menționate în comentariile din dosar. În momentul de față, acesta verifică numai faptul că adresa de e-mail are formatul corect, că parola hashed are lungimea corectă și că utilizatorul nu încearcă să se conecteze la o adresă de e-mail care este deja înregistrată.
Dacă totul este bine, atunci noul utilizator va fi înregistrat făcând o intrare nouă în tabela de membri.
Partea 6
Creați fișierele jаvascript
Acest fișier este o implementare jаvascript a algoritmului de ștergere sha512. Folosim funcția hash pentru ca parolele noastre să nu fie trimise în text lizibil.
Fișierul poate fi de la pajhome.org.uk fi descărcat.
(Este, de asemenea, stocat în depozitul github.)
Salvați acest fișier într-un director "js" în afara directorului rădăcină al aplicației.
Acest fișier, pe care ar trebui să-l creați în directorul js al aplicației, are grijă de hashing parolele pentru formularele de login (formhash () și login (regformhash ()):
funcția formhash (formă, parolă) {// Creați un câmp nou pentru parola hashed. var p = document.createElement ("input") - // Adăugați-l în formular. form.appendChild (p) -p.name = "p" -p.type = "ascuns" -p.value = hex_sha512 (password.value) - // Asigurați-vă că nici o parolă de text este trimis. password.value = "" - // Trimiteți formularul. form.submit () -} funcția regformhash (forma, uid, e-mail, parola, conf) {// Verificați dacă fiecare câmp hatif o valoare (uid.value == `` || email.value == `` || password.value == `` || conf.value == ``) {alert (`Încercați din nou`) - return false -} // Verificați usernamere = / ^ w + $ /-if(!re.test(form.username.value)) {alert ( "Numele de utilizator mustContain numai litere, cifre și 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 va fi repetată mai jos, dar puteți da utilizatorului mai multe instrucțiuni (password.value.length < 6) {alert () „Parolele 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 o cifră, o literă mică și o literă mare // Cel puțin șase caractere var Re = /(?=.*d)(?=.*[az])(?=.*[AZ]).{6,}/-if (! re.test (password.value)) {alertă ( „parole trebuie să conțină cel puțin un număr, o literă mică și o literă mare Vă rugăm să încercați din nou.“) - return false -} // Verificați parolele și confirmă că este sindif egal (! password.value = conf.value) { alert ( `parola și confirmarea dvs. nu se potrivesc vă rugăm încercați din nou.`) - form.password.focus () - return false - //} Creați un nou câmp pentru hash Passwort.var p = document.createElement ( "intrare" ) - // Adăugați-l la formular. form.appendChild (p) -p.name = "p" -p.type = "ascuns" -p.value = hex_sha512 (password.value) - // Asigurați-vă că nici o parolă de text este trimis. password.value = "" -conf.value = "" - // Trimiteți formularul. form.submit () - return true-}
În ambele cazuri, jаvascript are parola și o scrie în datele POST creând un câmp ascuns și scriind ceva în el.
Partea 7
Creați paginile HTML
Este un formular HTML cu două câmpuri de text, "email" și "parola". Butonul de trimitere numește funcția jаvascript formhash (), care face o hash a parolei și trimite "e-mail" și "p" (parola hashed) la server. Ar trebui să creați acest fișier în directorul rădăcină al aplicației.
Când vă conectați, este mai bine să utilizați ceva care nu este public. Aici folosim adresa de e-mail ca id de conectare, numele de utilizator poate fi apoi folosit pentru a identifica utilizatorul. Dacă adresa de e-mail nu apare nicăieri pe paginile aplicației, atunci este o altă persoană străină pentru cineva care încearcă să intre.
Notă: Deși am criptat parola, astfel încât acesta nu va fi trimis ca text ușor de citit, dar este încă foarte important să utilizați protocolul HTTPS (TLS / SSL) atunci când trimiteți parolele într-un sistem de durata de utilizare. Nu se poate sublinia faptul că numai Hashen nu este suficient. Într-un atac de tip "om-in-the-middle", hash-ul trimis poate fi citit și utilizat pentru a vă conecta.
Phpinclude_once `include / db_connect.php`-include_once` include / functions.php`-sec_session_start () - în cazul în care (login_check ($ mysqli) == true) {$ autentificat = `În`} else {$ autentificat = „out „-}>?Intrare sigură: conectați-vă phpif (isset ($ _GET [`eroare`])) {echo `Eroare la conectare!
„-}>?Dacă nu aveți autentificare, vă rog registru
Dacă ați terminat, vă rog ieșiți.
Sunteți înregistrat în prezent php echo $ logged?>.
Creați un nou site PHP register_success.php în directorul rădăcină al aplicației. Aceasta este pagina pe care utilizatorul va fi redirecționată după conectarea reușită. Desigur, puteți să faceți ceva aici sau să îl redirecționați către altă pagină (sau nu). Depinde de tine. Pagina trebuie să fie în directorul rădăcină al aplicației. Actuala pagină register_success.php arată astfel:
Secure Login: Succesul înregistrării Acum te poți întoarce la pagina de conectare și conectați-vă
Partea 8
Protejați paginile
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 verifica dacă utilizatorul este conectat. Asigurați-vă că utilizați această funcție pentru a verifica dacă utilizatorul este conectat.
// Introduceți aici conexiunea bazei de date și funcțiile. Comparații 3.1. sec_session_start () - în cazul în care (login_check ($ mysqli) == true) {// Adăugați conținutul paginii aici!} else {echo „Nu sunteți autorizat să acceseze această pagină, conectați-vă .`-}
Ca exemplu pentru ceea ce trebuie să faceți, am adăugat o pagină de probă protejată. Creați un fișier protected_page.php în directorul rădăcină al aplicației. Fișierul trebuie să conțină ceva asemănător:
Phpinclude_once `include / db_connect.php`-include_once` include / functions.php`-sec_session_start () ->Intrare securizată: Pagina protejată php dacă (login_check ($ mysqli) == true):?>bun venit php echo htmlentities ($ _ SESSION [`username`]) -?>!
Acesta este un exemplu de pagină protejată. Pentru a accesa această pagină, utilizatorul trebuie să fii conectat. La un moment dat, vom verifica atât rolul ofthe de utilizator astfel încât paginile vor fi în măsură să exploateze tipul determinist de userauthorised pentru a accesa pagina.
Înapoi la pagina de conectare
php altceva:?>Nu sunteți autorizat să accesați această pagină. vă rog autentificare.
php endif -?>
Aplicația noastră redirecționează spre această pagină după înregistrarea cu succes. Desigur, cererea dvs. nu trebuie neapărat să facă acest lucru.
Sfaturi
- Cu doar modificări minore, aceste scripturi de mostre pot fi adaptate la alte sisteme SQL, cum ar fi SQLite sau PostgreSQL.
- Utilizați HTML și CSS pentru a proiecta formularul de conectare și paginile de ieșire în funcție de ideile dvs.
- Țineți degetele departe de funcția md5 () în scripturile de conectare. Algoritmul hash al MD5 este acum apelat incert luate în considerare.
- Dacă doriți să utilizați un alt algoritm de ștergere decât sha512, încercați Whirlpool. Evitați gostul, sha1 (cu excepția cazului în care se salvează bine și în mai multe repetări) și, așa cum am spus, md5. Încurajați utilizatorii să creeze parole securizate cu litere, numere și simboluri majuscule și minuscule. Luați în considerare obligația utilizatorilor dvs. de a utiliza un alt nume de conectare decât numele de utilizator pentru a fi mai siguri.
avertismente
- Nimic nu este 100% sigur. Nu uitați să verificați din când în când dacă nu există mesaje noi de securitate, astfel încât să puteți îmbunătăți securitatea scripturilor dvs.
- Porțiunea de forță anti-brute a acestui script care blochează un cont de utilizator poate fi folosită cu ușurință. Vă recomandăm cu insistență să utilizați o tehnică de forță anti-brute cum ar fi CAPTCHA.
- Asigurați-vă că utilizatorul nu vă poate vedea scriptul dvs. PHP, care ar putea fi cazul în cazul în care serverul nu este configurat corect. Există o șansă ca utilizatorii să poată aduna informații despre numele de bază de date și parolele dacă codul dvs. PHP este vizibil. În mod ideal, orice script conținut în alte scripturi sau pagini ar trebui să se afle într-un director în afara sistemului de fișiere al serverului și să fie asociat cu o cale relativă, de ex. include "../../includes/myscript.inc.php".
- Paginile de conectare și de conectare trebuie să utilizeze HTTPS. Scripturile din acest articol nu te obligă să faci acest lucru și poate fi chiar mai ușor să faci fără ea în timpul dezvoltării. Dar pentru utilizarea permanentă ar trebui să utilizați absolut HTTPS.
- Este posibil să aveți o soluție mai bună dacă folosiți cadre ca Zend 2, Symfony sau CakePHP. Toate aceste cadre au prevederi pentru sesiuni sigure și module care să susțină procesul de conectare. Aplicațiile dvs. pot fi, de asemenea, mai bine scrise dacă utilizați un cadru.
- Utilizarea CAPTCHA pe pagina de autentificare este recomandată pentru a face dificilă forța brute și atacurile DoS. Vă recomandăm să apară CAPTCHA după două încercări de conectare nereușite. Acest lucru nu este încă inclus în codul exemplu.
Adăugați un buton Facebook pe pagina dvs. web
Redenumiți codurile pe Xbox One
Schimbați setările dvs. de autentificare Yahoo
Deblocați LG VS950
Ștergeți o bază de date MySQL
Creați un cod de bare
Creați un buton de descărcare de pe o pagină Web
Creați un cod QR
Găsiți un cod WEP
Protejați un site web cu parolă
Creați oa doua interogare de conectare pe Yahoo
Setați o parolă pentru iPad
Scanați un cod QR
Resetați indicatorul luminos al motorului
Găsiți codurile bancare americane
Adăugați Google Analytics pe site-ul dvs. web
Aflați PHP și MySQL
Abonați-vă la PlayStation Plus
Utilizați codurile Gameshark pe Visualboy Advance
Deblocați Samsung Galaxy S II
Conectați-vă la Dreambox