Wkuno

Hvordan lage en sikker pålogging script i PHP og MySQL

Med flere og flere historier om hacking i nyhetene, er utviklere på jakt etter de beste måter å sikre deres nettsted. Hvis nettstedet har et medlem system, kan det være i faresonen for å bli hacket og brukernes data kan være kompromittert. Denne guiden vil vise deg de beste måtene å skape din bruker systemet og pålogging slik at den er så sikker som mulig.
Etter denne guiden vil bidra til å forebygge mot alle typer angrep som hackere kan bruke til å få kontroll over andre brukeres kontoer, slette kontoer og / eller endre data. Nedenfor er en liste over mulige angrep denne guiden forsvarer mot.

Innhold

  • En ting du trenger
  • 2 trinn
    • 2,1 konfigurere tjeneren
    • 2.2 Konfigurer mySQL database
    • 2.3 Opprette Database Connection Page
    • 2.4 Opprett PHP Funksjoner
    • 2.5 Lag Processing Sider
    • 2,6 lage JavaScript-filer
    • 2,7 lage HTML-sider
    • 2.8 Beskytte Sider
  • 3 tips
  • 4 Videre Reading
  • 5 Advarsler
  • 6 Relaterte Googles

Ting du trenger

Som vi skal bruke mysqli_ * sett med PHP-klasser for å få tilgang til vår MySQL database må du følgende versjoner av PHP og MySQL.

  • PHP versjon 5 eller senere
  • MySQL versjon 4.1.3 eller nyere

For å sjekke hvilken versjon av PHP og MySQL på serveren din bruke funksjonen.

Trinn

Hvordan lage en sikker pålogging script i PHP og MySQL. Installer PHP og MySQL på serveren din.
Hvordan lage en sikker pålogging script i PHP og MySQL. Installer PHP og MySQL på serveren din.

Konfigurere serveren

  1. 1
    Installer PHP og MySQL på serveren din.
    De fleste web hosting tjenester vil ha PHP og MySQL allerede er installert, vil du bare nødt til å sjekke at de har de nyeste versjonene av PHP og MySQL for denne veilederen skal fungere. Hvis du har din egen server eller datamaskin, se veiledningene nedenfor om hvordan du installerer PHP og MySQL.

Konfigurer mysql database

  1. 1
    Lag en mysql database.
    Se hvordan du Create-a-database-in-phpmyadmin.
    Lag database kode:
      

    Merk: Enkelte vertstjenester ikke tillate deg å lage en database via phpMyAdmin, Lær hvordan du gjør det i cPanel.
  2. 2
    Lag en bruker med bare velge, UPDATE og INSERT privilegier.
    • Bruker: "sec_user"
    • Passord: "eKcGZr59zAa2BEWU"

    Opprett bruker koden:
      

    Merk: Det er en god idé å endre passordet i koden ovenfor når du kjører på din egen server. (Pass på at du endrer din PHP-kode også.) Husk at det ikke trenger å være et passord som du kan huske så gjør det så komplisert som mulig. Her er et tilfeldig passord generator.
  3. 3
    Lag en mysql tabell kalt "medlemmer".
    Skape "medlemmer" tabell:
      

    Vi bruker CHAR datatype for felt vi kjenner lengden, som felt "password" og "salt" vil alltid være 128 tegn. Ved hjelp av CHAR her sparer på prosessorkraft.
  4. 4
    Lag en tabell for å lagre påloggingsforsøk.
    Skape "login_attempts" tabell:
      
  5. 5
    Lag test rad i tabellen "medlemmer".
    Som vi ikke skaper en registreringsside, vil det være viktig å kunne teste login script. Nedenfor er skript for å opprette en bruker med disse detaljene:
    • Brukernavn: test_user
    • E-post: test@example.com
    • Passord: 6ZaxN2Vzm9NUJT2y

    Legg testbruker:
      

Opprette database tilkobling side

  1. 1
    Opprette database tilkobling side.
    Database connect (db_connect.php):
      

Lag PHP funksjoner

Disse funksjonene vil gjøre alt behandlingen av login script. Legg alle funksjoner til en side som heter "functions.php".

  1. 1
    Sikkert starte en PHP-økt.
    Det viktig å ikke bare sette "session_start ();" på toppen av hver side som du ønsker å bruke php økter, Hvis du er virkelig bekymret for sikkerheten da dette er hvordan du bør gjøre det. Vi kommer til å lage en funksjon som heter "sec_session_start", vil dette starte en php session på en sikker måte. Du bør kalle denne funksjonen øverst på en side du ønsker tilgang til en php session variabel. Hvis du er virkelig bekymret for sikkerheten og personvernet for dine cookies, ta en titt på denne artikkelen Create-a-secure-session-managment-system-in-php-og-mysql.
    Sikker sesjon start funksjon:
      funksjon sec_session_start () {  $ Session_name = 'sec_session_id'; / / Sett en tilpasset session navn  $ Sikker = false; / / Sett til sann hvis du bruker https.  $ Httponly = true; / / Dette stopper javascript å kunne få tilgang økten id.    ini_set ('session.use_only_cookies', 1), / / Tvinger økter for å bare bruke informasjonskapsler.  $ CookieParams = session_get_cookie_params (); / / Gets nåværende cookies parametere.    session_name ($ session_name); / / Setter økten navn til ett sett ovenfor.  session_start (); / / Start php session  session_regenerate_id (true); / / regenerert økten, må du slette den gamle.  } 

    Også ved å bruke "session_regenerate_id ()"-funksjonen, som regenererer session id på hver side reload, bidrar til å forhindre økt kapring.
    Merk: Hvis du bruker https i din innlogging søknaden sette "$ sikker" variabelen til true.
  2. 2
    Lag login funksjon.
    Sikker pålogging funksjon:
      funksjon pålogging ($ email, $ passord, $ mysqli) {/ / Bruke preparerte uttalelser betyr at SQL-injeksjon er ikke mulig hvis ($ stmt = $ mysqli -.> forberede ("SELECT id, brukernavn, passord, salt FRA medlemmer WHERE epost = LIMIT 1 ")) {$ stmt -> bind_param ('s', $ email), / / Bind"?. $ epost "til parameter $ stmt -> utføre (), / / Kjør forberedt spørringen $ stmt -. > store_result (); $ stmt -> bind_result ($ user_id, $ username, $ db, $ salt); / / få variabler fra Resultatet $ stmt -> hente ();. $ passord = hash ('SHA512', $ passord . $ salt);. / / hash passordet med den unike salt if ($ stmt -> NUM_ROWS == 1) {/ / Hvis brukeren finnes / / Vi sjekker om kontoen er sperret av for mange påloggingsforsøk if (checkbrute ($ user_id, $ mysqli) == true) {/ / Konto er låst / / Send en e-post til bruker å si sin konto er låst return false;} else {if ($ db == $ passord) {/ / Sjekk om passord i databasen passer til passordet til brukeren presentert / / passord er riktig $ user_browser = $ _SERVER ['HTTP_USER_AGENT'];.! / / Få user-agent streng av brukeren $ user_id = preg_replace ("/ [^ 0. -9] + / "," ", $ user_id), / / XSS beskyttelse som vi kan skrive ut denne verdien $ _SESSION ['user_id'] = $ user_id, $ username = preg_replace (" / [^ a-zA-Z0- 9_ \ -] + / "," ", $ username), / / XSS beskyttelse som vi kan skrive ut 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 ; } } } Logg vellykket return true;} else {/ / passord er ikke riktig / / Vi registrerer dette forsøket i databasen $ nå = tid (); $ mysqli -> spørring ("INSERT INTO login_attempts (user_id, tid) VALUES ('$. user_id ',' $ bedriften ') "); return false;}}} else {/ / Det finnes ingen bruker return false;.}}} 
  3. 3
    Brute force funksjon.
    Lag login_check funksjon:
      funksjon checkbrute ($ user_id, $ mysqli) {  / / Få tidsstempel på nåværende tidspunkt  $ Nå = tid ();  / / Alle påloggingsforsøk regnes fra de siste to timene.  $ Valid_attempts = $ nå - (2 * 60 * 60);     if ($ stmt = $ mysqli -> forberede ("? SELECT tid fra login_attempts WHERE user_id = OG tid> '$ valid_attempts'")) {   $ Stmt -> bind_param ('i', $ user_id);   / / Kjør forberedt spørringen.  $ Stmt -> utføre ();  $ Stmt -> store_result ();  / / Hvis det har gått mer enn fem mislykkede pålogginger  if ($ stmt -> NUM_ROWS> 5) {  return true;  } Else {  return false;  }  }  } 

    Brute force angrep er vanskelig å hindre noen måter vi kan hindre dem bruker et CAPTCHA test, låsing brukerkontoer og legge en forsinkelse på mislykkede pålogginger, slik at brukeren ikke kan logge inn i ytterligere 30 sekunder.
    Når møtt med dette problemet de fleste utviklerne rett og slett blokkere IP-adressen etter viss mislykkede pålogginger. Med mange verktøy for å automatisere prosessen, kan disse verktøyene gå gjennom en rekke fullmakter og med endre IP på hver forespørsel. Blokkering av alle disse IP-adressene kan bety at du blokkerer legitime brukere også.
  4. 4
    Sjekk innlogget status.
    Vi gjør dette ved å krysse av på "user_id" og "login_string" session variabler. Den "login_string" SESSION variabelen har brukerne Nettleserinfo nøkkeltransformert sammen med passordet. Vi bruker Nettleserinfo fordi det er svært lite sannsynlig at brukeren vil endre sin nettleser mid-session. Å gjøre dette bidrar til å hindre kidnapping av økta.
    Lag login_check funksjon:
      funksjon login_check ($ mysqli) {  / / Sjekk om alle øktvariabler er satt  if (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']; / / Få user-agent streng av brukeren.    if ($ stmt = $ mysqli -> forberede ("? SELECT passord FRA medlemmer WHERE id = LIMIT 1")) {   $ Stmt -> bind_param ('i', $ user_id), / / Bind "$ user_id" til parameter.  $ Stmt -> utføre (), / / Kjør forberedt spørringen.  $ Stmt -> store_result ();    if ($ stmt -> NUM_ROWS == 1) {/ / Hvis brukeren finnes  $ Stmt -> bind_result ($ passord); / / få variabler fra resultatet.  $ Stmt -> hente ();  $ Login_check = hash ('SHA512', $ passord $ user_browser.);  if ($ login_check == $ login_string) {  / / Logget inn!  return true;  } Else {  / / Ikke logget inn  return false;  }  } Else {  / / Ikke logget inn  return false;  }  } Else {  / / Ikke logget inn  return false;  }  } Else {  / / Ikke logget inn  return false;  }  } 

Lag behandling sider

  1. 1
    Opprette login behandling siden (process_login. Php).
    Hvis følge vårt eksempel, bør dette bli navngitt process_login.php.
    Logg behandling siden (process_login.php)
     inkluderer 'db_connect.php';   inkludere "functions.php ';   sec_session_start (); / / Våre tilpassede sikker måte å starte en php session.     if (isset ($ _POST ['epost'], $ _POST ['p'])) {     $ Email = $ _POST ['epost'];    $ Passord = $ _POST ['p']; / / The hashet passord.    if (pålogging ($ email, $ passord, $ mysqli) == true) {    / / Login suksess    echo 'suksess: Du har blitt logget inn';    } Else {    / / Login mislyktes    header ('Location:.? / login.php feil = 1');    }   } Else {     / / Riktig POST variablene ikke ble sendt til denne siden.    echo 'Ugyldig forespørsel ";   }   

  2. 2
    Lag en utlogging script.
    Utlogging script (logout.php):
      

    Merk: Det kan være en god idé å legge CSRF beskyttelse her som om noen sende en link med denne siden gjemt en eller annen måte. Brukeren vil bli logget ut.
  3. 3
    Registreringssiden.
    Hash script:
      / / Den hashet passord fra skjemaet  $ Passord = $ _POST ['p'];   / / Opprett en tilfeldig salt  $ Random_salt = hash ('SHA512', uniqid (mt_rand (1, mt_getrandmax ()), true));  / / Opprett saltet passord (Forsiktig så du ikke over sesongen)  $ Passord = hash ('SHA512', $ passord $ random_salt.);    / / Legg til din innsats til databasen skriptet her.  / / Pass på at du bruker preparerte uttalelser!  if ($ insert_stmt = $ mysqli -> forberede ("INSERT INTO medlemmer (brukernavn, e-post, passord, salt) VALUES (,,,)??")) {   $ Insert_stmt -> bind_param ('ssss ", $ brukernavn, $ email, $ passord, $ random_salt);   / / Kjør forberedt spørringen.  $ Insert_stmt -> utføre ();  } 

    Sørg for at verdien av $ _POST ['p'] allerede hashet fra javascript, hvis du ikke bruker denne metoden fordi du ønsker å validere passord server side så sørg for at du hash det.

Lag javascript filer

  1. 1
    Lag SHA512. JS-fil
    Filen kan lastes ned fra pajhome.org.uk
  2. 2
    Lag skjemaer. JS-fil
    Javascript skjema fil (forms.js):
     funksjon formhash (form, passord) {    / / Lag et nytt element inngang, vil dette være ute hashet passord.    Var p = dokument createElement ("input").;    / / Legg til nytt element til skjemaet vårt.    . skjema appendChild (p);    . p name = "p";    p. type = "hidden"    . p-verdi = hex_sha512 (password. verdi);    / / Pass på at klartekst passord blir ikke sendt.    . passord value = "";    / / Slutt på send.    . skjema sende ();   }   

Lage HTML-sider

  1. 1
    Opprett login form (pålogging. Php).
    Dette er en HTML-skjema med to tekstfelt, oppkalt "e-post" og "passord". Javascript vil da generere en hash av passordet, og sende "e-post" og "p" (den hashet passord) til serveren.
    Når du logger deg inn, er det best å bruke noe som ikke er offentlig, for denne guiden vi bruker e-post som login id, kan brukernavnet deretter brukes til å identifisere brukeren. Hvis e-posten er skjult det legger en annen variabel for hacking kontoer.
    HTML login skjema:
     <Script type = "text / javascript" src = "sha512.js"> </ script>   <Script type = "text / javascript" src = "forms.js"> </ script>   <? Php   if (isset ($ _GET ['error'])) {   echo 'Feil Innlogging!';   }   >   <Form action = "process_login.php" method = "post" name = "login_form">    E-post: <input type = "text" name = "e-post" /> <br />    Passord: <input type = "password" name = "passord" id = "passord" /> <br />    <Input type = "button" value = "Logg inn" onclick = "formhash (this.form, this.form.password);" />   </ Form>   

    Merk: Selv om vi har kryptert passordet slik at det ikke blir sendt i klartekst, anbefales det at du bruker https-protokollen (TLS / SSL) når du sender passord. (Se: Nettverk avlytting ).

Beskytte sider

  1. 1
    Sidebeskyttelse script.
    Beskytte sider:
      / / Ta database tilkobling og funksjoner her.  sec_session_start ();  if (login_check ($ mysqli) == true) {    / / Legg til din beskyttet side innhold her!    } Else {  echo 'Du er ikke autorisert til å få tilgang til denne siden, vennligst logg inn. <br/> ';  } 

    Sørg for at du bruker denne funksjonen til å sjekke om brukeren hvis logget inn

Tips

  • Med svært få endringer disse eksempel scripts kan bli endret for å jobbe med andre SQL systemer som eller.
  • Hold deg unna md5 ()-funksjonen i login scripts, er md5 hashing algoritme nå vurderes.
  • Bruk HTML og CSS til å formatere login form og utgang sider til din smak.

Videre lesning

Advarsler

  • Ingenting er 100% sikker. Husk å holde deg à jour med de siste sikkerhets nyheter å holde bedre sikkerheten for skript.
  • Sørg for at brukeren ikke kan se din php script, som kan oppstå på grunn av feil server oppsett. Det er en mulighet for brukerne å samle informasjon om dine databasen og passord hvis din PHP-kode er synlig.