gtemata.com

Cum se creează un script de conectare securizată Utilizând PHP și MySQL

După ce au citit numeroase povestiri despre încălcări ale site-urilor web și ale bazei de date, dezvoltatorii caută continuu cea mai bună modalitate de a-și asigura informațiile pe web. Dacă site-ul dvs. include caracteristici pentru înregistrarea și gestionarea utilizatorilor ar putea fi expuse riscului de a fi hacked, rezultând în pierderea de informații valoroase despre utilizatori. Acest ghid vă arată cea mai bună modalitate de a crea un sistem de autentificare și de gestionare sigur și ușor de utilizat.


Urmați instrucțiunile din acest ghid pentru a preveni orice tip de atac cibernetic al cărui scop este accesul la alte profiluri de utilizator, ștergerea conturilor sau modificarea datelor. Iată o listă a posibilelor atacuri cibernetice, din care pașii din acest ghid vă vor ajuta să vă apărați.

paşi

Metoda 1

Configurați-vă serverul
1
Instalați platforma PHP și baza de date MySQL pe serverul dvs.
Imaginea intitulată Php mysql.jpg

Multe servicii de găzduire web oferă platformele PHP și mySQL deja incluse în serviciu. În acest caz, va fi suficient să verificați dacă versiunea furnizată corespunde celei mai actualizate versiuni disponibile, pentru a vă permite să utilizați instrumentele enumerate în acest ghid. Dacă aveți un server sau un computer disponibil, urmați pașii din ghidul de mai jos pentru a instala platforma PHP și mySQL pe Mac.

Metoda 2

Configurați o bază de date mySQL
1
Creați baza de date MySQL.
Acest ghid va crea o bază de date numită "secure_login".
Utilizați codul SQL pe care îl găsiți mai jos pentru a crea baza de date.

Cod SQL pentru crearea unei baze de date:
CREAȚI DATABASA `secure_login`-

Notă: unele servicii de găzduire nu vă permit să creați o bază de date utilizând interfața phpMyAdmin, prin urmare învață să creezi o bază de date mySQL folosind cPanel.
  • 2
    Creați un utilizator care are doar privilegii de executat "SELECT", "UPDATE" și "INSERT".
    În acest fel, dacă a fost descoperită o încălcare a securității scripturilor, un hacker nu a putut șterge nimic din structură sau din datele din baza de date. Folosind un utilizator de acest tip, vei putea să faci tot ce vrei cu aplicația ta. Dacă sunteți deosebit de îngrijorat de securitatea bazei dvs. de date, creați un alt utilizator pentru fiecare funcție.

  • utilizator: "sec_user"
  • Parola: "eKcGZr59zAa2BEWU"


  • Cod pentru crearea utilizatorului `sec_user`:
    CREATE USER `sec_user` @ `localhost` IDENTIFICAT DE `eKcGZr59zAa2BEWU`-GRANT SELECT, INSERT, UPDATE ON `secure_login`. * LA` sec_user `@` localhost`-

    Notă: este o idee bună să personalizați parola de cod descrisă mai sus când o rulați pe serverul dvs. De asemenea, asigurați-vă că modificați codul PHP. Amintiți-vă că nu este o parolă pe care va trebui să o rețineți cu ușurință, deci alegeți una care este cât mai complicată posibil. La această adresă veți găsi un generator de parole aleatoare.
  • 3
    Creați un tabel mySQL numit "membri".
    Următorul cod va crea un tabel format din 5 câmpuri (id, nume de utilizator, email, parolă, sare).

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

    Am folosit tipul de date "CHAR" pentru câmpurile a căror dimensiune este cunoscută. Pentru câmpurile "parola" și "sare" a fost utilizată o dimensiune maximă de 128 caractere. Folosind tipul de date "CHAR", veți economisi la utilizarea procesorului.
  • 4
    Creează tabelul de jurnal care va stoca toate încercările de conectare.
    Am creat acest tabel pentru a stoca toate încercările de conectare ale utilizatorilor pentru a preveni un atac bazat pe "forța bruta".

    Cod pentru crearea tabelului "login_attempts":
    CREATE TABLE `secure_login`.`login_attempts` (` user_id` INT (11) NU NULL, `timp` VARCHAR (30) NOT NULL) ENGINE = InnoDB
  • 5
    Efectuați un test de introducere a datelor în tabelul "membrii".
    Deoarece nu am creat o pagină pentru înregistrarea utilizatorilor noi, va fi crucial să testați robustețea și eficiența scriptului de autentificare. Mai jos veți găsi scriptul SQL pentru a crea un utilizator cu următoarele detalii:
  • Nume de utilizator: test_user
  • Adresă e-mail: [email protected]
  • Parola: 6ZaxN2Vzm9NUJT2y

  • Adăugați utilizatorul "test user":
    INSERT INTO `VALORI secure_login`.`members` (1, `test_user`, `[email protected]`, `00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc`, `f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef`) -

    Metoda 3

    Creați pagina de conectare la baza de date
    1
    Creați pagina pentru conectarea la baza de date.
    Acesta este codul php pe care îl vom folosi pentru a ne conecta la baza de date mySQL. Creați un nou fișier php numit "db_connect.php" și introduceți codul următor în el. Puteți introduce acest fișier în toate paginile care trebuie să se conecteze la baza de date.

    Codul PHP pentru conexiunea bazei de date (`db_connect.php`):
    define ("HOST". "localhost") - // Este serverul la care doriți să vă conectați."USER". "sec_user") - // Este utilizatorul cu care vă veți conecta la DB.define ("PAROLA". "eKcGZr59zAa2BEWU") - // Parola pentru accesarea DB.define ("BAZA DE DATE". "secure_login") - // Numele bazei de date $ mysqli = new mysqli (HOST, utilizator, parola bazei de date). - // Dacă conectați folosind TCP / IP, în loc de a folosi un socket UNIX, nu uitați să adăugați parametrul corespunzător pentru a numărul portului.

    Metoda 4

    Creați funcții PHP

    Aceste funcții vor sta la baza tuturor operațiilor care trebuie efectuate pentru a executa corect scriptul de autentificare. Adăugați toate aceste funcții într-o pagină numită "functions.php".

    1
    Porniți o sesiune PHP sigură.
    Este important să se utilizeze nu numai „session_start () -“ la începutul fiecărei pagini veți utiliza în cadrul sesiunii PHP. Dacă vă pasă cu adevărat de securitatea sistemului dvs., iată cum trebuie să implementați această secțiune a codului. Vom crea o funcție numită sec_session_start, care va crea o sesiune php protejată. Va trebui să apelați această funcție la începutul fiecărei pagini care are nevoie să acceseze o variabilă de sesiune. Dacă sunteți foarte preocupat de securitatea și confidențialitatea datelor stocate în cookie-uri, citește mai mult subiect prin căutarea pe web pentru managementul unei sesiuni sigure, cu un sistem bazat pe PHP si MySQL.

    Cod asociat funcției de creare a unei sesiuni php sigure:
    Funcția sec_session_start () {$ session_name = „sec_session_id`- // Setați o sesiune de nume $ securizat = // Setați fals parametrul la true dacă doriți să utilizați“ https`, protocolul HttpOnly $ = true -. // Acest lucru va împiedica un jаvascript pentru a putea accesa id-ul sessione.ini_set ( `session.use_only_cookies`, 1) - // Forțează sesiunea de a utiliza cookie-uri numai $ cookieParams session_get_cookie_params = () -. // Citiți parametrii de curent aferente ai cookie.session_set_cookie_params ($ cookieParams ["toată viața"], $ cookieParams ["cale"], $ cookieParams ["domeniu"], Secure $, $ HttpOnly) -session_name ($ session_name) - // Setați numele de sesiune cu cea aleasă la începutul funzione.session_start () - // Începe sesiunea php.session_regenerate_id () - // Regenerate ștergeți și ștergeți unul pe care l-ați creat mai devreme.}

    Această caracteristică face scriptul dvs. de conectare mult mai sigur. Împiedică un atacator să acceseze ID-ul sesiunii php folosind un simplu script de java (ca în cazul unui atac XSS).
    De asemenea, folosind funcția `session_regenerate_id ()` care generează id-ul sesiunii de încărcare a fiecărei pagini, veți deturna sesiunea.

    Notă: dacă utilizați protocolul "https" pentru aplicația dvs. de conectare, nu uitați să setați variabila `$ secure` la `true`.
  • 2
    Creați funcția de conectare.
    Această funcție va verifica adresa de e-mail și parola care le compară cu cele stocate în baza de date, returnând valoarea "true" în cazul în care se găsește o potrivire.

    Funcția de conectare sigură:
    ($ email, $ password, $ mysqli) {// Folosind instrucțiunea sql `prepared` nu va fi posibilă implementarea unei injecții SQL.if ($ stmt = $ mysqli->pregăti ("SELECT id, nume utilizator, parola, sare FROM membrii WHERE email =? LIMIT 1")) {$ stmt->bind_param (`s`, $ email) - // se leagă de parametrul `$ email` $ stmt->execute () - // execută interogarea nou creată $ stmt->store_result () - $ stmt->bind_result ($ user_id, $ username, $ db_password, $ salt) - // returneaza rezultatul interogarii si o stocheaza in variabilele sale $ stmt->fetch () - $ password = hash (`sha512`, $ password $ salt) - // criptează parola folosind un key.if unic ($ stmt->num_rows == 1) {// daca utilizatorul // vom verifica că nu este dezactivat în urma executării prea multe încercări de acces errati.if (checkbrute (user_id $, $ mysqli) == true) {// Cont dezactivat // Trimite un e-mail care vă avertizează că contul dvs. a fost disabilitato.return} else {fals if ($ DB_PASSWORD == parola $) {// Verificați dacă parola stocată în baza de date se potrivește cu parola furnizată de `user.// Parola corectă! $ User_browser = $ _SERVER [ `HTTP_USER_AGENT`] -. // Preluați parametrul `user-agent` pentru utilizatorul curent $ user_id = preg_replace ("/ [^ 0-9] + /". "", $ user_id) - // ne proteja de un atac XSS $ _SESSION [`user_id`] = $ user_id- $ username = preg_replace ("/ [^ A-zA-Z0-9 _ -] + /". "", $ Nume de utilizator) - // ne protejăm de un atac XSS $ _SESSION [ `username`] = $ username - $ _ SESSION [ `login_string`] = diez ( `SHA512`, $ parola $ User_browser) -. // Intra executat true-successo.return} else {// Parola incorretta.// înregistrare încercarea a eșuat în baza de date $ = acum timp () -. $ mysqli->interogare ("INSCRIEȚI ÎN login_attempts (user_id, time) VALUES (`$ user_id`, `$ now`)") -return false-}}} altceva {// Utilizatorul introdus nu există. returnează false-}}}
  • 3
    Funcție pentru a preveni un atac folosind "forța brută".
    Atacurile cibernetice de forță violente apar atunci când un atacator efectuează mii de încercări de a accesa un sistem folosind un cont specific, generând parole aleatoare sau preluând-le dintr-un dicționar. În scriptul nostru, dacă un utilizator face 5 încercări consecutive de conectare nereușite, contul său este dezactivat.

    Creați funcția "checkbrute":
    Funcția checkbrute ($ user_id, $ mysqli) {// Preluați data $ = acum timp () -. // Se analizează toate încercările de conectare din ultimele două ore valid_attempts $ = $ acum - (2 * 60 * 60 ) -if ($ stmt = $ mysqli->pregăti ("SELECT TIME FROM login_attempts WHERE user_id =? ȘI timp > `$ Valid_attempts`")) {$ stmt->bind_param (`i`, $ user_id) - // Rulați interogarea creată $ stmt->execute () - $ stmt->store_result () - // Verific existența a mai mult de 5 încercări de conectare failed.if ($ stmt->NUM_ROWS > 5) {returnă adevărat-} altceva {return false-}}}


    Atacurile bazate pe forța bruta sunt dificil de prevenit. Unele moduri de a face acest lucru sunt utilizarea codurilor CAPTCHA, dezactivarea utilizatorului și introducerea unei întârzieri în următoarea încercare de conectare după o încercare eșuată. Acest lucru înseamnă că utilizatorul va trebui să aștepte o anumită perioadă de timp (de exemplu, 30 de secunde) înainte de a putea să vă conectați din nou.
    Mulți dezvoltatori, atunci când se confruntă cu probleme similare, blochează accesul la sistem din acea adresă IP specifică, după un anumit număr de încercări greșite de conectare. Unele instrumente utilizate pentru automatizarea acestui tip de atac utilizează servere proxy și modifică adresa IP la fiecare solicitare de conectare. Aceasta înseamnă că blocarea tuturor acestor adrese IP ar putea, de asemenea, să împiedice conectarea utilizatorilor legitimi.


  • 4
    Verificați starea de conectare.
    Pentru a face acest lucru trebuie să verificăm variabilele de sesiune "user_id" și "login_string". Variabila de sesiune "login_string" stochează informațiile codate de browser-ul utilizatorului împreună cu parola de conectare. Utilizăm informațiile din browser deoarece este foarte puțin probabil ca utilizatorul să le schimbe în timpul sesiunii. Această previziune ne ajută să prevenim un atac relativ sesiune de deturnare.

    Creați funcția "login_check":
    login_check funcția ($ mysqli) {// Verificați dacă toate variabilele de sesiune sunt setate correttamenteif (isset ($ _ SESSION [ `user_id`], $ _ SESSION [ `username`], $ _ SESSION [ `login_string`])) {$ USER_ID = $ _SESSION [ `user_id`] - $ login_string = $ _ SESSION [ `login_string`] - $ username = $ _ SESSION [ `username`] - $ user_browser = $ _SERVER [ `HTTP_USER_AGENT`] - // preia șirul „user- agent "al utilizatorului.if ($ stmt = $ mysqli->pregăti ("SELECT parola din membrii WHERE id =? LIMIT 1")) {$ stmt->bind_param (`i`, $ user_id) - // leagă parametrul `$ user_id`. $ stmt->execute () - // Rulați interogarea creată $ stmt->store_result () - în cazul în care ($ stmt->num_rows == 1) {// dacă utilizatorul există $ stmt->bind_result ($ password) - // returnați variabilele din rezultatul obținut $ stmt->fetch () - $ login_check = hash (. `SHA512`, $ parola $ user_browser) -dacă ($ login_check == $ login_string) {// returneaza true run-!!!! Autentificare} else {// Autentificare nici un eseguitoreturn fals -}} else {// Autentificare nu eseguitoreturn}} else fals {// Autentificare nu eseguitoreturn}} else fals {// Autentificare nici un fals eseguitoreturn}}
  • Metoda 5

    Creați pagini de gestionare a proceselor
    1
    Creează pagina care se va conecta (process_login.php).
    Dacă ați urmat exemplele noastre anterioare, pagina va fi numită "process_login.php".
    Vom folosi funcțiile PHP incluse în extensie mysqli_ * din MySQL, pentru că pare a fi cea mai actualizată.

    Creați codul paginii de login (process_login.php)
    include `db_connect.php` includ` functions.php`-sec_session_start () - // folosim funcția noastră de a lansa o sesiune de php sicuraif (isset ($ _ POST [ `email`], $ _POST [ `p`])) {$ email = $ _POST [ `email`] - $ parola = $ _POST [ `p`] - // Preluați parola criptata.if (conectare ($ e-mail, parola $, $ mysqli) == true) {// Autentificare „succes!: aţi fost autentificat“ eseguitoecho -} else {// Autentificare fallitoheader ( „Locația: ./login.php?error=1`)-}} else {// variabilele corecte nu au fost trimise această pagină din metoda POST.echo "Solicitare nevalidă"

  • 2
    Creați scriptul de logout.
    Scriptul de logout trebuie să înceapă o sesiune, să o distrugă și apoi să redirecționeze către o altă pagină.

    Creați codul pentru scriptul de logout (logout.php):
    include functions.php`-sec_session_start (). - // Sterge toate valorile sesiunii $ _ SESSION = array () -. // Preluați parametrii de sesiune session_get_cookie_params $ params = () - // Ștergeți cookie-urile attuali.setcookie (session_name (), ``, time () - 42000, $ params ["cale"], $ params ["domeniu"], $ params ["sigur"], $ params ["HttpOnly"]) - // Anulează session.session_destroy () - header (`Locație: ./`)-

    Notă: în acest moment ar fi o idee bună să adăugați protecție "CSRF". Procedând astfel, dacă cineva reușește să ajungă la adresa acestei pagini ascunse, utilizatorul va fi deconectat.
  • 3
    Pagina de înregistrare.
    Pentru a cripta parola, va trebui să folosim următorul cod:

    Scriptul de hash de parolă:
    . // regasirea parolei criptate din formularul de intrare $ Parola = $ _POST [ `p`] - // Creați un aleatoare cheie $ random_salt = hash ( `SHA512`, uniqid (mt_rand (1 mt_getrandmax ()), true) ) - // Creați o parolă utilizând cheia pe care tocmai ați creat $ parola = diez ( „SHA512“, $ parola $ random_salt) -.. // Includeți codul SQL în acest moment pentru a executa instrucțiunea INSERT în baza de date // Asigurați-vă că folosiți declarație SQL „prepared`.if ($ = $ 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) - // Rulați interogarea rezultată $ insert_stmt->execute () -}

    Asigurați-vă că valoarea parametrului `$ _POST [` p `]` a fost deja criptată folosind un jаvascript. Dacă nu utilizați această metodă, deoarece doriți să validați parola direct pe server, asigurați-vă că este criptată.
  • Metoda 6

    Creați fișiere jаvascript
    1
    Creați fișierul "sha512.js".
    Acest fișier este o implementare a algoritmului de codificare "sha512" pentru jаvascript. Vom folosi funcția de codificare astfel încât parolele noastre să nu poată fi trimise în text clar.

    Fișierul poate fi descărcat de pe site-ul pajhome.org.uk
  • 2
    Creați fișierul "forms.js".
    Acest fișier va codifica parolele pentru toate formularele.

    Cod pentru jаvascript al fișierului `forms.js`:
    (forme, parola) {// Crearea unui element de intrare care va fi folosit ca câmp de ieșire pentru parola criptată.var p = document.createElement ("intrare") - // Adăugați un element nou la form.form.appendChild (p) -p.name = "p"-p.type = "ascuns"p.value = hex_sha512 (password.value) - // Asigurați-vă că parola nu este trimisă în clartext.password.value = ""- // Ca ultim pas, rulați `submit` form.form.submit () -}
  • Metoda 7

    Creați pagini HTML
    Imaginea intitulată Imagine ecran 2013 02 08 la 17.55.56.jpg
    1
    Creați formularul de autentificare (login.php).

    Acesta va fi compus dintr-un formular HTML care va conține două câmpuri de intrare denumite "e-mail" și "parolă". Scriptul java va avea grijă de codarea parolei și trimiterea e-mailului și parametrului parametru (parola criptată) către server.

    Pentru faza de conectare, este mai bine să utilizați informații care nu sunt publice. În acest ghid folosim adresa de e-mail în faza de conectare, în timp ce numele de utilizator poate fi folosit pentru a identifica utilizatorul. Dacă adresa de e-mail este ascunsă, veți adăuga o variabilă suplimentară, care trebuie gestionată de un posibil hacker.

    Cod pentru crearea formularului de autentificare în HTML:

    Notă: Deși am criptat parola, astfel încât nu este trimis în clar, se recomandă utilizarea protocolului „https“ (TLS / SSL) pentru a trimite parola la server. (Consultați această documentație cu privire la "Rețeaua de ascultare").

    Metoda 8

    Protecția paginilor
    1
    Script pentru protecția paginii.
    Una dintre cele mai frecvente probleme găsite în sistemele de autentificare este că dezvoltatorii uită să verifice că utilizatorul este de fapt "logat" în sistem. Este foarte important să utilizați următorul cod pentru a verifica dacă utilizatorul sa logat cu succes.
    Cod pentru protejarea accesului la pagini:
    // Se introduce acest punct în codul pentru a se conecta la PB și utilizarea diferitelor funzioni.sec_session_start () - în cazul în care (login_check ($ mysqli) == true) {! // Aici conținutul paginilor dvs.} else { echo `Nu sunteți autorizat să accesați această pagină, vă rugăm să vă autentificați. 
    „-}


    Asigurați-vă că utilizați această caracteristică pentru a verifica dacă utilizatorul este conectat la sistem.

    Citiri recomandate

    Sfaturi

    • Cu foarte puține modificări, aceste exemple de scripturi PHP pot fi utilizate în alte baze de date SQL, cum ar fi SQLite sau PostgreSQL.
    • Utilizați coli de stil HTML și CSS pentru a personaliza în funcție de gusturile dvs., panoul de conectare și alte pagini web.
    • Nu utilizați funcțiile care utilizează algoritmul de securitate md5 în cadrul scripturilor care controlează faza de conectare. Algoritmul md5 a fost clasificat ca NU sunt sigure.
    • Dacă doriți să utilizați un algoritm de hash diferit de "sha512", încercați "Whirlpool". Evitați utilizarea algoritmilor, cum ar fi "Gost", "sha1" (cu excepția cazului în care este gestionat cu atenție și în cadrul mai multor iterații) și md5 menționat mai sus. Încurajați utilizatorii să creeze parole unice și foarte sigur, care utilizează atât caractere minuscule cât și majuscule, numere și simboluri. Oferiți utilizatorilor posibilitatea de a crea un nume de utilizator specific pentru a vă conecta, diferit de numele de utilizator utilizat public.

    Avertismente

    • În lumea calculatoarelor nimic nu este 100% sigur și impenetrabil. Amintiți-vă să vă actualizați mereu în termeni de securitate, citiți ultimele știri, să fiți gata să aplicați modificările corecte ale scripturilor dvs.
    • Scriptul care blochează atacurile de forță brute prin dezactivarea contului de utilizator utilizat pentru a lansa atacul poate fi utilizat în mod necorespunzător. Creați un script care rulează la fiecare oră și introduceți toți "utilizatorii necunoscuți" și numărul de intrări nereușite ("bad_password") într-un tabel. Setați scriptul pentru a dezactiva utilizatorul după 5 încercări eșuate.
    • Asigurați-vă că utilizatorii nu vă pot vedea scripturile PHP, ceea ce se poate întâmpla din cauza unei configurații incorecte a serverului. Dacă codul dvs. PHP este vizibil, există o posibilitate reală de a colecta informații despre bazele dvs. de date și accesul la parolă de către persoanele rău intenționate.

    Lucruri de care ai nevoie

    Pentru a utiliza clasele PHP incluse în extensia mysqli_ * pentru a accesa baza de date MySQL, va trebui să utilizați următoarele versiuni PHP și MySQL.

    • Versete PHP 5 sau mai târziu
    • Versiunea MySQL 4.1.3 sau o versiune ulterioară

    Pentru a verifica versiunea PHP și mySQL instalată pe serverul dvs., utilizați următoarea funcție PHP phpinfo ().

    Distribuiți pe rețelele sociale:

    înrudit