gushelom.ru

Så här skapar du ett säkert inloggningsskript med PHP och MySQL

Efter att ha läst många historier om webbplats- och databasbrott, söker utvecklare ständigt efter det bästa sättet att säkra sin information på webben. Om din webbplats innehåller funktioner för registrering och hantering av användare kan du utsättas för risken att hackas, vilket leder till förlust av värdefull information om dina användare. Den här guiden visar dig det bästa sättet att skapa ett säkert och användarvänligt inloggnings- och hanteringssystem.


Följ anvisningarna i den här guiden för att förhindra någon typ av cyberattack vars syfte är att få tillgång till andra användarprofiler, radera konton eller ändra data. Här är en lista över möjliga cyberattacker som stegen i den här guiden hjälper dig att försvara dig själv.

Metod 1

Konfigurera din server
1
Installera PHP-plattformen och MySQL-databasen på din server.
Bildnamn Php mysql.jpg

Många webbhotellstjänster tillhandahåller PHP och mySQL-plattformarna redan i tjänsten. Om så är fallet kommer det att vara tillräckligt att verifiera att den levererade versionen motsvarar den senaste uppdaterade versionen, så att du kan använda verktygen som anges i den här handboken. Om du har en server eller en dator, följ stegen i guiden nedan för att installera PHP och mySQL-plattformen på Mac.

Metod 2

Konfigurera en mySQL-databas
1
Skapa MySQL-databasen.
Den här guiden skapar en databas som heter "secure_login".
Använd den SQL-kod du hittar nedan för att skapa din databas.

SQL-kod för att skapa en databas:
CREATE DATABASE `secure_login`-

Obs: vissa webbhotellstjänster tillåter dig inte att skapa en databas med hjälp av phpMyAdmin-gränssnittet Lär dig att skapa en mySQL-databas med cPanel.
  • 2
    Skapa en användare som bara har behörigheterna att utföra "SELECT", "UPDATE" och "INSERT".
    På så sätt kunde en hacker inte radera något från strukturen eller från data i din databas om ett brott mot säkerheten för dina skript upptäcktes. Med en användare av den här typen kommer du att kunna göra ganska mycket vad du vill med din ansökan. Om du är särskilt angelägen om säkerheten i din databas, skapa en annan användare för varje funktion.

  • användare: "sec_user"
  • Lösenord: "eKcGZr59zAa2BEWU"


  • Kod för att skapa användarens "sec_user":
    CREATE USER `sec_user` @ `lokalvärd` identifieras med `eKcGZr59zAa2BEWU`-GRANT SELECT, INSERT, UPDATE ON` secure_login`. * TO` sec_user `@` localhost`-

    Obs: Det är en bra idé att anpassa kodlösenordet som beskrivs ovan när du kör det på din server. Var också säker på att ändra PHP-koden. Kom ihåg att det inte är ett lösenord som du måste komma ihåg enkelt, så välj en som är så komplicerad som möjligt. På denna adress Du hittar en slumpmässig lösenordsgenerator.
  • 3
    Skapa ett mySQL-bord som heter "medlemmar".
    Följande kod skapar en tabell bestående av 5 fält (id, användarnamn, e-post, lösenord, salt).

    Kod för att skapa tabellen "medlemmar":
    CREATE TABLE `secure_login`.`members` ( ​​`id` INT NOT NULL AUTO_INCREMENT primärnyckel,` username` VARCHAR (30) NOT NULL, `email` VARCHAR (50) NOT NULL,` password` CHAR (128) NOT NULL, `salt` CHAR (128) NOT NULL) MOTOR = InnoDB-

    Vi använde datatypen `CHAR` för de fält vars storlek är känd. För fälten "lösenord" och "salt" användes en maximal storlek på 128 tecken. Med datatypen `CHAR` sparar du CPU-användning.
  • 4
    Skapar loggbordet som lagrar alla inloggningsförsök.
    Vi skapade denna tabell för att lagra alla användarinloggningssökningar för att förhindra en attack baserad på "brute force".

    Kod för att skapa tabellen `login_attempts`:
    CREATE TABLE `secure_login`.`login_attempts` ( `user_id` INT (11) NOT NULL,` situationsutvärdering VARCHAR (30) NOT NULL) MOTOR = InnoDB
  • 5
    Utför ett datainmatningstest i tabellen med medlemmar.
    Eftersom vi inte har skapat en sida för registrering av nya användare kommer det att vara avgörande att testa robustheten och effektiviteten i inloggningsskriptet. Nedan hittar du SQL-skriptet för att skapa en användare med följande detaljer:
  • Användarnamn: test_user
  • E-postadress: [email protected]
  • Lösenord: 6ZaxN2Vzm9NUJT2y

  • Lägg till användarens testanvändare:
    INSERT INTO `secure_login`.`members` VÄRDEN (1, `test_user`, `[email protected]`, `00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc`, `f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef`) -

    Metod 3

    Skapa databasanslutningssidan
    1
    Skapa sidan för anslutning till databasen.
    Detta är den php-kod som vi ska använda för att ansluta till vår mySQL-databas. Skapa en ny php-fil som heter `db_connect.php` och ange följande kod i den. Du kan infoga den här filen på alla sidor som måste anslutas till databasen.

    Php-kod för databasanslutningen (`db_connect.php`):
    define ("VÄRD", "lokalvärd") - // Det är den server du vill ansluta till."ANVÄNDARE", "sec_user") - // Det är användaren som du kommer att ansluta till DB.define ("LÖSENORD", "eKcGZr59zAa2BEWU") - // Lösenord för åtkomst till DB.define ("DATABAS", "secure_login") - // Namn på databasen $ mysqli = new mysqli (värd, användare, lösenord databas) -. // Om du ansluter med hjälp av TCP / IP, istället för att använda en UNIX-uttag, kom ihåg att lägga motsvarande parameter till portnummer.

    Metod 4

    Skapa PHP-funktioner

    Dessa funktioner kommer att ligga till grund för alla operationer som ska utföras för att korrekt utföra inloggningsskriptet. Lägg till alla dessa funktioner på en sida som heter "functions.php".

    1
    Starta en säker PHP-session.
    Det är viktigt att du inte bara använder funktionen session_start () - i början av varje sida som du ska använda inom PHP-sessionen. Om du verkligen bryr dig om ditt systems säkerhet, så här ska du implementera den här delen av koden. Vi ska skapa en funktion som heter `sec_session_start` som kommer att skapa en skyddad php-session. Du måste ringa denna funktion i början av varje sida som behöver komma åt en session variabel. Om du är mycket orolig för säkerheten och integriteten för data som lagras i dina cookies, läs mer ämnet genom att söka på nätet för hantering av en säker session med ett system baserat på PHP och MySQL.

    Kod relaterad till funktionen för att skapa en säker php-session:
    sec_session_start function () {$ session_name = `sec_session_id`- // Ställ in ett sessionsnamn $ säker = FALSE- // Ställ in parametern till true om du vill använda` https` protokoll Httponly $ = sant -. // Detta förhindrar ett jаvascript för att kunna komma åt id sessione.ini_set ( `session.use_only_cookies`, 1) - // Tvinga sessionen att endast använda cookies $ cookieParams session_get_cookie_params = (.) - // Läs relaterade aktuella parametrarna ai cookie.session_set_cookie_params ($ cookieParams ["livstid"], $ cookieParams ["bana"], $ cookieParams ["domän"] $ Secure, $ Httponly) -session_name ($ session_name) - // Ställ in sessionsnamnet med en vald i början av funzione.session_start () - // Startar php.session_regenerate_id session () - // Generera sessionen och ta bort den du skapade tidigare.}

    Den här funktionen gör ditt inloggningsskript mycket säkrare. Det förhindrar att en angripare får åtkomst till ditt php-session-ID med ett enkelt java-skript (som i fallet med en XSS-attack).
    Genom att använda funktionen "session_regenerate_id ()" som regenererar sessionen id fyller varje sida, kommer du att kapa sessionen.

    Obs! Om du använder https-protokollet för ditt inloggningsprogram, kom ihåg att ställa in variabeln `$ secure` till `true`.
  • 2
    Skapa inloggningsfunktionen.
    Den här funktionen kontrollerar e-postadressen och lösenordet för att jämföra dem med de som lagras i databasen, och returnerar värdet "true" om en matchning hittas.

    Säkert inloggningsfunktion:
    Funktionsinloggning ($ email, $ password, $ mysqli) {// Använda sql `prepared`-uttalandet är det inte möjligt att implementera en SQL injection.if ($ stmt = $ mysqli->framställa ("VÄLJ ID, användarnamn, lösenord, salt FRÅN MEDLEMAR VAR E-mail =? LIMIT 1")) {$ stmt->bind_param (`s`, $ email) - // binder parametern `$ email`. $ stmt->exekvera () - // kör den nyskapade frågan. $ stmt->store_result () - $ stmt->bind_result ($ user_id, $ användarnamn, $ db_password, $ salt) - // hämtar resultatet av frågan och lagrar det i dess variabler. $ stmt->hämta () - $ lösenord = hash (`sha512`, $ lösenord. $ salt) - // kryptera lösenordet med en unik key.if ($ stmt->NUM_ROWS == 1) {// Om användaren // vi kontrollera att det inte är inaktiverad efter utförandet av alltför många accessförsök errati.if (checkbrute ($ user_id, $ mysqli) == true) {// konto funktionshindrade // Skicka ett mail varnar dig om att ditt konto har disabilitato.return FALSE-} else {if ($ db_password == $ lösenord) {// Kontrollera att lösenordet lagras i databasen matchar lösenord som tillhandahålls av `user.// Rätt lösenord! $ User_browser = $ _SERVER [ `HTTP_USER_AGENT`] -. // Hämta parametern `user-agent` för den aktuella användaren $ user_id = preg_replace ("/ [^ 0-9] + /", "", $ user_id) - // skydda oss från en attack XSS $ _SESSION [`user_id`] = $ user_id- $ användarnamn = preg_replace ("/ [^ A-zA-Z0-9 _ -] ^ /", "", $ Användarnamn) - // vi skyddar oss från en attack XSS $ _SESSION [ `username`] = $ username - $ _ SESSION [ `login_string`] = hash (sha512 `, $ lösenord $ User_browser) -. // Logga verk success.return true-} else {// Felaktigt lösenord. // Vi registrerar det misslyckade försöket i databasen. $ now = time () - $ mysqli->query ("INSERT INTO login_attempts (user_id, time) VALUES (`$ user_id`, `$ now`)") -return false-}}} else {// Den angivna användaren existerar inte.return false-}}}
  • 3
    Funktion för att förhindra en attack med hjälp av "brute force".
    Cyberattacker baserade på brute force uppstå när en hacker utför tusentals försök att få tillgång till ett system som använder ett visst konto, genererar slumpmässiga lösenord eller ta dem från en ordbok. I vårt skript, om en användare gör 5 på varandra följande misslyckade inloggningsförsök, är hans konto inaktiverat.

    Skapa funktionen "checkbrute":
    checkbrute funktion ($ user_id, $ mysqli) {// Hämta tidsstämpeln $ = nu tid () -. // Den analyserar alla inloggningsförsök från de sista två timmarna valid_attempts $ = $ nu - (2 * 60 * 60 ) -if ($ stmt = $ mysqli->framställa ("VÄLJ tid FRÅN login_attempts WHERE user_id =? OCH tid > `$ Valid_attempts`")) {$ stmt->bind_param (`i`, $ user_id) - // Kör den skapade frågan. $ stmt->execute () - $ stmt->store_result () - // Jag verifierar förekomsten av mer än 5 inloggningsförsök failed.if ($ stmt->NUM_ROWS > 5) {return true-} else {return false-}}}


    Anfall baserade på brute force är svår att förhindra. Några sätt att göra detta är att använda CAPTCHA-koder, inaktivera användaren och införa en fördröjning i nästa inloggningsförsök efter ett misslyckat försök. Det betyder att användaren måste vänta en viss tid (till exempel 30 sekunder) innan du kan logga in igen.
    Många utvecklare, när de möter liknande problem, kan helt enkelt blockera åtkomst till systemet från den specifika IP-adressen efter ett visst antal felaktiga inloggningsförsök. Vissa verktyg som används för att automatisera denna typ av attack använder proxyservrar och ändrar IP-adress vid varje inloggningsförfrågan. Det innebär att blockering av alla dessa IP-adresser också kan förhindra inloggning till legitima användare.
  • 4
    Kontrollera inloggningsstatusen.
    För att göra detta måste vi kontrollera sessionsvariablerna `user_id` och `login_string`. Sessionsvariabeln `login_string` lagrar användarens webbläsarkodade information tillsammans med inloggningslösenordet. Vi använder webbläsarinformation eftersom det är mycket osannolikt att användaren kommer att ändra den under sessionen. Denna framsyn hjälper oss att förhindra en relativ attack session kapning.

    Skapa funktionen `login_check`:
    Funktionen login_check ($ mysqli) {// Kontrollera att alla sessionsvariabler sätts correttamenteif (isset ($ _ SESSION [ `USER_ID`], $ _ SESSION [ `username`], $ _ SESSION [ `login_string`])) {$ USER_ID = $ _SESSION [ `user_id`] - $ login_string = $ _ SESSION [ `login_string`] - $ username = $ _ SESSION [ `användarnamn`] - $ user_browser = $ _SERVER [ `HTTP_USER_AGENT`] - // hämtar strängen `användar- agent "av användaren.if ($ stmt = $ mysqli->framställa ("VÄLJ Lösenord FRÅN MEDLEMARE VAR ID =? LIMIT 1")) {$ stmt->bind_param (`i`, $ user_id) - // binder parametern `$ user_id`. $ stmt->exekvera () - // Kör den skapade frågan. $ stmt->store_result () - if ($ stmt->num_rows == 1) {// om användaren existerar $ stmt->bind_result ($ password) - // hämta variablerna från det erhållna resultatet. $ stmt->hämta () - $ login_check = hash ( `sha512`, $ lösenord $ user_browser) -Om ($ login_check == $ login_string) {// return true-Login run !!!!} else {// Logga ingen falsk eseguitoreturn -}} else {// Logga ingen eseguitoreturn FALSE-}} else {// Logga ingen eseguitoreturn FALSE-}} else {// Logga ingen eseguitoreturn FALSE-}}
  • Metod 5

    Skapa processhanteringssidor
    1
    Skapar sidan som loggar in (process_login.php).
    Om du följde våra tidigare exempel kommer sidan att kallas "process_login.php".
    Vi använder PHP-funktionerna som ingår i tillägget mysqli_ * av mySQL, eftersom det verkar vara den mest aktuella.

    Skapa inloggningssidkoden (process_login.php)
    omfattar `db_connect.php`-omfatta` functions.php`-sec_session_start () - // vi använder vår funktion för att lansera en php sicuraif session (isset ($ _ POST [ `e`], $ _POST [ `p`])) {$ e = $ _POST [ `e`] - $ password = $ _POST [ `p`] - // Hämta den criptata.if lösenord (inloggning ($ e-post, $ lösenord, $ mysqli) == true) {// Inloggning eseguitoecho `Framgång: Du har loggat in` -} else {// Logga fallitoheader (Plats: ./login.php?error=1`)-}} else {// rätt variablerna har inte sänts till den här sidan från metoden POST.echo `Invalid Request`-}

  • 2
    Skapa logoutskriptet.
    Ditt logoutskript måste starta en session, förstöra den och sedan vidarebefordra till en annan sida.

    Skapa koden för logout scriptet (logout.php):
    omfattar functions.php`-sec_session_start () -. // Radera alla värden från sessionen $ _ SESSION = array () -. // Hämta sessionsparametrarna session_get_cookie_params $ params = () - // bort cookies attuali.setcookie (session_name (), ``, time () - 42000, $ params ["bana"], $ params ["domän"], $ params ["säkra"], $ params ["Httponly"]) - // Avbryt session.session_destroy () - header (`Plats: ./`)-

    Obs! Det kan här vara en bra idé att lägga till "CSRF" -skydd. Genom att göra det, om någon på något sätt lyckas komma till adressen till den här dolda sidan, skulle användaren kopplas bort.
  • 3
    Registreringssida.
    För att kryptera lösenordet måste vi använda följande kod:

    Lösenordshastighetsskript:
    . // Hämta det krypterade lösenordet från inmatningsformuläret $ Password = $ _POST [ `p`] - // Skapa en slumpmässig nyckel $ random_salt = hash ( `sha512`, uniqid (mt_rand (1 mt_getrandmax ()), sant) ) - // Skapa ett lösenord med hjälp av nyckel du just har skapat $ password = hash (sha512 `, $ lösenord $ random_salt) -.. // Inkludera din SQL-kod vid denna tidpunkt att utföra INSERT uttalande i databasen // Kontrollera att du använder SQL-förklaring "prepared`.if ($ insert_stmt = $ mysqli->framställa ("INSERT INTO medlemmar (användarnamn, email, lösenord, salt) värden (?,?,?,?)")) {$ insert_stmt->bind_param (`ssss`, $ användarnamn, $ email, $ lösenord, $ random_salt) - // Kör den resulterande frågan. $ insert_stmt->execute () -}

    Se till att värdet för parametern "$ _POST [`p`] redan har krypterats med ett jаvascript. Om du inte använder den här metoden, kontrollera att den är krypterad eftersom du vill validera lösenordet direkt på servern.
  • Metod 6

    Skapa jаvascript-filer
    1
    Skapa filen `sha512.js`.
    Den här filen är en implementering av "sha512" kodningsalgoritmen för jаvascript. Vi använder kodningsfunktionen så att våra lösenord inte kan skickas i klar text.

    Filen kan hämtas från webbplatsen pajhome.org.uk
  • 2
    Skapa filen `forms.js`.
    Den här filen kodar lösenorden för alla formulär.

    Kod för jаvascript av filen `forms.js`:
    funktion formhash (form, lösenord) {// Skapa ett inmatningselement som kommer att användas som utgångsfält för det krypterade lösenordet.var p = document.createElement ("ingång") - // Lägg till ett nytt element i din form.form.appendChild (p) -p.name = "p"-p.type = "dolda"p.value = hex_sha512 (password.value) - // Se till att lösenordet inte skickas i cleartext.password.value = ""- // Som ett sista steg, kör "skicka" form.form.submit () -}
  • Metod 7

    Skapa HTML-sidor
    Bildnamn Skärmdump 2013 02 08 vid 17.55.56.jpg
    1
    Skapa inloggningsformuläret (login.php).

    Den kommer att bestå av en HTML-form som innehåller två inmatningsfält som heter "e-post" och "lösenord". Java-skriptet kommer att ta hand om kodning av lösenordet och skicka parametrarna "email" och "p" (det krypterade lösenordet) till servern.

    För inloggningsfasen är det bättre att använda information som inte är offentlig. I den här handboken använder vi e-postadressen i inloggningsfasen, medan användarnamnet kan användas för att identifiera användaren. Om e-postadressen är gömd lägger du till en extra variabel, som måste hanteras av en eventuell hackare.

    Kod för att skapa inloggningsformuläret i HTML:

    Obs! Även om vi har krypterat lösenordet så att det inte skickas i klar text rekommenderas det att använda https-protokollet (TLS / SSL) för att skicka lösenordet till servern. (Se dokumentationen angående "Eavesdropping Network").

    Metod 8

    Skydd av sidor
    1
    Skript för sidskydd.
    Ett av de vanligaste problemen i autentiseringssystem är att utvecklare glömmer att verifiera att användaren faktiskt är inloggad i systemet. Det är mycket viktigt att du använder följande kod för att verifiera att användaren har loggat in.
    Kod för att skydda åtkomst till sidor:
    // infoga denna punkt i koden för att ansluta till DB och användningen av olika funzioni.sec_session_start () - if (login_check ($ mysqli) == true) {! // Här innehållet i dina sidor} else { echo `Du är inte behörig att komma åt denna sida, vänligen logga in. 
    `-}


    Var noga med att använda den här funktionen för att verifiera att användaren är inloggad i systemet.

    Rekommenderade mätningar

    tips

    • Med väldigt få modifieringar kan dessa exempel PHP-skript användas på andra SQL-databaser som SQLite eller PostgreSQL.
    • Använd HTML och CSS stilark för att anpassa efter din smak, inloggningspanelen och andra webbsidor.
    • Använd inte funktioner som använder md5 säkerhetsalgoritmen inom skript som styr inloggningsfasen. Md5-algoritmen har klassificerats som INTE säker.
    • Om du vill använda en hashingalgoritm som skiljer sig från "sha512", försök "Whirlpool". Undvik att använda algoritmer som "Gost", "sha1" (om det inte hanteras noggrant och inom flera iterationer) och ovannämnda md5. Uppmuntra dina användare att skapa unika lösenord och väldigt säkert, som använder både små och stora bokstäver, siffror och symboler. Ge dina användare möjlighet att skapa ett visst användarnamn för att logga in, vilket skiljer sig från användarnamnet som används offentligt.

    varningar

    • I datorvärlden är inget 100% säkert och ogenomträngligt. Kom ihåg att alltid uppdatera dig när det gäller säkerhet, läsa alla de senaste nyheterna, för att vara redo att tillämpa rätt ändringar i dina skript.
    • Skriptet som blockerar brutala kraftattacker genom att inaktivera användarkontot som användes för att starta attacken kan användas felaktigt. Skapa ett skript som kör varje timme och sätt in alla "okända användare" och antalet felaktiga inloggningar ("bad_password") i en tabell. Ställ in skriptet för att inaktivera användaren efter 5 misslyckade försök.
    • Se till att användare inte kan visa dina PHP-skript, vilket kan hända på grund av felaktig serverkonfiguration. Om din PHP-kod är synlig finns det den verkliga möjligheten av skadliga personer att samla in information om dina databaser och deras lösenordsåtkomst.

    Saker du behöver

    För att kunna använda PHP-klasserna som ingår i mysqli_ * -tillägget för att komma åt din mySQL-databas måste du använda följande PHP- och mySQL-versioner.

    • PHP vers 5 eller senare
    • MySQL version 4.1.3 eller senare

    För att kontrollera vilken version av PHP och mySQL som är installerad på din server, använd följande PHP-funktion phpinfo ().

    Dela på sociala nätverk:

    Relaterade
    Så här tar du bort en MySQL-databasSå här tar du bort en MySQL-databas
    Så här konfigurerar du en FTP mellan två datorerSå här konfigurerar du en FTP mellan två datorer
    Så här konfigurerar du en FTP-server i Linux UbuntuSå här konfigurerar du en FTP-server i Linux Ubuntu
    Så här ansluter du till en MySQL-databas med PHPSå här ansluter du till en MySQL-databas med PHP
    Hur man skapar och underhåller en privat server av World of Warcraft på LinuxHur man skapar och underhåller en privat server av World of Warcraft på Linux
    Så här skapar du en kunddatabasSå här skapar du en kunddatabas
    Så här skapar du en databas i MySQLSå här skapar du en databas i MySQL
    Så här skapar du en ny användare i Windows 8Så här skapar du en ny användare i Windows 8
    Hur man skapar och underhåller ett framgångsforumHur man skapar och underhåller ett framgångsforum
    Hur man skapar en webbserver på Raspberry PiHur man skapar en webbserver på Raspberry Pi
    » » Så här skapar du ett säkert inloggningsskript med PHP och MySQL

    © 2011—2021 gushelom.ru