Wkudk

Hvordan du opretter en sikker login script i PHP og MySQL

Med flere og flere historier om hacking i nyhederne, er udviklere på udkig efter de bedste måder at sikre deres site. Hvis dit websted har et medlem system, kan det være i fare for at blive hacket, og dine brugeres data kan blive kompromitteret. Denne guide vil vise dig de bedste måder at skabe dit brugernavn, og login, så det er så sikker som muligt.
Efter denne guide vil hjælpe med at forhindre mod alle former for angreb, som hackere kan bruge til at få kontrol over andre brugeres konti, slette regnskaber og / eller ændre data. Herunder er en liste over mulige angreb denne vejledning forsvarer imod.

Indhold

  • 1 Ting du behøver
  • 2 skridt
    • 2.1 Konfiguration af din server
    • 2.2 Konfigurer mySQL database
    • 2.3 Opret database Connection Side
    • 2.4 Opret PHP funktioner
    • 2.5 Opret Processing Pages
    • 2.6 Opret JavaScript-filer
    • 2.7 Opret HTML-sider
    • 2.8 Beskyttelse Pages
  • 3 tips
  • 4 Yderligere læsning
  • 5 Advarsler
  • 6 Relaterede Googles

Ting du behøver

Som vi vil bruge mysqli_ * sæt af PHP klasser adgang til vores mySQL database, du bliver nødt til følgende versioner af PHP og MySQL.

  • PHP version 5 eller nyere
  • MySQL versionen 4.1.3 eller nyere

For at kontrollere den version af PHP og MySQL på din server bruge funktionen.

Steps

Hvordan du opretter en sikker login script i PHP og MySQL. Installer PHP og MySQL på din server.
Hvordan du opretter en sikker login script i PHP og MySQL. Installer PHP og MySQL på din server.

Konfigurere serveren

  1. 1
    Installer PHP og MySQL på din server.
    De fleste web-hosting-tjenester vil have PHP og MySQL allerede er installeret, vil du bare nødt til at tjekke de har de nyeste versioner af PHP og MySQL til denne vejledning til at arbejde. Hvis du har din egen server eller computer, de vejledninger nedenfor om, hvordan du installerer PHP og MySQL.

Konfigurer MySQL-database

  1. 1
    Opret en MySQL-database.
    Se, hvordan du opretter-a-database-i-phpmyadmin.
    Opret database code:
    
    

    Bemærk: Nogle hosting-tjenester ikke tillade dig at oprette en database via phpMyAdmin, Lær at gøre det i cpanel.
  2. 2
    Opret en bruger med kun vælge, UPDATE og INSERT privilegier.
    • Bruger: "sec_user"
    • Password: "eKcGZr59zAa2BEWU"

    Opret bruger kode:
    
    

    Bemærk: Det er en god ide at ændre adgangskoden i ovenstående kode, når du kører på din egen server. (Sørg for at du ændrer din PHP-kode også.) Husk det behøver ikke at være en adgangskode, som du kan huske, så gør, er så kompliceret som muligt. Her er en tilfældig adgangskode generator.
  3. 3
    Opret en mysql tabel ved navn "medlemmerne".
    Skabe den "medlemmer" tabel:
    
    

    Vi bruger CHAR datatype for felter vi kender længden af, da felterne "password" og "salt" vil altid være 128 tegn lang. Brug CHAR her sparer på regnekraft.
  4. 4
    Oprette en tabel til at gemme login-forsøg.
    Skabe den "login_attempts" tabel:
    
    
  5. 5
    Opret test række i tabel "medlemmer".
    Da vi ikke er ved at skabe en registrering side, vil det være vigtigt at være i stand til at teste dit login script. Nedenfor er script til at oprette en bruger med disse oplysninger:
    • Brugernavn: test_user
    • E-mail: test@example.com
    • Password: 6ZaxN2Vzm9NUJT2y

    Tilføj testbruger:
    
    

Opret database forbindelse side

  1. 1
    Opret databaseforbindelse siden.
    Database connect (db_connect.php):
    
    

Opret PHP funktioner

Disse funktioner vil gøre alt behandling af login script. Tilføj alle de funktioner til en side kaldet "functions.php".

  1. 1
    Trygt starte en PHP session.
    Det er vigtigt ikke bare at sætte "session_start ();" øverst på hver side, som du ønsker at bruge php sessioner, hvis du virkelig er bekymret for sikkerheden, så dette er, hvordan du bør gøre det. Vi kommer til at oprette en funktion kaldet "sec_session_start", vil det starte en php session på en sikker måde. Du skal kalde denne funktion i toppen af ​​enhver side, du ønsker at få adgang til en php session variabel. Hvis du virkelig er bekymret for sikkerheden og privatlivets fred for dine cookies, have et kig på denne artikel Create-a-secure-session-managment-systemet-i-php-and-mysql.
    Sikker session startfunktion:
     funktion sec_session_start () {
     $ Session_name = 'sec_session_id «/ / Sæt et brugerdefineret session navn
     $ Sikker = false; / / Set til sand, hvis du bruger https.
     $ HttpOnly = true / / Dette forhindrer javascript at kunne få adgang til session id.
     
     ini_set ('session.use_only_cookies', 1) / / Tvinger sessioner til kun at bruge cookies.
     $ CookieParams = session_get_cookie_params () / / Gets nuværende cookies params.
     
     session_name ($ session_name) / / Sætter session navn til et sæt ovenfor.
     session_start () / / Start php session
     session_regenerate_id (sand) / / regenereret sessionen, slet den gamle.
     }
    

    Også ved at bruge "session_regenerate_id ()" funktionen, som regenererer session id på hver side reload, medvirke til at forebygge sessionskapring.
    Bemærk: Hvis du bruger https i dit login ansøgning indstille "$ sikker" variable til true.
  2. 2
    Opret login-funktion.
    Sikkert login-funktion:
     Funktionen login ($ email, $ password, $ MySQLi) {/ / Brug forberedte udsagn betyder, at SQL-injektion er ikke muligt, hvis ($ stmt = $ MySQLi -.> forberede ("SELECT id, brugernavn, password, salt fra medlemmerne WHERE email = GRÆNSE 1 ")) {$ stmt -> bind_param ('s', $ email) / / indbinding"?. $ email "til parameter $ stmt -> udføre () / / Udfør forberedte forespørgslen $ stmt -. > store_result (); $ stmt -> bind_result ($ user_id, $ brugernavn, $ DB_PASSWORD, $ salt) / / få variabler fra resultatet $ stmt -> hente ();. $ password = hash ('SHA512', $ password . $ salt). / / hash adgangskoden med den unikke salt if ($ stmt -> NUM_ROWS == 1) {/ / Hvis brugeren eksisterer / / Vi tjekker, om kontoen er låst for mange login-forsøg, hvis (checkbrute ($ user_id, $ MySQLi) == true) {/ / konto er låst / / Send en e-mail til bruger sige deres konto er låst return false;} else {if ($ DB_PASSWORD == $ password) {/ / Tjek om adgangskode i databasen svarer til adgangskoden den indsendte brugeren / / Password er korrekt $ user_browser = $ _SERVER ['HTTP_USER_AGENT'];.! / / Hent bruger-agent-streng af brugerens $ user_id = preg_replace ("/ [^ 0. -9] + / "," ", $ user_id) / / XSS beskyttelse som vi måske udskrive denne værdi $ _SESSION ['user_id'] = $ user_id, $ username = preg_replace (" / [^ a-zA-Z0- 9_ \ -] + / "," ", $ brugernavn) / / XSS beskyttelse, som vi kunne udskrive denne Login successful. return true ; } else { // Password is not correct // We record this attempt in the database $now = time ( ) ; $mysqli -> query ( "INSERT INTO login_attempts (user_id, time) VALUES (' $user_id ', ' $now ')" ) ; return false ; } } } else { // No user exists. return false ; } } } Log succes returnere sandt;} else {/ / Password er ikke korrekt / / Vi registrerer dette forsøg i databasen $ nu = tid (); $ MySQLi -> query ("INSERT INTO login_attempts (user_id, tid) VALUES ('$. user_id ',' $ nu ') "); return false;}}} else {/ / Der findes ingen bruger returnere false;.}}} 
  3. 3
    Brute force funktion.
    Opret login_check funktion:
     Funktionen checkbrute ($ user_id, $ MySQLi) {
     / / Hent tidsstemplet aktuel tid
     $ Nu = tid ();
     / / Alle login-forsøg regnes fra de sidste 2 timer.
     $ Valid_attempts = $ nu - (2 * 60 * 60); 
     
     if ($ stmt = $ MySQLi -> forberede ("? SELECT tid FROM login_attempts WHERE user_id = AND tid> '$ valid_attempts" ")) { 
     $ Stmt -> bind_param ('i', $ user_id); 
     / / Udfør forberedte forespørgsel.
     $ Stmt -> udføre ();
     $ Stmt -> store_result ();
     / / Hvis der har været mere end 5 mislykkede logins
     if ($ stmt -> NUM_ROWS> 5) {
     returnere sandt;
     } Else {
     return false;
     }
     }
     }
    

    Brute force-angreb er svære at undgå et par måder, vi kan forhindre dem bruger en CAPTCHA test, låsning brugerkonti og tilføje en forsinkelse på mislykkede logins, så brugeren kan ikke logge ind i yderligere 30 sekunder.
    Når man står med dette problem fleste udviklere simpelthen blokere IP-adressen efter vis mængde mislykkede logins. Med mange værktøjer til at automatisere processen, kan disse værktøjer gå gennem en række af fuldmagter og endda ændre IP på hver anmodning. Blokering alle disse IP-adresser kan betyde du blokerer legitime brugere så godt.
  4. 4
    Check logget ind status.
    Vi gør dette ved at kontrollere de "user_id" og "login_string" session variabler. Den "login_string" SESSION variabel har brugere Browser Info hashed sammen med adgangskoden. Vi bruger Browser Info fordi det er meget usandsynligt, at brugeren vil ændre deres browser mid-session. Gør dette hjælper med at forhindre kapring af sessionen.
    Opret login_check funktion:
     Funktionen login_check ($ MySQLi) {
     / / Tjek om alle session variabler er sat
     if (isset ($ _SESSION ['user_id'], $ _SESSION ['brugernavn'], $ _SESSION ['login_string'])) {
     $ User_id = $ _SESSION ['user_id'];
     $ Login_string = $ _SESSION ['login_string'];
     $ Username = $ _SESSION ['brugernavn'];
     
     $ User_browser = $ _SERVER ['HTTP_USER_AGENT'] / / Hent user-agent streng af brugeren.
     
     if ($ stmt = $ MySQLi -> forberede ("? SELECT password FROM medlemmer WHERE id = GRÆNSE 1")) { 
     $ Stmt -> bind_param ('i', $ user_id) / / indbinding "$ user_id" til parameter.
     $ Stmt -> udføre () / / Udfør forberedte forespørgsel.
     $ Stmt -> store_result ();
     
     if ($ stmt -> NUM_ROWS == 1) {/ / Hvis brugeren eksisterer
     $ Stmt -> bind_result ($ password) / / få variabler fra resultat.
     $ Stmt -> hente ();
     $ Login_check = hash ('SHA512', $ password $ user_browser.);
     if ($ login_check == $ login_string) {
     / / Logget ind!!
     returnere sandt;
     } Else {
     / / Ikke logget ind
     return false;
     }
     } Else {
     / / Ikke logget ind
     return false;
     }
     } Else {
     / / Ikke logget ind
     return false;
     }
     } Else {
     / / Ikke logget ind
     return false;
     }
     }
    

Opret forarbejdning sider

  1. 1
    Opret login behandling siden (process_login. Php).
    Hvis man efter vores tidligere eksempel, bør dette være navngivet process_login.php.
    Login forarbejdning side (process_login.php)
     omfatte "db_connect.php« omfatter "functions.php« sec_session_start ();. / / Vores custom sikker måde at starte en php session if (isset ($ _POST ['email'], $ _POST ['p']) ) {$ email = $ _POST ['email'], $ password = $ _POST ['p']. / / Den hashed adgangskode, hvis (login ($ email, $ password, $ MySQLi) == true) {/ / Login succes echo 'Succes: Du er blevet logget ind!';} else {/ / Login mislykkedes header ('Location:.? / login.php fejl = 1');}} else {/ / De korrekte POST variabler var ikke sendt til denne side echo 'Ugyldig Request «.} 

  2. 2
    Opret en logout script.
    Log af script (logout.php):
    
    

    Bemærk: Det kan være en god idé at tilføje CSRF beskyttelse her som hvis nogen sende et link til denne side skjult måde. Brugeren vil blive logget ud.
  3. 3
    Tilmelding siden.
    Hash script:
     / / Den hashed password fra formularen
     $ Password = $ _POST ['p']; 
     / / Opret en tilfældig salt
     $ Random_salt = hash ('SHA512' uniqid (mt_rand (1, mt_getrandmax ()), true));
     / / Opret saltede adgangskode (forsigtig med ikke at sæsonen)
     $ Password = hash ('SHA512', $ password $ random_salt.);
     
     / / Tilføj din insert til database script her.
     / / Sørg for at bruge forberedte udsagn!
     if ($ insert_stmt = $ MySQLi -> forberede ("INSERT INTO medlemmer (brugernavn, email, password, salt) VALUES (,,,)???")) { 
     $ Insert_stmt -> bind_param (»ssss ', $ brugernavn, $ email, $ password, $ random_salt); 
     / / Udfør forberedte forespørgsel.
     $ Insert_stmt -> udføre ();
     }
    

    Sørg for, at værdien af ​​$ _POST ['p'] er allerede hashet fra javascript, hvis du ikke bruger denne metode, fordi du ønsker at validere password server side så sørg for hash det.

Opret javascript-filer

  1. 1
    Opret SHA512. Js-fil
    Filen kan downloades fra pajhome.org.uk
  2. 2
    Opret formularer. Js-fil
    Javascript formular fil (forms.js):
     Funktionen formhash (form, password) { 
      / / Opret et nyt element ind, vil dette være ude hashed adgangskode. 
      var p = dokument createElement ("input").; 
      / / Tilføj nyt element til vores formular. 
      . formular appendChild (p); 
      . p name = "p"; 
      s.. type = "hidden" 
      . p-værdi = hex_sha512 (password. værdi); 
      / / Sørg for, alm password ikke bliver sendt. 
      . password value = ""; 
      / / Endelig indsend formularen. 
      . formularindsendelse (); 
     } 
     

Opret HTML-sider

  1. 1
    Opret login form (login. Php).
    Dette er en HTML-formular med to tekstfelter, hedder "email" og "password". Javascript vil derefter generere en hash af password, og send "email" og "p" (den hashed password) til serveren.
    Når du logger ind, er det bedst at bruge noget, der ikke er offentlig, for denne guide vil vi bruger e-mail som login id, kan det brugernavn derefter bruges til at identificere brugeren. Hvis e-mailen er gemt det tilføjer en anden variabel for hacking konti.
    HTML login-formular:
     <Script type = "text / javascript" src = "sha512.js"> </ script> 
     <Script type = "text / javascript" src = "forms.js"> </ script> 
     <? Php 
     if (isset ($ _GET ['error'])) { 
     echo 'Fejllogning In! "; 
     } 
     ?> 
     <Formular 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> 
     

    Bemærk: Selv om vi har krypteret password, så det ikke bliver sendt i klartekst, anbefales det at du bruger HTTPS-protokollen (TLS / SSL), når du sender passwords. (Se: Netværk aflytning ).

Beskyttelse sider

  1. 1
    Sidebeskyttelse script.
    Beskyttelse sider:
     / / Medtag database forbindelse og fungerer her.
     sec_session_start ();
     if (login_check ($ MySQLi) == true) {
     
     / / Tilføj dit beskyttede sideindhold her!
     
     } Else {
     echo 'Du har ikke tilladelse til at få adgang til denne side, skal du logge ind. <br/> ';
     }
    

    Sørg for at bruge denne funktion til at kontrollere, om brugeren, hvis logget ind

Tips

  • Med meget få ændringer, som disse eksempler scripts kan modificeres til at arbejde med andre SQL systemer såsom eller.
  • Hold dig væk fra md5 () funktion i login-scripts, er md5 hashalgoritme nu overvejes.
  • Brug HTML og CSS til at formatere login form og output sider til din smag.

Yderligere læsning

Advarsler

  • Intet er 100% sikker. Husk at bo i harmoni med de seneste sikkerheds nyheder at holde forbedre sikkerheden af ​​dine scripts.
  • Sørg for, at brugeren ikke kan se dit php script, som kan occure på grund af forkert server setup. Der er mulighed for brugerne at indsamle oplysninger om din database navne og adgangskoder, hvis din php-kode er synlig.