Wkunl

Hoe maak je een beveiligde login script in PHP en MySQL te creëren

Met meer en meer verhalen van hacking in het nieuws, zijn ontwikkelaars op zoek naar de beste manieren om de beveiliging van hun website. Als uw site heeft een lid-systeem, kan het risico lopen te worden gehackt en uw gebruikers gegevens kunnen worden aangetast. Deze gids zal u tonen de beste manieren om uw gebruikers-systeem en login, zodat het zo veilig mogelijk.
Naar aanleiding van deze gids zal u helpen voorkomen dat tegen alle soorten aanvallen die hackers kunnen gebruiken om de controle van andere gebruikers accounts te krijgen, rekeningen en / of wijzigen gegevens verwijderen. Hieronder is een lijst van mogelijke aanslagen deze gids verdedigt tegen.

Inhoud

  • 1 Dingen die je nodig hebt
  • 2 Stappen
    • 2.1 server configureren
    • 2.2 Configure MySQL Database
    • 2.3 Create Database Connection Pagina
    • 2.4 Maak een PHP-functies
    • 2.5 Maak Processing Pages
    • 2.6 Create Javascript bestanden
    • 2.7 Maak een HTML-pagina's
    • 2.8 Bescherming Pages
  • 3 Tips
  • 4 Verder lezen
  • 5 Waarschuwingen
  • 6 Gerelateerde Googles

Dingen die je nodig hebt

Zoals we gebruik zullen maken van mysqli_ * set van PHP klassen om toegang te krijgen tot onze MySQL-database moet u volgende versies van PHP en MySQL.

  • PHP versie 5 of hoger
  • MySQL versie 4.1.3 of hoger

Om de versie van PHP en MySQL op de server te controleren gebruikt u de functie.

Stappen

Hoe maak je een beveiligde login script in PHP en MySQL te creëren. Installeer PHP en MySQL op uw server.
Hoe maak je een beveiligde login script in PHP en MySQL te creëren. Installeer PHP en MySQL op uw server.

Uw server configureren

  1. 1
    Installeer PHP en MySQL op uw server.
    De meeste web hosting diensten zal hebben PHP en MySQL reeds geïnstalleerd, zal je alleen maar te controleren of ze hebben de meest recente versies van PHP en MySQL voor deze gids aan het werk. Als u uw eigen server of computer, zie de onderstaande handleidingen over hoe je PHP en MySQL te installeren.

MySQL database configureren

  1. 1
    Maak een MySQL database.
    Zie hoe Create-a-databank-in-phpmyadmin.
    Maak een database-code:
      

    Opmerking: Sommige hosting diensten niet toestaan ​​om een database te maken door middel van phpMyAdmin, leren hoe het te doen in cpanel.
  2. 2
    Maak een gebruiker met alleen selecteren, UPDATE en INSERT privileges.
    • Gebruiker: "sec_user"
    • Password: "eKcGZr59zAa2BEWU"

    Maak gebruikerscode:
      

    Opmerking: Het is een goed idee om het wachtwoord in de code hierboven bij het uitvoeren van op uw eigen server te wijzigen. (Zorg ervoor dat u uw PHP-code te veranderen ook.) Vergeet het niet nodig om een ​​wachtwoord dat je zo kunt onthouden is zo ingewikkeld mogelijk te zijn. Hier is een willekeurig wachtwoord generator.
  3. 3
    Maak een mysql tabel met de naam "leden".
    Maak de "leden" tabel:
      

    We gebruiken de CHAR datatype voor velden we kennen de lengte van, als de velden "password" en "zout" zal altijd 128 tekens lang zijn. Met behulp van CHAR hier bespaart op rekenkracht.
  4. 4
    Maak een tabel aan inlogpogingen slaan.
    Maak de "login_attempts" tabel:
      
  5. 5
    Maak proef rij in tabel "leden".
    Omdat we niet het creëren van een registratiepagina, zal het belangrijk zijn om te kunnen uw login script te testen. Hieronder is het script om een ​​gebruiker met deze gegevens te maken:
    • Gebruikersnaam: test_user
    • E-mail: test@example.com
    • Wachtwoord: 6ZaxN2Vzm9NUJT2y

    Voeg testgebruiker:
      

Maak een database connectie pagina

  1. 1
    Maak databaseverbinding pagina.
    Database connect (db_connect.php):
      

Maak PHP-functies

Deze functies zullen al de verwerking van het login-script doen. Voeg alle functies naar een pagina met de naam "functions.php".

  1. 1
    Veilig starten een PHP sessie.
    Het belangrijk om niet zomaar "session_start ();" op de bovenkant van elke pagina die u wilt php sessies gebruiken, Als je echt bezorgd bent over de veiligheid dan is dit hoe je het moet doen. We gaan een functie genaamd "sec_session_start" te creëren, zal dit een php sessie starten in een veilige manier. Je moet deze functie bellen op de top van elke pagina die u wilt openen een php sessie variabele. Als je echt bezorgd zijn over de veiligheid en de privacy van uw cookies, eens een kijkje op dit artikel Create-a-secure-sessie-managment-systeem-in-php-en-mysql.
    Beveiligde sessie start functie:
      functie sec_session_start () {  $ Session_name = 'sec_session_id'; / / Stel een aangepaste sessie naam  $ Beveiligde = false; / / Set om waar bij gebruik van https.  $ Httponly = true; / / Dit stopt javascript in staat om toegang te krijgen tot de sessie-id.    ini_set ('session.use_only_cookies', 1); / / Krachten sessies om alleen gebruik van cookies.  $ CookieParams = session_get_cookie_params (); / / Haalt de huidige cookies params.    session_name ($ session_name); / / Stelt de sessie naam aan de ene set hierboven.  session_start (); / / Start de php sessie  session_regenerate_id (true); / / geregenereerd de sessie, verwijdert de oude.  } 

    Ook door middel van de "session_regenerate_id ()" functie, die de sessie-id op elke pagina reload regenereert, het helpen voorkomen van het kapen van sessies.
    Opmerking: Als u gebruik maakt van https in uw login applicatie zet de "$ veilige" variabele op true.
  2. 2
    Maak login functie.
    Beveiligd inloggen functie:
      functie login ($ email, $ wachtwoord, $ mysqli) {  / / Gebruik van prepared statements betekent dat SQL-injectie is niet mogelijk.  if ($ stmt = $ mysqli -> bereiden ("? SELECT id, gebruikersnaam, wachtwoord, zout FROM leden WHERE email = LIMIT 1")) {   $ Stmt -> bind_param ('s', $ email); / / Bind "$ email" om parameter.  $ Stmt -> execute (); / / Uitvoeren van de voorbereide query.  $ Stmt -> store_result ();  $ Stmt -> bind_result ($ user_id, $ gebruikersnaam, $ db_password, $ zout); / / krijgen variabelen uit resultaat.  $ Stmt -> fetch ();  $ Password = hash ('sha512', $ password $ zout.); / / Hash van het wachtwoord met de unieke zout.    if ($ stmt -> NUM_ROWS == 1) {/ / Als de gebruiker bestaat  / / We controleren of de rekening wordt geblokkeerd door te veel inlogpogingen  if (checkbrute ($ user_id, $ mysqli) == true) {   / / Account is geblokkeerd  / / Stuur een e-mail naar de gebruiker te zeggen hun account is geblokkeerd  return false;  } Else {  if ($ db_password == $ wachtwoord) {/ / Controleer of het wachtwoord in de database overeenkomt met het wachtwoord van de gebruiker wordt voorgelegd.  / / Wachtwoord is correct!      $ User_browser = $ _SERVER ['HTTP_USER_AGENT']; / / Haal de user-agent string van de gebruiker.    $ User_id = preg_replace ("/ [^ 0-9] + /", "", $ user_id); / / XSS bescherming als we kunnen deze waarde af te drukken  $ _SESSION ['User_id'] = $ user_id;   $ Username = preg_replace ("/ [^ a-zA-Z0-9_ \ -] + /", "", $ username); / / XSS bescherming als we kunnen deze waarde af te drukken  $ _SESSION ['Gebruikersnaam'] = $ username;  $ _SESSION ['Login_string'] = hash ('sha512', $ password $ user_browser.);  / / Inloggen succesvol.  return true;   } Else {  / / Wachtwoord is niet correct  / / We nemen deze poging in de database  $ Nu = time ();  $ Mysqli -> query ("INSERT INTO login_attempts (user_id, tijd) VALUES ('$ user_id', '$ nu')");  return false;  }  }  } Else {  / / Er bestaat geen gebruiker.  return false;  }  }  } 
  3. 3
    Brute kracht functie.
    Maak login_check functie:
      functie checkbrute ($ user_id, $ mysqli) {  / / Haal timestamp van de huidige tijd  $ Nu = time ();  / / Alle inlogpogingen worden geteld van de afgelopen 2 uur.  $ Valid_attempts = $ nu - (2 * 60 * 60);     if ($ stmt = $ mysqli -> bereiden ("? SELECT tijd FROM login_attempts WHERE user_id = AND tijd> '$ valid_attempts'")) {   $ Stmt -> bind_param ('i', $ user_id);   / / Uitvoeren van de voorbereide query.  $ Stmt -> execute ();  $ Stmt -> store_result ();  / / Als er sprake is van meer dan 5 mislukte aanmeldingen  if ($ stmt -> NUM_ROWS> 5) {  return true;  } Else {  return false;  }  }  } 

    Brute force aanvallen zijn moeilijk om te voorkomen dat een paar manieren waarop we kunnen voorkomen dat ze gebruik maakt van een CAPTCHA-test, vergrendelen gebruikersaccounts en het toevoegen van een vertraging op mislukte aanmeldingen, zodat de gebruiker kan niet inloggen voor nog eens 30 seconden.
    Wanneer we geconfronteerd worden met dit probleem de meeste ontwikkelaars gewoon het IP-adres te blokkeren na een bepaalde hoeveelheid mislukte aanmeldingen. Met veel tools om het proces te automatiseren, kunnen deze tools gaan door een reeks van proxies en zelfs het IP op elk verzoek te wijzigen. Het blokkeren van al deze IP-adressen zou kunnen betekenen dat je het blokkeren van legitieme gebruikers.
  4. 4
    Controleer ingelogd-status.
    We doen dit door het controleren van de de "user_id" en de "login_string" SESSION variabelen. De "login_string" SESSION variabele heeft de gebruikers Browser Info gehashed samen met het wachtwoord. We maken gebruik van de Browser Info want het is zeer onwaarschijnlijk dat de gebruiker zijn browser mid-sessie zal veranderen. Door dit te doen helpt voorkomen dat sessies worden overgenomen.
    Maak login_check functie:
      functie login_check ($ mysqli) {  / / Controleer of alle sessie variabelen zijn ingesteld  if (isset ($ _SESSION ['user_id'], $ _SESSION ['gebruikersnaam'], $ _SESSION ['login_string'])) {  $ User_id = $ _SESSION ['user_id'];  $ Login_string = $ _SESSION ['login_string'];  $ Username = $ _SESSION ['gebruikersnaam'];    $ User_browser = $ _SERVER ['HTTP_USER_AGENT']; / / Haal de user-agent string van de gebruiker.    if ($ stmt = $ mysqli -> bereiden ("? SELECT wachtwoord FROM leden WHERE id = LIMIT 1")) {   $ Stmt -> bind_param ('i', $ user_id); / / Bind '$ user_id "om parameter.  $ Stmt -> execute (); / / Uitvoeren van de voorbereide query.  $ Stmt -> store_result ();    if ($ stmt -> NUM_ROWS == 1) {/ / Als de gebruiker bestaat  $ Stmt -> bind_result ($ wachtwoord); / / krijgen variabelen uit resultaat.  $ Stmt -> fetch ();  $ Login_check = hash ('sha512', $ password $ user_browser.);  if ($ login_check == $ login_string) {  / / Ingelogd!!  return true;  } Else {  / / Niet ingelogd  return false;  }  } Else {  / / Niet ingelogd  return false;  }  } Else {  / / Niet ingelogd  return false;  }  } Else {  / / Niet ingelogd  return false;  }  } 

Maak verwerken pagina's

  1. 1
    Maak de verwerking pagina aanmelden (process_login. Php).
    Als na onze vorige voorbeeld, moet dit worden genoemd process_login.php.
    Inloggen verwerking pagina (process_login.php)
     zijn 'db_connect.php';   zijn 'functions.php';   sec_session_start (); / / Onze op maat veilige manier van het starten van een php sessie.     if (isset ($ _POST ['email'], $ _POST ['p'])) {     $ Email = $ _POST ['email'];    $ Wachtwoord = $ _POST ['p']; / / De hashed wachtwoord.    if (login ($ email, $ wachtwoord, $ mysqli) == true) {    / / Inloggen succes    echo 'Succes: U bent ingelogd';    } Else {    / / Aanmelden mislukt    header ('Location:.? / login.php error = 1');    }   } Else {     / / De juiste POST variabelen werden niet gezonden naar deze pagina.    echo 'Invalid Request';   }   

  2. 2
    Maak een logout script.
    Logout script (logout.php):
      

    Opmerking: Het is misschien een goed idee om CSRF bescherming voegen hier alsof iemand een link met deze pagina of andere manier verborgen te sturen zijn. De gebruiker wordt uitgelogd.
  3. 3
    Registratiepagina.
    Hash script:
      / / De hash wachtwoord van de vorm  $ Wachtwoord = $ _POST ['p'];   / / Creëer een willekeurig zout  $ Random_salt = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true));  / / Maak gezouten wachtwoord (Pas op dat u meer dan het seizoen)  $ Password = hash ('sha512', $ password $ random_salt.);    / / Voeg je insert aan database-script hier.  / / Zorg ervoor dat je prepared statements gebruiken!  if ($ insert_stmt = $ mysqli -> bereiden ("INSERT INTO leden (gebruikersnaam, e-mail, wachtwoord, zout) VALUES (,,,)??? ')) {   $ Insert_stmt -> bind_param ('ssss', $ gebruikersnaam, $ email, $ wachtwoord, $ random_salt);   / / Uitvoeren van de voorbereide query.  $ Insert_stmt -> execute ();  } 

    Zorg ervoor dat de waarde van $ _POST ['p'] is al gehashed van javascript, als u geen gebruik maakt van deze methode, omdat je het wachtwoord wilt server side valideren zorg dan dat je hash het.

Maak javascript bestanden

  1. 1
    Maak sha512. Js-bestand
    Het bestand kan worden gedownload van pajhome.org.uk
  2. 2
    Formulieren maken. Js-bestand
    Javascript vorm file (forms.js):
     functie formhash (vorm, wachtwoord) {    / / Maak een nieuw element ingevoerd, zal dit worden uit hashed veld wachtwoord.    var p = document createElement ("input").;    / / In het nieuwe element aan ons formulier.    . vorm appendChild (p);    . p name = "p";    p. type = "hidden"    . p-waarde = hex_sha512 (password. waarde);    / / Zorg dat de plaintext wachtwoord wordt niet verzonden.    . password value = "";    / / Tot slot weten.    . formulier ();   }   

Maak een HTML-pagina's

  1. 1
    Maak het login formulier (login. Php).
    Dit is een HTML-formulier met twee tekstvelden, met de naam "e-mail" en "password". De Javascript genereert vervolgens een hash van het wachtwoord, en stuurt de "e" en "p" (de hash wachtwoord) naar de server.
    Bij het ​​inloggen, is het het beste om iets dat niet openbaar is, te gebruiken voor deze gids gebruiken we de e-mail als de login-id, kan de gebruikersnaam dan gebruikt worden om de gebruiker te identificeren. Als de e-mail is verborgen het voegt wel een variabele voor het hacken van accounts.
    HTML login formulier:
     <Script type = "text / javascript" src = "sha512.js"> </ script>   <Script type = "text / javascript" src = "forms.js"> </ script>   <? Php   if (isset ($ _GET ['error'])) {   echo 'Fout met inloggen!';   }   >   <Form action = "process_login.php" method = "post" name = "LOGIN_FORM">    E-mail: <input type = "text" name = "email" /> <br />    Password: <input type = "password" name = "password" id = "password" /> <br />    <Input type = "button" value = "Login" onclick = "formhash (this.form, this.form.password);" />   </ Form>   

    Opmerking: Hoewel we het wachtwoord hebt gecodeerd, zodat het niet in platte tekst wordt verzonden, wordt het aanbevolen dat u het https-protocol (TLS / SSL) gebruiken voor het versturen van wachtwoorden. (Zie: Netwerk afluisteren ).

Het beschermen van pagina's

  1. 1
    Pagina bescherming script.
    Het beschermen van pagina's:
      / / Include databaseverbinding en functies hier.  sec_session_start ();  if (login_check ($ mysqli) == true) {    / / Voeg je beveiligde pagina-inhoud hier!    } Else {  echo 'Je bent niet bevoegd om deze pagina, gelieve in te loggen. <br/> ';  } 

    Zorg ervoor dat u deze functie gebruiken om te controleren of de gebruiker indien ingelogd

Tips

  • Met zeer weinig wijzigingen deze bijvoorbeeld scripts kunnen worden aangepast om te werken met andere SQL-systemen, zoals of.
  • Blijf weg van de md5 () functie in login scripts, wordt de md5 hash-algoritme nu beschouwd.
  • Gebruik HTML en CSS naar het login formulier en output pagina's opmaken naar uw wens.

Verder lezen

Waarschuwingen

  • Niets is 100% veilig. Vergeet niet om te verblijven in lijn met de nieuwste security nieuws te blijven verbeteren van de beveiliging van uw scripts.
  • Zorg ervoor dat de gebruiker niet kan zien uw php script, wat kan occure door een verkeerde server setup. Er is een mogelijkheid van de gebruikers verzamelen van informatie over uw database en wachtwoorden als je php code is zichtbaar.