Med fler och fler historier om dataintrång i nyheterna, är utvecklare söker efter de bästa sätten att säkra deras webbplats. Om din webbplats har en medlem systemet, skulle det vara i riskzonen från att hacka och dina användares uppgifter kan äventyras. Denna guide visar dig de bästa sätten att skapa ditt användarkonto systemet och logga in så att den är så säker som möjligt.
Efter denna guide hjälper förebygga mot alla typer av attacker som hackare kan använda för att få kontroll över andra användares konton, ta bort konton och / eller ändra data. Nedanför är en lista på möjliga attacker denna guide försvarar mot.
Innehåll
|
Saker du behöver
Som vi kommer att använda mysqli_ * uppsättning PHP klasser för att få tillgång till vår MySQL-databas måste du följande versioner av PHP och MySQL.
- PHP version 5 eller senare
- MySQL version 4.1.3 eller senare
För att kontrollera vilken version av PHP och MySQL på din server använder funktionen.
Steg
Konfigurera din server
- 1Installera PHP och MySQL på din server.
De flesta webbhotell har PHP och MySQL redan är installerat, kommer du bara att kontrollera att de har de senaste versionerna av PHP och MySQL för denna guide för att fungera. Om du har din egen server eller dator, se guiderna nedan om hur du installerar PHP och MySQL.- Installera PHP och MySQL på windows.
- Installera PHP och MySQL på Linux.
- Installera PHP och MySQL på mac.
Konfigurera MySQL databas
- 1Skapa en MySQL-databas.
Se hur du Create-a-databas-in-phpMyAdmin.
Skapa databas kod:
Obs: Vissa webbhotell tjänster inte tillåter dig att skapa en databas genom phpMyAdmin, Lär dig hur man gör det i cPanel. - 2Skapa en användare med bara välja, UPDATE och INSERT privilegier.
- Användare: "sec_user"
- Lösenord: "eKcGZr59zAa2BEWU"
Skapa användarkod:
Obs: Det är en bra idé att ändra lösenordet i koden ovan när du kör på din egen server. (Se till att du ändrar din PHP-kod också.) Kom ihåg att det inte behöver vara ett lösenord som du kan komma ihåg så se till så komplicerat som möjligt. Här är ett slumpmässigt lösenord generator. - 3Skapa en MySQL tabell som heter "medlemmar".
Skapa "medlemmar" tabell:
Vi använder CHAR datatyp för fält vi vet längden på, som sätter "lösenord" och "salt" kommer alltid att vara 128 tecken långt. Använda CHAR här sparar processorkraft. - 4Skapa en tabell för att lagra inloggningsförsök.
Skapa "login_attempts" tabell: - 5Skapa testar rad i tabellen "medlemmar".
Eftersom vi inte skapar en registrering sida, kommer det att vara viktigt att kunna testa dina inloggningsuppgifter manus. Nedan finns skriptet att skapa en användare med dessa uppgifter:- Användarnamn: test_user
- Email: test@example.com
- Lösenord: 6ZaxN2Vzm9NUJT2y
Lägg testanvändare:
Skapa sida databasanslutning
- 1Skapa sidan databasanslutning.
Databas connect (db_connect.php):
Skapa PHP funktioner
Dessa funktioner kommer att göra allt behandlingen av inloggningsskripten. Lägg alla funktioner till en sida som heter "functions.php".
- 1Säkert starta en PHP-session.
Det är viktigt att inte bara sätta "session_start ();" överst på varje sida som du vill använda PHP sessioner, Om du verkligen orolig för säkerheten då det är hur du ska göra det. Vi kommer att skapa en funktion som heter "sec_session_start", kommer detta startar en php session på ett säkert sätt. Du bör kalla denna funktion högst upp på varje sida du vill komma åt en php session variabel. Om du verkligen är orolig för säkerheten och sekretessen för dina cookies, ta en titt på den här artikeln Skapa-en-säker-session-managment-system-in-php-och-mysql.
Säker session start funktion:Funktionen sec_session_start () { $ Session_name = 'sec_session_id', / / Ange en egen session namn $ Säkra = false; / / Ställ in till true om du använder https. $ HttpOnly = true; / / Detta stoppar javascript att kunna komma åt sessionen id. ini_set ('session.use_only_cookies', 1), / / Tvingar sessioner för att bara använda cookies. $ CookieParams = session_get_cookie_params (), / / Hämtar nuvarande cookies params. session_name ($ session_name), / / Ställer sessionen namn till en uppsättning ovan. session_start (), / / Starta php session session_regenerate_id (true); / / regenereras sessionen, radera den gamla. }
Också genom att använda "session_regenerate_id ()"-funktion, som regenererar Session ID på varje sida reload, bidra till att förebygga sessionskapning.
Obs: Om du använder https i dina inloggningsuppgifter ansökan ange "$ säkra" variabel till true. - 2Skapa login funktion.
Säker inloggning funktion:Funktionen inloggning ($ email, $ password, $ mysqli) {/ / Använda förberedda uttalanden innebär att SQL-injektion är inte möjligt om ($ stmt = $ mysqli -.> förbereda ("SELECT id, användarnamn, lösenord, salt från medlemmarna där e = GRÄNS 1 ")) {$ stmt -> bind_param ('s', $ email), / / Bind"?. $ e "till parametern $ stmt -> execute (); / / Kör beredd query $ stmt -. > store_result (), $ stmt -> bind_result ($ user_id, $ username, $ db_password, $ salt), / / få variabler från resultat $ stmt -> fetch (),. $ password = hash ('SHA512', $ password . $ salt),. / / hash lösenordet med den unika salt om ($ stmt -> NUM_ROWS == 1) {/ / Om användaren finns / / Vi kontrollerar om kontot är låst från alltför många inloggningsförsök om (checkbrute ($ USER_ID, $ mysqli) == true) {/ / konto är låst / / Skicka ett mail till användaren säga sitt konto är låst return false;} else {if ($ db_password == $ password) {/ / Kontrollera om lösenordet i databasen matchar lösenordet för användaren in / / lösenordet är korrekt $ user_browser = $ _SERVER ['HTTP_USER_AGENT'];.! / / Hämta user-agent string för användaren $ user_id = preg_replace ("/ [^ 0. -9] + / "," ", $ user_id), / / XSS skydd som vi kan skriva ut detta värde $ _SESSION ['user_id'] = $ user_id, $ username = preg_replace (" / [^ a-ZA-Z0- 9_ \ -] + / "," ", $ username), / / XSS skydd som vi kan skriva ut detta 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 ; } } } Login framgångsrika return true;} else {/ / lösenord är inte korrekt / / Vi spelar detta försök i databasen $ nu = tid (), $ mysqli -> query ("INSERT INTO login_attempts (user_id, tid) VALUES ('$. user_id ',' $ nu ') "); return false;}}} else {/ / Ingen användare existerar returnera false;.}}}
- 3Brute force funktion.
Skapa login_check funktion:funktion checkbrute ($ user_id, $ mysqli) { / / Get tidsstämpel av aktuell tid $ Nu = tid (); / / Alla inloggningsförsök räknas från de senaste 2 timmarna. $ Valid_attempts = $ nu - (2 * 60 * 60); if ($ stmt = $ mysqli -> förbereda ("? SELECT tid från login_attempts WHERE user_id = AND tid> '$ valid_attempts'")) { $ Stmt -> bind_param ('i', $ user_id); / / Kör förberedda frågan. $ Stmt -> execute (); $ Stmt -> store_result (); / / Om det har gått mer än fem misslyckade inloggningar if ($ stmt -> NUM_ROWS> 5) { return true; } Else { return false; } } }
Brute force attacker är svåra att förhindra några sätt vi kan förhindra dem använder en CAPTCHA testet, låsa användarkonton och lägga till en fördröjning på misslyckade inloggningar, så att användaren inte kan logga in i ytterligare 30 sekunder.
När man står inför detta problem de flesta utvecklare block bara IP-adressen efter viss misslyckade inloggningar. Med många verktyg för att automatisera processen, kan dessa verktyg gå igenom en serie av fullmakter och även ändra IP på varje begäran. Blockering alla dessa IP-adresser kan betyda att du blockerar legitima användare. - 4Kontrollera inloggad status.
Vi gör detta genom att kontrollera den "user_id" och "login_string" variabler session. Den "login_string" sessionsvariabel har användarna Browser Info hash tillsammans med lösenordet. Vi använder Browser Info eftersom det är mycket osannolikt att användaren kommer att ändra sin webbläsare mid-session. Att göra detta hjälper till att förhindra sessionskapning.
Skapa login_check funktion:funktion login_check ($ mysqli) { / / Kontrollera om alla sessionsvariabler sätts 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'], / / Hämta user-agent sträng av användaren. if ($ stmt = $ mysqli -> förbereda ("? SELECT lösenord FROM medlemmar WHERE id = GRÄNS 1")) { $ Stmt -> bind_param ('i', $ user_id), / / Bind "$ user_id" till parametern. $ Stmt -> execute (); / / Utför förberedda frågan. $ Stmt -> store_result (); if ($ stmt -> NUM_ROWS == 1) {/ / Om användaren finns $ Stmt -> bind_result ($ password), / / få variabler från resultatet. $ Stmt -> fetch (); $ Login_check = hash ('SHA512', $ password $ user_browser.); if ($ login_check == $ login_string) { / / Anmäld!! return true; } Else { / / Inte inloggad return false; } } Else { / / Inte inloggad return false; } } Else { / / Inte inloggad return false; } } Else { / / Inte inloggad return false; } }
Skapa bearbetning sidor
- 1Skapa sidan login bearbetning (process_login. Php).
Om efter vårt tidigare exempel, bör detta namn process_login.php.
Logga bearbetning sida (process_login.php)omfatta "db_connect.php", inkluderar "functions.php", sec_session_start (),. / / Våra anpassade säkert sätt att starta ett php session if (isset ($ _POST ['email'], $ _POST ['p']) ) {$ email = $ _POST ['email'], $ password = $ _POST ['p'];. / / Den hashed lösenord om (inloggning ($ email, $ password, $ mysqli) == true) {/ / Logga framgång echo 'Framgång: Du har loggat in!';} else {/ / Inloggning misslyckades header ("Location:.? / login.php error = 1 ');}} else {/ / Rätt POST variabler var inte skickas till den här sidan echo 'Ogiltig begäran ";.}
- 2Skapa en utloggning manus.
Logga script (logout.php):
Obs: Det kan vara en bra idé att lägga CSRF skydd här som om någon skicka en länk med den här sidan döljs på något sätt. Användaren loggas ut. - 3Registrering sidan.
Hash script:/ / Den hashed lösenordet från formuläret $ Password = $ _POST ['p']; / / Skapa en slumpmässig salt $ Random_salt = hash ('SHA512', uniqid (mt_rand (1, mt_getrandmax ()), true)); / / Skapa saltade lösenord (Noga med att inte över säsongen) $ Password = hash ('SHA512', $ password $ random_salt.); / / Lägg din insats till databas skript här. / / Se till att du använder förberedda uttalanden! if ($ insert_stmt = $ mysqli -> förbereda ("INSERT INTO medlemmar (användarnamn, e-post, lösenord, salt) VALUES (,,,)????")) { $ Insert_stmt -> bind_param ('ssss', $ username, $ email, $ password, $ random_salt); / / Kör förberedda frågan. $ Insert_stmt -> execute (); }
Se till att värdet av $ _POST ['p'] redan hashas från javascript, om du inte använder denna metod för att du vill validera sidan lösenordsserver gör sedan att du hash det.
Skapa JavaScript-filer
- 1Skapa SHA512. Js fil
Filen kan laddas ner från pajhome.org.uk - 2Skapa formulär. Js-fil
Javascript formulär fil (forms.js):Funktionen formhash (formulär, lösenord) { / / Skapa ett nytt element in, kommer det att vara ute hashar av lösenorden fältet. var p = dokument createElement ("input").; / / Lägg till nytt element till vårt formulär. . formulär appendChild (p); . p name = "p"; s.. type = "hidden" . p-värde = hex_sha512 (password. värde); / / Se till klartext lösenord inte får skickas. . lösenord value = ""; / / Slutligen skicka formuläret. . formen fram (); }
Skapa HTML-sidor
- 1Skapa inloggningsformuläret (inloggning. Php).
Detta är ett HTML-formulär med två textfält, som heter "e" och "lösenord". Den JavaScript kommer då generera en hash av lösenordet, och skicka "e" och "p" (den hashade lösenord) till servern.
När du loggar in, är det bäst att använda något som inte är offentligt, för denna guide använder vi e-post som inloggnings-ID, kan användarnamnet sedan användas för att identifiera användaren. Om e-postmeddelandet är dolt det tillför en annan variabel för dataintrång konton.
HTML inloggningsformuläret:<Script type = "text / javascript" src = "sha512.js"> </ script> <Script type = "text / javascript" src = "forms.js"> </ script> <? Php if (isset ($ _GET ['error'])) { echo 'Felloggning I!'; } ?> <Form action = "process_login.php" method = "post" name = "login_form"> Email: <input type = "text" name = "email" /> <br /> Lösenord: <input type = "lösenord" name = "lösenord" id = "lösenord" /> <br /> <Input type = "button" value = "Logga in" onclick = "formhash (this.form, this.form.password);" /> </ Form>
Obs: Även om vi har krypterat lösenord så att det inte skickas i klartext, rekommenderas det att du använder https-protokollet (TLS / SSL) när du skickar lösenord. (Se: Network avlyssning ).
Skydda sidor
- 1Page skydd skript.
Skydda sidor:/ / Inkludera databas anslutning och fungerar här. sec_session_start (); if (login_check ($ mysqli) == true) { / / Lägg till ditt skyddade innehållet på sidan här! } Else { echo 'Du har inte behörighet att komma åt denna sida, vänligen logga in. <br/> '; }
Se till att du använder den här funktionen för att kontrollera om användaren om loggat in
Tips
- Med mycket få förändringar dessa exempel skript kan modifieras för att arbeta med andra SQL system såsom eller.
- Håll dig borta från md5 () funktionen i inloggningsskript är md5 hash-algoritm nu betraktas.
- Använd HTML och CSS för att formatera inloggningsformuläret och sidor output för att passa dig.
Mer att läsa
Varningar
- Ingenting är 100% säker. Kom ihåg att stanna i samklang med de senaste nyheterna om säkerhet att fortsätta att förbättra säkerheten i dina skript.
- Se till att användaren inte kan se din php script, vilket kan occure grund av felaktig server setup. Det finns en möjlighet för användarna att samla information om din databas och lösenord om din PHP-kod är synlig.