emkiset.ru

Hoe een veilig login-script te maken in php en MySQL

Met steeds meer verhalen over piraterij in het nieuws zoeken ontwikkelaars naar betere manieren om hun site te beveiligen. Als uw site een ledenstelsel heeft, kan het risico lopen te kraken en kunnen gebruikersgegevens worden aangetast. Deze gids toont je een poging om een ​​veilige login te maken met PHP. We hebben ons uiterste best gedaan om de code te programmeren, maar beveiliging en vooral encryptie zijn complexe kwesties die voortdurend veranderen en we kunnen niet zeggen dat we dat veld domineren. Daarom hadden we een paar trucs kunnen missen in onze programmering. Zo ja, laat het ons weten en we zullen proberen eventuele verbeteringen aan te brengen in wat we hebben.

Door deze handleiding te volgen, kunt u zorgen voor vele soorten aanvallen die crackers kunnen gebruiken om controle te krijgen over de accounts van andere gebruikers, accounts te verwijderen en / of gegevens te wijzigen. Hieronder presenteren we een lijst met mogelijke aanvallen waarvan deze gids zichzelf probeert te verdedigen:

De aanpak is om een ​​combinatie van gegevensfilters, codering en andere methoden te gebruiken om het leven een beetje moeilijker te maken voor degenen die denken je aan te vallen.

We proberen het huidige script voortdurend te verbeteren. de nieuwste versie van de code is beschikbaar in github. Er kunnen enkele verschillen zijn tussen de code die u op die pagina downloadt en de code die in dit artikel wordt vermeld. Houd er rekening mee dat ons doel niet is geweest dat de presentatie van HTML-pagina`s gemaakt door de toepassing er prachtig uitziet.

Houd er ook rekening mee dat we PHP-tags niet sluiten in bestanden die alleen PHP-code bevatten. Dit is in overeenstemming met de meeste aanbevelingen voor codeformaten.

Ten slotte is het noodzakelijk te weten dat we u vragen om alle niet-HTML-bestanden van de toepassing in verschillende mappen in de hoofdmap van de toepassing te maken. De eenvoudigste manier om de juiste directorystructuur te maken, is door de meest recente code te downloaden door op een van de bovengenoemde links te klikken.

Alsjeblieft, voel je vrij om deze applicatie te gebruiken als basis voor je eigen implementatie, maar gebruik het niet als een voorbeeld van goede programmeeroefeningen.



Dingen die je nodig hebt

Omdat we mysqli_ * gebruiken, een verzameling PHP-klassen voor toegang tot onze mySQL-database, heb je de volgende versies van PHP en MySQL nodig.

  • PHP versie 5.3 of nieuwer
  • MySQL-versie 4.1.3 of nieuwer

Vanzelfsprekend hebt u ook een webserver nodig die is geconfigureerd om PHP te gebruiken voor het hosten van uw pagina`s. Dit is waarschijnlijk de webserver die uw pagina host, tenzij u de site zelf host.

Gebruik de functie om de PHP- en MySQL-versie op uw server te controleren phpinfo () -.

stappen

Deel 1
Configureer uw server

1
Installeer een webserver, PHP en MySQL op uw server.

De meeste hostingdiensten hebben PHP en mySQL al geïnstalleerd, maar u moet controleren of ze de nieuwste versies van PHP en mySQL hebben, zodat deze handleiding van pas kan komen. Als je niet minimaal PHP5.3 en MySQL5 hebt, kun je hun inzet voor beveiliging ter discussie stellen. Het up-to-date houden van uw software is onderdeel van het beveiligingsproces.

Als u over een eigen server of computer beschikt, installeert u de software die u normaal gesproken op uw systeem nodig hebt. Als u de configuratie om productieredenen niet gaat gebruiken en u zich gaat ontwikkelen in Windows of OS X, wordt het installeren van een toepassingspakket (stack) XAMPP in het algemeen aanbevolen. Download de juiste versie voor uw besturingssysteem in:

http://apachefriends.org/en/xampp.html

Houd er echter rekening mee dat u onder geen enkele omstandigheid XAMPP mag gebruiken om een ​​productieserveromgeving te creëren.

Gebruik in Linux de pakketbeheerder om de benodigde pakketten te downloaden en te installeren. Sommige distributies, zoals Ubuntu, bevatten alle benodigde applicaties in één pakket. U hoeft alleen maar het volgende te doen in een Ubuntu-terminalvenster:

sudo apt-get installeer lamp-server ^ phpmyadmin



Maar zelfs als u de nodige elementen installeert, moet u MySQL configureren met een veilig root-wachtwoord.

Deel 2
Configureer de MySQL-database

1
Maak een MySQL-database.

Start de sessie in uw database als beheerder (meestal "root").

In deze gids zullen we een database aanmaken met de naam "safe_home".

Zie hoe maak een database aan in phpMyAdmin.

U kunt de onderstaande code gebruiken of hetzelfde doen in phpMyAdmin of in uw favoriete MySQL GUI-client, als u dat wenst:

CREËER DATABASE `secure_login`-
Opmerking: sommige hostingservices staan ​​niet toe dat u een database maakt met phpMyAdmin, daarom leert u doe het in cPanel.
  • 2
    Maak een gebruiker alleen met de privileges SELECT, UPDATE en INSERT.

    Als u een gebruiker met beperkte rechten maakt, betekent dit dat in het geval dat beveiliging ooit in uw script wordt geschonden, de hacker niets uit onze database kan verwijderen of achterlaten. Door deze gebruiker te gebruiken, kunt u bijna doen wat u wilt met uw toepassing. Als je echt paranoïde bent, maak dan voor elke functie een andere gebruiker.

    Natuurlijk moet u zich bij MySQL aanmelden als een gebruiker met voldoende rechten om een ​​andere gebruiker te kunnen maken. Meestal zal deze gebruiker root zijn.

    De volgende details zijn van de gebruiker die we hebben gemaakt:
  • gebruiker: "sec_user"
  • wachtwoord: "eKcGZr59zAa2BEWU"

  • Opmerking: we raden u aan om het wachtwoord dat we eerder noemden te wijzigen als u het op uw eigen server gaat gebruiken. Als dat zo is, zorg er dan voor dat je ook de onderstaande code en de verbindingscode van de PHP-database in de applicatie die we zullen maken, wijzigt.

    Vergeet niet dat het geen wachtwoord hoeft te zijn dat u kunt onthouden, dus maak het zo gecompliceerd mogelijk. Dit is bijvoorbeeld een willekeurige wachtwoordgenerator.

    Dan zal er ook de SQL-code zijn om de databasegebruiker te maken en hem de nodige rechten te verlenen. Als u wilt, kunt u dit ook doen in een GUI-databaseclient zoals phpmyadmin:

    CREATE USER `sec_user` @ `localhost` identified by `eKcGZr59zAa2BEWU`-GRANT SELECT, INSERT, UPDATE ON `secure_login`. * TO` sec_user `@` localhost`-


    Als je ziet dat je het verwijderen van records uit een van de tabellen van deze module, moet u toevoegen ELIMINATE aan de lijst van de voorrechten en anders kon je een andere gebruiker die alleen het voorrecht DELETE en alleen in de tabel die u wilt records als verwijderen creëren je wilt het niet in beide doen. Het is niet noodzakelijk dat u het privilege ELIMINATE voor het huidige scriptvoorbeeld helemaal toekent.
  • 3
    Maak een MySQL-tabel met een titel "lid".

    De onderstaande code maakt een tabel met vijf velden (identificatie, gebruikersnaam, e-mailadres, wachtwoord, zout). We gebruiken het gegevenstype CHAR voor de velden waarvan we de extensie kennen, omdat de velden `wachtwoord` en `salt` altijd 128 tekens lang zijn. Als u in die gevallen CHAR gebruikt, wordt verwerkingskracht bespaard:

    CREATE TABLE `secure_login`.`members` (` s id` PRIMARY KEY NOT NULL AUTO_INCREMENT, `username` VARCHAR (30) NOT NULL,` email` VARCHAR (50) NOT NULL, `password` CHAR (128) NOT NULL, `salt` CHAR (128) NOT NULL) MOTOR = InnoDB-

    Zoals we eerder hebben vermeld, kunt u dit doen in elk type klant dat u verkiest.
  • 4
    Maak een tabel om inlogpogingen op te slaan.

    We zullen deze tabel gebruiken om de inlogpogingen van een gebruiker op te slaan. Dit is een manier om brute force-aanvallen moeilijk te maken:

    CREATE TABLE `secure_login`.`login_attempts` (` s user_id` (11) NOT NULL, `time` VARCHAR (30) NOT NULL) MOTOR = InnoDB

  • 5
    Maak een testrij in de tabel "leden".

    Het is belangrijk om het inlogscript te kunnen testen, dus we zullen het script presenteren om een ​​gebruiker te maken met bekende details:
  • gebruikersnaam: test_user
  • e-mail: [email protected]
  • wachtwoord: 6ZaxN2Vzm9NUJT2y

  • De code die je nodig hebt om in te loggen als deze gebruiker is:

    INSERT INTO `secure_login`.`members` WAARDEN (1, `test_user`, `[email protected]`, `00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc`, `f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef`) -

    Deel 3
    Maak de verbindingspagina voor de database

    1
    Maak een pagina met globale configuraties.

    Maak een map met de naam "includes" in de hoofdmap van de applicatie en maak vervolgens een nieuw PHP-bestand in die map. Zet de naam "psl-config.php". In een productieomgeving moet u dat bestand en alle andere "include" -bestanden buiten de documentroot van de webserver lokaliseren. Als u dat doet, wat wij aanbevelen, moet u de "include" of de vereiste verklaringen zo vaak wijzigen als nodig is, zodat de toepassing de "include" -bestanden kan vinden.

    Als u deze bestanden buiten de documentroot van de webserver plaatst, kan uw bestand niet worden gevonden met een URL. In het geval dat iemand per ongeluk de PHP-extensie heeft verlaten of de bestandsrechten heeft verpest, kan het bestand niet in een browservenster in tekst worden weergegeven.

    Het bestand zal globale configuratievariabelen bevatten. Aspecten als, bijvoorbeeld, als iemand zich kan registreren, of het een beveiligde verbinding (HTTPS) is, naast andere details van de database, zou naar die plaats kunnen gaan.

  • 2


    Maak de verbindingspagina voor de database.

    Dit is de PHP-code die u moet gebruiken om verbinding te maken met de mySQL-database. Maak een nieuw PHP-bestand met de naam "db_connect.php" in de map "includes" van de toepassing en voeg de onderstaande code toe. Vervolgens kunt u het bestand opnemen op elke pagina waarmee u verbinding wilt maken met de database.

  • Deel 4
    Creëer PHP-functies

    Deze functies zullen alle verwerking van het verbindingsscript uitvoeren. Voeg alle functies toe aan de pagina met de naam "functions.php" in de map "includes" van de toepassing.

    1
    Start de PHP-sessie veilig.
    PHP-sessies staan ​​bekend als niet erg veilig, dus het is belangrijk om niet alleen "session_start () ;" boven aan elke pagina die u wilt gebruiken voor PHP-sessies te plaatsen. We zullen een functie aanmaken met de naam "sec_session_start ()", het zal op een veilige manier een PHP-sessie starten. Je moet deze functie boven aan elke pagina oproepen waar je toegang wilt hebben tot een PHP-sessievariabele. Als u zich echt zorgen maakt over de beveiliging en privacy van cookies, bekijk dan het volgende artikel: Hoe een veilig sessiebeheersysteem in PHP en MySQL te creëren.

    Met deze functie wordt uw aanmeldingsscript veel veiliger. Het zorgt ervoor dat de crackers geen toegang meer hebben tot de cookie die de sessie identificeert met jаvascript (bijvoorbeeld in een XSS-aanval). De "session_regenerate_id ()" -functie, die de identificatie van de sessie bij elke paginabelasting genereert, zal op zijn beurt een sessiediefstal voorkomen. Opmerking: als u HTTPS gaat gebruiken in uw aanmeldtoepassing, stelt u de variabele "$ secure" in op "true". In een productieomgeving is het essentieel dat u HTTPS gebruikt.

    Maak een nieuw bestand met de naam "functions.php" in de map "includes" van uw toepassing en voeg de onderstaande code toe.
  • 2
    Maak de login-functie.
    Deze functie vergelijkt de e-mail en het wachtwoord met de database en als er een overeenkomst is, wordt deze als waar (true) weergegeven. Voeg deze functie toe aan uw "functions.php" -bestand:
    function login ($ email, $ password, $ mysqli) {// Het gebruik van voorbereide statements betekent dat SQL-injectie niet mogelijk is. $ stmt = $ mysqli->voorbereiden ("SELECT ID, gebruikersnaam, wachtwoord, saltFROM-ledenWAAR e-mailadres =? LIMIT 1")) {$ stmt->bind_param (`s`, $ email) - // Word lid van "$ email" naar de parameter. $ stmt->execute () - // Voer de voorbereide query uit. $ stmt->store_result () - // Verkrijg de variabelen van het resultaat. $ stmt->bind_result ($ user_id, $ gebruikersnaam, $ db_password, $ salt) - $ stmt->fetch () - // Hash het wachtwoord met een enkele salt. $ password = hash (`sha512`, $ password. $ salt) -if ($ stmt->NUM_ROWS == 1) {// Als de gebruiker bestaat, controleert of de rekening wordt geblokkeerd door vele pogingen // conexión.if (checkbrute ($ user_id, $ mysqli) == true) {// De rekening is bloqueada./ / Stuur de gebruiker een e-mail met de mededeling dat uw account is bloqueada.return vals} else {// Controleer of het wachtwoord in de database // overeenkomt met het wachtwoord dat de gebruiker envió.if ($ db_password == $ password) {// het wachtwoord juist // Haal de user agent gebruiker $ user_browser = $ _SERVER [ `HTTP_USER_AGENT`] -. // XSS bescherming, omdat deze waarde konden drukken $ user_id = preg_replace (."/ [^ 0-9] + /", "", $ user_id) - $ _ SESSION [`user_id`] = $ user_id - // XSS-bescherming omdat we deze waarde kunnen afdrukken. $ username = preg_replace ("/ [^ a-zA-Z0-9 _ -] + /","", $ Username) - $ _ SESSION [ `username`] = $ username - $ _ SESSION [ `login_string`] = hash ( `sha512`, $ password $ user_browser) -. // Inloggen exitosoreturn true-} else {// het wachtwoord niet correcta.// deze poging is opgenomen in de database nu $ = time () -. $ mysqli->query ("INVOEGEN IN login_pogingen (user_id, time) VALUES (`$ user_id`, `$ now`)") -return false-}}} else {// Gebruiker bestaat niet.return false-}}}

  • 3
    De brute force-functie.
    Brute force-aanvallen vinden plaats wanneer een hacker toegang probeert te krijgen tot een account met 1000 verschillende wachtwoorden, ongeacht of deze willekeurig zijn gegenereerd of uit een woordenboek. Als het account van een gebruiker na meer dan 5 pogingen niet inlogt, wordt in ons script zijn account geblokkeerd.

    Brute force aanvallen zijn moeilijk te voorkomen, om dat te doen captcha-tests zou kunnen gebruiken, blokkeren de gebruikersaccounts en het toevoegen van een vertraging op mislukte aanmeldingen, zodat de gebruiker geen toegang tot nog eens 30 seconden.

    We raden ten sterkste aan om een ​​CAPTCHA te gebruiken. Omdat we deze functionaliteit niet hebben geïmplementeerd in onze voorbeeldcode, hopen we dit binnenkort te doen SecureImage, omdat het geen registratie vereist. Je zou de voorkeur kunnen geven aan iets beters dat bekend staat als reCAPTCHA van Google.

    Welk systeem u ook besluit te gebruiken, we raden u aan de CAPTCHA-afbeelding na twee mislukte aanmeldingen weer te geven om onnodig overlast door de gebruiker te voorkomen.

    Bij dit probleem blokkeren de meeste ontwikkelaars simpelweg het IP-adres na een bepaald aantal mislukte aanmeldingen. Er zijn echter veel tools om het proces te automatiseren. Deze kunnen een reeks volmachten doorlopen en zelfs het IP-adres van elk verzoek wijzigen. Het blokkeren van al deze IP-adressen kan ook de accounts van uw legitieme gebruikers blokkeren. In onze code zullen we mislukte pogingen registreren en het gebruikersaccount blokkeren na vijf mislukte pogingen. Dit stuurt een e-mail naar de gebruiker met een link om het te resetten, maar we hebben dit punt niet geïmplementeerd in onze code. Vervolgens presenteren we de functie "checkbrute ()" tot nu toe. Voeg het toe aan uw "functions.php" -code:

    checkbrute functie ($ user_id, $ mysqli) {// Haal de huidige tijd timestamp $ = tijd (.) - // Alle inlogpogingen worden geteld van 2 uur voor $ valid_attempts = $ nu -. ( 2 * 60 * 60) -if ($ stmt = $ mysqli->voorbereiden ("SELECT timeFROM login_attemptsWHERE user_id =? EN time > `$ valid_attempts`")) {$ stmt->bind_param (`i`, $ user_id) - // Voer de voorbereide query uit. $ stmt->execute () - $ stmt->store_result () - // Als er meer dan 5 inlogpogingen waren failed.if ($ stmt->NUM_ROWS > 5) {return true-} else {return false-}}}
  • 4



    Controleer de status van de gestarte sessie.
    We zullen dit doen door "user_id" en de sessievariabelen "login_string" aan te vinken. De SESSION-variabele "login_string" heeft de informatie van de browser van de gebruiker samen met het wachtwoord dat is gekoppeld via een hash-functie. We gebruiken de informatie van de browser, omdat het zeer onwaarschijnlijk is dat de gebruiker het in het midden van de sessie zal veranderen. Als u dit wel doet, voorkomt u een sessiediefstal. Voeg deze functie toe aan uw "functions.php" -bestand in de "includes folder" van uw applicatie:

    functie login_check ($ mysqli) {// Controleer of alle sessie variabelen zijn configuradas.if (isset ($ _ SESSION [ `user_id`], $ _ SESSION [ `username`], $ _ SESSION [ `login_string`])) {$ user_id = $ _SESSION [ `user_id`] - $ login_string = $ _SESSION [ `login_string`] - $ username = $ _SESSION [ `username`] - // Haal de user agent string gebruiker $ user_browser = $ _SERVER [. `HTTP_USER_AGENT`] - if ($ stmt = $ mysqli->voorbereiden ("SELECT-wachtwoordFROM-ledenWHIER id =? LIMIET 1")) {// Word lid van "$ user_id" naar de parameter. $ Stmt->bind_param (`i`, $ user_id) - $ stmt->execute () - // Voer de voorbereide query uit. $ stmt->store_result () - if ($ stmt->num_rows == 1) {// Als de gebruiker bestaat, verkrijgt hij de variabelen van het resultaat. $ stmt->bind_result ($ wachtwoord) - $ stmt->fetch () - $ login_check = hash (`sha512`, $ wachtwoord. $ user_browser) -if ($ login_check == $ login_string) {// Verbonden !! return true-} else {// not connected.return false-}} else {// not connected.return false-}} else {// not connected.return false-}} else {// not connected.return false- }}
  • 5
    Sanea de PHP_SELF URL
    Met deze functie wordt de uitvoer van de servervariabele PHP_SELF schoongemaakt. Het is een wijziging van een functie met dezelfde naam die wordt gebruikt door het WordPress-inhoudbeheersysteem:

    esc_url functie ($ url) {if ( `` == $ url) {return $ url -} $ url = preg_replace ( `| [^ a-z0-9- ~ + _ # =.?!&-, /:% @ $ | * `() x80 - xff] | i` ``, $ url) - $ strip = array ( `% 0d` `% 0a`, `% 0D`, `% 0A `) - $ url = (string) $ URL- $ count = 1-while ($ count) {$ url = str_replace ($ strip,``, $ url, $ count) -} $ url = str_replace ( `- //` `: //`, $ url) - $ url = htmlentities ($ url) - $ url = str_replace ( `&- `,`&# 038- `, $ url) - $ url = str_replace ("`", `&# 039- `!, $ Url) -als ($ url [0] ==` / `) {// we zijn alleen geïnteresseerd relatieve links $ _SERVER [` PHP_SELF `] return` `-} else {return $ url -}}


    Het probleem met het gebruik van een ongefilterde servervariabele is dat deze kan worden gebruikt in cross-site scripting-aanvallen. Volgens de meeste referenties moet je het alleen filteren met "htmlentities ()", maar het is nog steeds onvoldoende, daarom zijn er buitensporige veiligheidsmaatregelen voor deze functie.

    Anderen stellen voor om het actiekenmerk van het formulier leeg te laten of het in te stellen op een lege reeks. Maar dit zou kunnen leiden tot een klik op Iframe voor ontvoering.
  • Deel 5
    Maak verwerkingspagina`s

    1
    Maak de loginprocespagina aan (process_login.php)

    Maak een bestand om de logins, met de naam "process_login.php", te verwerken in de map "includes" van de applicatie. U moet naar deze map gaan omdat deze geen HTML-indeling heeft.

    We zullen de PHP-functieserie mysqli_ * gebruiken, omdat dit een van de meest recente mySQL-extensies is.

  • 2
    Maak een script om de sessie te sluiten.

    Het script voor het sluiten van de sessie moet inloggen, het vernietigen en het vervolgens doorsturen naar een andere locatie. Opmerking: we raden u aan hier een CSRF-beveiliging toe te voegen als iemand erin slaagt om een ​​verborgen link naar deze pagina te verzenden. Ga naar voor meer informatie over CSRF Codering Horror.

    De huidige code om de gebruiker te ontkoppelen, die u moet toevoegen aan het bestand met de naam "logout.php" in de map "includes" van de toepassing, is als volgt:

  • 3
    Registratiepagina.

    U moet de registratie code in twee nieuwe bestanden met de naam "register.php" in de root directory van de applicatie en "register.inc.php" in "omvat", die zal omvatten:
  • Krijgt en valideert de gebruikersnaam die de gebruiker wil gebruiken.
  • Haalt en valideert het e-mailadres van de gebruiker.
  • Krijgt en valideert het wachtwoord dat de gebruiker wil gebruiken.
  • Het zet het wachtwoord met hash en retourneert het naar de pagina "register.php" (dat wil zeggen, het stuurt het naar zichzelf).

  • Het grootste deel van de validatie gebeurt in jаvascript, aan de kant van de klant. Dit komt omdat de gebruiker niet de motivatie heeft om deze verificaties te omzeilen. Waarom zou de gebruiker een account willen maken dat niet zo veilig is? In de volgende sectie praten we over jаvascript.

    Voor nu, hoeft u alleen maar het bestand "register.php" aan te maken en de onderstaande code op te nemen:

    Secure Login: Registratieformulier

    Registreer bij ons

  • Gebruikersnamen mogen alleen cijfers, hoofdletters, kleine letters en onderstrepingstekens bevatten.
  • De e-mails moeten een geldig formaat hebben.
  • Wachtwoorden moeten uit minimaal 6 tekens bestaan.
  • Wachtwoorden moeten bestaan ​​uit:
    • Ten minste één hoofdletter (A-Z)
    • Ten minste één kleine letter (a-z)
    • Ten minste één nummer (0-9)
  • Het wachtwoord en de bevestiging moeten exact overeenkomen.
  • Keer terug naar de inlogpagina.



    Het bestand "register.inc.php" in de map "includes" moet de onderstaande code hebben:

    Het e-mailadres dat je hebt ingevoerd is niet geldig

    `-} $ password = filter_input (INPUT_POST,` p`, FILTER_SANITIZE_STRING) -als (strlen ($ password) = 128) {// De gehashte wachtwoord moet 128 caracteres.// Anders, zeer zeldzaam Het zal gebeurd zijn. $ error_msg. = `

    Ongeldige wachtwoordconfiguratie.

    `-} // geldigheid van de gebruikersnaam en het wachtwoord is geverifieerd in de cliente.// Dit zal genoeg zijn, want niemand zal profiteren van het schenden van deze reglas.//$prep_stmt // = "SELECT ID FROM members WHERE email =? LIMIET 1"- $ stmt = $ mysqli->prepare ($ prep_stmt) - // Controleer de bestaande e-mail. if ($ stmt) {$ stmt->bind_param (`s`, $ email) - $ stmt->execute () - $ stmt->store_result () - if ($ stmt->num_rows == 1) {// Er bestaat al een andere gebruiker met deze e-mail. $ error_msg. = `

    Er bestaat al een gebruiker met dit e-mailadres.

    `- $ stmt->close () -} $ stmt->close () -} else {$ error_msg. = `

    Databankfout Lijn 39

    `- $ stmt->close () -} // Verifieer de bestaande gebruikersnaam. $ prep_stmt = "SELECT ID FROM leden WHERE gebruikersnaam =? LIMIET 1"- $ stmt = $ mysqli->prepare ($ prep_stmt) -if ($ stmt) {$ stmt->bind_param (`s`, $ gebruikersnaam) - $ stmt->execute () - $ stmt->store_result () - if ($ stmt->num_rows == 1) {// Er bestaat al een nieuwe gebruiker met deze gebruikersnaam. $ error_msg. = `

    Er bestaat al een gebruiker met deze gebruikersnaam

    `- $ stmt->close () -} $ stmt->close () -} else {$ error_msg. = `

    Database fout lijn 55

    `- $ stmt->close () -} // In afwachting: // we moeten ook rekening houden met de situatie waarin de gebruiker niet // rechten te kunnen registreren, om na te gaan wat voor soort gebruiker probeert uit te voeren operación.if // (empty ($ ERROR_MSG)) {// Maak een zout aleatoria.//$random_salt = hash ( `sha512`, uniqid (openssl_random_pseudo_bytes (16), TRUE)) - Werkte niet // $ random_salt = hash ( `sha512`, uniqid (mt_rand (1 mt_getrandmax ()), true)) - // Maak een wachtwoord met zout. $ Password = hash ( `sha512`, $ password $ random_salt.) - // Plaats de nieuwe gebruiker aan de database. if ($ insert_stmt = $ mysqli->voorbereiden ("INSERT INTO leden (gebruikersnaam, e-mailadres, wachtwoord, zout) WAARDEN (?,?,?,?)")) {$ insert_stmt->bind_param ( `ssss` $ username, $ e-mail, $ password, $ random_salt) - // Voer de query preparada.if ($ insert_stmt-!>execute ()) {header ( `Locatie: ../error.php?err=Registration mislukking: INSERT`) -}} header ( `Location: ./register_success.php`)-}}


    Als er geen POST-gegevens aan het formulier zijn verstrekt, wordt het registratieformulier weergegeven. De submit-knop van het formulier roept de jаvascript-functie "regformhash ()" aan. Deze functie voert de nodige validatiecontroles uit en verzendt het formulier wanneer alles correct is. We zullen het hebben over jаvascript-functies in de volgende sectie.

    Als er POST-gegevens bestaan, worden sommige controles van de server uitgevoerd om deze schoon te maken en te valideren. WEET ZICH BEWUST dat deze controles tot nu toe nog niet zijn voltooid. Sommige van de problemen worden genoemd in de opmerkingen in het bestand. Tot op heden verifiëren we alleen dat het e-mailadres de juiste indeling heeft, dat het wachtwoord met hash de juiste extensie heeft en dat de gebruiker niet probeert een reeds geregistreerd e-mailadres te registreren.

    Als alles correct is, wordt de nieuwe gebruiker geregistreerd en wordt een nieuw record in de ledentabel geschreven.

    Deel 6
    Maak jаvascript-bestanden

    1
    Maak het bestand "sha512.js".

    Dit bestand is een jаvascript-implementatie van het sha512-hash-algoritme. We zullen de hash-functie gebruiken zodat de wachtwoorden niet in eenvoudige tekst worden verzonden.

    Je kunt het bestand downloaden pajhome.org.uk

    (Het wordt ook opgeslagen in de github-repository).

    Sla uw exemplaar van dit bestand op in een map met de naam "js" in de hoofdmap van de toepassing.

  • 2
    Maak het bestand "forms.js".
    Dit bestand, dat u in de map "js" van de toepassing moet maken, is verantwoordelijk voor de hash van de wachtwoorden voor de aanmeldingsformulieren (formhash ()) en registratie (regformhash ()):

    functie formhash (vorm, wachtwoord) {// Maak een nieuw element, dit is ons wachtwoordveld met hash. var p = document.createElement ("invoer") - // Voeg het nieuwe element toe aan ons formulier. form.appendChild (p) -p.name = "p"-p.type = "verborgen"-p.value = hex_sha512 (wachtwoord.waarde) - // Zorg ervoor dat het wachtwoord voor platte tekst niet wordt verzonden. password.value = ""- // Stuur het formulier definitief. form.submit () -} functie regformhash (form, uid, email, password, conf) {// Controleer of elk veld een waarde heeft (uid.value == `` || email.value == `` || wachtwoord .value == `` || conf.value == ``) {alert (`Je moet alle gevraagde informatie opgeven, probeer het opnieuw`) - return false -} // Controleer de usernamere = / ^ w + $ / - if (! re.test (form.username.value)) {alert ("De gebruikersnaam mag alleen letters, cijfers en underscores bevatten. Probeer het opnieuw") -form.username.focus () - return false -} // Controleer of het wachtwoord de juiste extensie (min 6 karakters) // Verificatie verdubbelt onder maar wordt opgenomen voor de gebruiker een // hebben. specifieker.als gids (wachtwoord.waarde.lengte) < 6) {alert ( `Het wachtwoord moet minstens 6 karakters Please try again ") -. Form.password.focus () - return false -} // Ten minste één nummer, een kleine letter en een hoofdletter // minstens 6 caracteresvar re = /(?=.*d)(?=.*[az])(?=.*[AZ]).{6,}/-if (! re.test (password .Value)) {alert ( `wachtwoorden moeten minstens één cijfer, één kleine letter en een hoofdletter bevatten Probeer het opnieuw.`) - return false -} // Controleer het wachtwoord en de bevestiging zijn igualesif (password .value = conf.value) {alert ( `het wachtwoord en de bevestiging komen niet overeen Probeer het opnieuw.`) - form.password.focus () - return false -} // maak een nieuw item binnenkomst, Dit wordt ons wachtwoordveld met hash. var p = document.createElement ("invoer") - // Voeg het nieuwe element toe aan ons formulier. form.appendChild (p) -p.name = "p"-p.type = "verborgen"-p.value = hex_sha512 (wachtwoord.waarde) - // Zorg ervoor dat het wachtwoord voor platte tekst niet wordt verzonden. password.value = ""-conf.value = ""- // Stuur het formulier definitief. form.submit () - return true-}

    In beide gevallen plaatst jаvascript een hash in het wachtwoord en geeft deze door aan de POST-gegevens bij het maken en invullen van een verborgen veld.

  • Deel 7
    Maak HTML-pagina`s

    1
    Maak het login-formulier aan (login.php).

    Dit is een HTML-formulier met twee tekstvelden, getiteld "e-mail" en "password". Gebruik het formulier drukt, wordt de jаvascript-functie "formhash ()", waarvoor een wachtwoord hash zal genereren en stuurt de inhoud van "e-mail" en "p" (gehashte wachtwoord) naar de server te bellen. U moet dit bestand in de root directory van de applicatie te maken.

    Bij het starten van de sessie is het het beste om iets te gebruiken dat niet openbaar is. In deze gids gebruiken we de e-mail als inlog-ID, maar de gebruikersnaam kan dan worden gebruikt om de gebruiker te identificeren. Als de e-mail op een pagina in de bredere toepassing is verborgen, wordt een andere onbekende variabele toegevoegd om de accounts te kraken.

    Let op: hoewel we het wachtwoord versleuteld, zodat het niet in platte tekst wordt verzonden, is het essentieel dat u het HTTPS-protocol (TLS / SSL) gebruiken bij het verzenden van wachtwoorden om een ​​productiesysteem. Niet voor anderen erop aandringen dat simpel gezegd een wachtwoord hash onvoldoende. Je kan een "man-in-the-middle" aanval die de hash gestuurd kon lezen en te gebruiken om in te loggen ervaren.

    Veilig inloggen: inloggenFout bij inloggen!

    `-}?>

    Als u geen account hebt, alstublieftte registreren.

    Als het klaar is, alstublieftsluit de sessie.

    Het is verbonden.


  • 2
    Maak de pagina "register_success.php.

    Maak een nieuwe PHP-webpagina met de naam "register_success.php" in de hoofdmap van de toepassing. Dit is de pagina waar u naar de gebruiker wordt doorgestuurd nadat u zich met succes hebt geregistreerd. Natuurlijk kunt u deze pagina maken zoals u wilt of u kunt deze omleiden naar een andere pagina (of niet). Het zal van jou afhangen. U moet de pagina vinden in de hoofdmap van de toepassing. De huidige pagina "register_success.php" die we hebben geschreven ziet er als volgt uit:

    Secure login: succesvolle registratie

    Succesvolle registratie!

    Nu kun je teruggaan naarde inlogpagina en start de sessie.


  • 3
    Maak de foutpagina aan.

    Maak een nieuwe HTML-pagina in de hoofdmap van de toepassing en noem deze "error.php". Dit is de pagina waar u naar de gebruiker wordt omgeleid in het geval van een fout tijdens het starten van de sessie, registratie of bij het opzetten van een beveiligde sessie. De onderstaande code toont eenvoudig een algemene foutpagina. Misschien heb je iets geavanceerder nodig. Houd er echter rekening mee dat alles dat aan de pagina is toegevoegd, correct moet worden gefilterd om te beschermen tegen mogelijke XSS-aanvallen. De voorbeeldcode van de pagina is de volgende:

    Secure Login: Fout

    Er was een probleem.


  • Deel 8
    Bescherm pagina`s

    1
    Volgorde van opdrachten voor de beveiliging van pagina`s.

    Een van de meest voorkomende problemen met authenticatiesystemen is dat de ontwikkelaar vergeet om te controleren of de gebruiker is verbonden. Het is erg belangrijk dat u de onderstaande code op elke beveiligde pagina gebruikt om te controleren of de gebruiker is verbonden. Zorg ervoor dat u deze functie gebruikt.

    // Voeg hier de verbinding en de functies van de database toe. Zie 3.1. sec_session_start () - if (login_check ($ mysqli) == true) {// Voeg hier de inhoud van uw beveiligde pagina toe! } else {echo "U bent niet gemachtigd om deze pagina te openen. Start alstublieft uw sessie ".-}

    Als voorbeeld van wat u moet doen, hebben we een voorbeeldbeveiligde pagina toegevoegd. Maak een bestand met de naam "protected_page.php" in de hoofdmap van de applicatie. Het bestand zou moeten lijken op wat we hierna zullen laten zien:

    Secure login: beveiligde paginaWelkom, 

    Dit is een voorbeeld van een beveiligde pagina. Om toegang te krijgen tot deze pagina, moeten gebruikers inloggen. Op een bepaald moment zullen we ook de rol van de gebruiker verifiëren, zodat de pagina`s het type gebruiker kunnen bepalen dat geautoriseerd is om toegang te krijgen tot de pagina.

    Keer terug naar deinlogpagina.

    U bent niet gemachtigd om deze pagina te openen. alsjeblieft login.


    Onze applicatie leidt de gebruiker naar deze pagina om nadat hij zich succesvol heeft geregistreerd. Het is duidelijk dat uw implementatie niet hetzelfde hoeft te zijn.

    tips

    • Ga weg van de md5-functie in de login-scripts, het md5 hash-algoritme wordt beschouwd onzeker.
    • Met zeer weinig wijzigingen in deze voorbeeldscripts kunt u met andere SQL-systemen werken, zoals SQLite of PostgreSQL.
    • Gebruik HTML en CSS om het toegangs- en afsluitformulier van de gewenste pagina`s op te maken.
    • Als je een ander hash-algoritme in plaats van sha512 wilt gebruiken, probeer dan Whirlpool. Vermijd het gebruik van Gost, sha1 (tenzij het goed gezouten is en verschillende iteraties heeft) en, zoals we al vermeldden, md5. Moedig uw gebruikers aan om unieke, veilige wachtwoorden te maken, met hoofdletters, kleine letters, cijfers en symbolen. Overweeg uw gebruikers te vragen een aanmeldingsnaam te maken die niet de gebruikersnaam is, om deze veiliger te maken.

    waarschuwingen

    • De startpagina en registratie moeten HTTPS gebruiken. De scripts in dit artikel dwingen je niet om het te doen en het zou eigenlijk gemakkelijker zijn om het niet tijdens de ontwikkeling te doen, maar je zou deze scripts niet in een productieomgeving moeten gebruiken tenzij je HTTPS gebruikt.
    • Zorg ervoor dat de gebruiker uw PHP-scripts niet kan zien, wat kan gebeuren als gevolg van een onjuiste configuratie van de server. Gebruikers kunnen informatie over uw database verzamelen, zoals namen en wachtwoorden, als uw PHP-code zichtbaar is. In het ideale geval bevinden alle scripts die zijn opgenomen in andere reeksen of pagina`s zich in een map buiten het bestandssysteem van de server en wordt er verwezen naar een relatief pad, bijvoorbeeld toevoegen: "../ .. /includes/myscript.inc.php ".
    • Niets is 100% veilig. Vergeet niet het laatste beveiligingsnieuws bij te houden om de beveiliging van uw scripts te blijven verbeteren.
    • Dit anti-brute force-script dat het account van een gebruiker blokkeert, kan heel gemakkelijk worden misbruikt. We raden ten zeerste aan om een ​​brute force-techniek zoals CAPTCHA te gebruiken.
    • We raden aan om een ​​CAPTCHA op de inlogpagina te gebruiken om brute force en DoS-aanvallen te hinderen. De CAPTCHA moet na twee mislukte inlogpogingen op het formulier worden weergegeven, maar is nog niet geïmplementeerd in de voorbeeldcode.
    • Je zou een betere oplossing kunnen krijgen met een framework zoals Zend 2, Symfony of CakePHP. Al deze kaders hebben regelingen voor beveiligde sessies en beveiligingsmodules om te helpen met het inlogproces. Als u een framework gebruikt, ziet u waarschijnlijk dat u betere applicaties schrijft.
    Delen op sociale netwerken:

    Verwant
    Hoe u uw standaard Gmail-account kunt wijzigenHoe u uw standaard Gmail-account kunt wijzigen
    Hoe de tweede aanmeldingsverificatie in Yahoo in te stellenHoe de tweede aanmeldingsverificatie in Yahoo in te stellen
    Hoe een pincode in te stellen om in te loggen bij Windows 10Hoe een pincode in te stellen om in te loggen bij Windows 10
    Hoe een account in Keek te verwijderenHoe een account in Keek te verwijderen
    Hoe te voorkomen dat u zich registreert op een website met behulp van BugMeNotHoe te voorkomen dat u zich registreert op een website met behulp van BugMeNot
    Hoe cookies en jаvascript in te schakelenHoe cookies en jаvascript in te schakelen
    Hoe een website te hackenHoe een website te hacken
    Hoe aanmelden bij DreamBoxHoe aanmelden bij DreamBox
    Hoe inloggen op TwitterHoe inloggen op Twitter
    Hoe een gratis ADSL-account te krijgenHoe een gratis ADSL-account te krijgen
    » » Hoe een veilig login-script te maken in php en MySQL
    © 2021 emkiset.ru