Sådan oprettes et sikkert login script i PHP og MySQL

Med flere og flere rapporter om hackere, der forvalter at omgå webstedssikkerheden, søger udviklere mere effektive former for beskyttelse. Hvis dit websted har et medlemskabssystem, risikerer det at blive hacket og brugerdata kan blive kompromitteret. Denne artikel viser dig, hvordan enhver kan forsøge at øge sikkerheden ved login ved hjælp af PHP. Koden er ikke perfekt, men sikkerhed og kryptering er meget komplekse og konstant opdateret. Derfor kan vi ikke garantere, at hele dette videnområde forklares her.

Hvis du bemærker, at vi har gået glip af vigtige emner, bedes du kontakte os, så vi kan altid forsøge at forbedre artiklen. Ved at følge nedenstående tips kan du beskytte dig mod forskellige typer angreb, som kiksere bruger til at tage kontrol over brugerens konti, slette konti eller ændre data. Her er listen over mulige angreb, som vi kan forsvare os på:

Tilgangen er at bruge en blanding af datafiltrering, kryptografi og andre metoder, der gør livet til onde fyre mere kompliceret.

Vi søger altid at forbedre dette script. Den nyeste version af denne kode er tilgængelig på github. Der kan være nogle forskelle mellem den kode, du downloader, og den kode, der bruges i denne artikel. Det er også vigtigt at vide, at udseendet af HTML-sider ikke var vores prioritet.

Bemærk også, at vi ikke lukker PHP-faner på filer, der kun indeholder PHP-kode. Vi glæder os til de fleste kodningsformateringsanbefalinger.

Og endelig skal du oprette alle andre applikationer end HTML-filer i flere mapper i hovedmappen. Den nemmeste måde at få den rigtige katalogstruktur på er at downloade den nyeste kode ved at følge ovenstående links.

Du er velkommen til at bruge denne applikation som grundlag for din egen implementering, men det tjener ikke som en perfekt skabelon til kodning!



Nødvendige materialer

Da vi skal bruge myqli_ * PHP klassen til at få adgang til vores mySQL database, skal du bruge følgende PHP og mySQL versioner:

  • * PHP version 5.3 eller højere
  • * MySQL version 4.1.3 eller højere

Du skal også bruge en server konfigureret til at bruge PHP til at være vært for dine sider. Mest sandsynligt vil det være den samme udbyder af dit websted hosting, medmindre du laver din egen hosting af websider.

For at kontrollere PHP og MySQL versionen på din server skal du bruge phpinfo () - funktion.

trin

Del 1
Konfigurer din server

  1. 1
    Installer en netværksserver, PHP og MySQL på din server.

    De fleste web hosting-tjenester på netværket har allerede PHP og MySQL installeret. Du skal bare tjekke de seneste versioner for instruktionerne i denne artikel til at fungere. Hvis de ikke har endda PHP5.3 og Mysql5 versioner, kan det være hensigtsmæssigt at sætte spørgsmålstegn ved en lille sikkerhed, de tilbyder. Dette skyldes, at softwaren er opdateret, er en del af sikkerhedsprocessen.

    Hvis du har din egen server på din computer, er det bedst at installere det standardprogram, der normalt bruges til dit system. Generelt, hvis du ikke bruger setup til produktion og arbejder med Windows eller OS / X, er installation af XAMPP et godt valg. Få den korrekte version til dit operativsystem på linket:

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

    Husk at XAMPP aldrig skal bruges til at skabe et produktionsservermiljø for dig.

    Hvis du bruger Linux, skal du bruge din pakkechef til at downloade og installere alle nødvendige pakker. Nogle distributører som Ubuntu indeholder alle de nødvendige applikationer på ét sted. Brug bare en Ubuntu terminal og gør følgende:

    sudo apt-get install lampe server ^ phpmyadmin



    Selvom du installerer de nødvendige elementer, er det vigtigt at kontrollere, om MySQL er konfigureret med en stærk rodadgangskode.

Del 2
Konfigurer MySQL Database

  1. 1
    Opret en MySQL-database.

    Log ind på din database som administrator (normalt root-user)

    I denne artikel opretter vi en database med navnet "secure_login".

    Sådan gør du det i artiklen https://pt.hodtari.com/Instalar-o-phpMyAdmin-em-Seu-PC-do-Windows

    Du kan bruge koden nedenfor, eller gøre det samme som i phpMyAdmin / din favorit GUI MySQL klient, hvis du foretrækker:

    CREATE DATABASE `secure_login`-
    Bemærk: Nogle website hosting-tjenester tillader dig ikke at oprette en database ved hjælp af phpMyAdmin, Lær hvordan du gør det i cPanel.
  2. 2
    Opret en bruger, der kun har følgende rettigheder: VÆLG, OPDATER OG INDSAT.

    Ved at oprette en bruger med begrænsede rettigheder kunne en hacker ikke slette noget fra databasen, selvom han kunne finde en brud på sikkerheden. Brug af disse privilegier kan du gøre næsten alt sammen med din ansøgning. Og hvis du er bekymret for at være paranoid, skal du oprette en anden bruger til hver rolle.

    Husk at du skal logge ind på MySQL som en bruger med tilstrækkelige privilegier (det vil sige en rodbruger) for at oprette en anden bruger.

    Her er detaljerne for den bruger, vi oprettede:
    • Bruger: "Sec_user"
    • adgangskode: "EKcGZr59zAa2BEWU"

    Bemærk: Det anbefales at ændre adgangskoden ovenfor, når du kører din egen server. Når du gør dette, skal du sørge for at ændre koden nedenfor og PHP-databaseforbindelseskoden i det program, der skal oprettes.

    Du behøver ikke at huske dette kodeord, så lav en der er så kompliceret som muligt. Tjek følgende link til adgangskode generator: tilfældig adgangskode generator

    Nedenfor er SQL-koden til oprettelse af brugerdatabasen og tildeling af tilladelser til bestemte procedurer til dem. Et alternativ er at udføre denne opgave i GUI-klientdatabasen, f.eks. Phpmyadmin:

    Opret bruger `sec_user` @ localhost identificeret ved `eKcGZr59zAa2BEWU`-SELECT GRANT INSERT, UPDATE ON` secure_login`. * TO `sec_user` @ `localhost`-


    Hvis du vil slette poster fra nogen af ​​tabellerne i dette modul, skal du tilføje DELETE til din privilegieliste eller oprette en anden bruger med kun DELETE-privilegiet, og kun tabellen indeholder de data, du vil slette (hvis du ikke vil slette data fra begge tabeller). Du behøver ikke give DELETE privilegium til nogen af ​​opgaverne i dette script, som du følger som et eksempel.
  3. 3
    Opret en tabel i MySQL med navnet "medlemmer".

    Koden nedenfor opretter en tabel med fem felter (id - navn, brugernavn - brugernavn, e-mail, adgangskode - adgangskode, salt - tilfældige data, der anvendes til at øge sikkerheden og for at skræddersy adgangskode). Vi bruger CHAR-datatypen til de felter, hvis udvidelse vi kender, f.eks. "Password" og "salt", som altid vil være 128 tegn lange. Når du bruger CHAR i denne proces, får du forarbejdningskraft:

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

    Du kan gøre dette på enhver type klient, du ønsker.
  4. 4
    Opret en tabel til registrering af loginforsøg.

    Vi bruger denne tabel til at registrere en brugers login forsøg. Dette er en af ​​måderne at forhindre mere voldelige angreb på:

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

  5. 5
    Opret en sekventiel test i "medlemmer" tabellen.

    Det er vigtigt at kunne teste dit login script. Så her er et script til en bruger, hvis data du kender:
    Koden, du skal logge ind som denne bruger, er som følger:

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

Del 3
Opret en databaseforbindelsesside

  1. 1
    Opret en global indstillinger side

    Opret en mappe med navnet "indeholder" i hovedapplikationsmappen og opret derefter en ny PHP-fil i den pågældende mappe.
    Navngiv denne fil som psl-config.php. I et produktionsmiljø kan du forlade denne fil og alle andre, der følger med senere, uden for netværksserverens roddokument. Vi anbefaler kraftigt, at du gør dette, samt ændrer inklusionen og kræver kommandoer efter behov, så applikationen kan finde de inkluderede filer.

    Hvis du forlader dine indbefatte filer uden for netværksserverens roddokument, betyder det, at de ikke kan findes via en webadresse. Derfor, hvis en person glemmer at sætte `php`-udvidelsen i slutningen eller skaber problemer med filtilladelserne, kan den derfor ikke vises som tekst i browservinduet.

    Filen indeholder globale konfigurationsvariabler. Oplysninger, som om nogen kan registrere, om forbindelsen er sikker eller ej (HTTPS) og andre databaseoplysninger, kan overlades her ...

  2. 2
    Opret en databaseforbindelsesside

    Dette er den PHP-kode, som vi vil bruge til at oprette forbindelse til mySQL-databasen.
    Opret en ny PHP-fil ved navn db_connect.php i programmets mappe og tilføj koden nedenfor. Du kan derefter medtage filen på enhver side, du vil oprette forbindelse til databasen.

Del 4
Opret PHP-funktioner

Disse funktioner gør al behandling af login scriptet. Tilføj alle funktioner til en side med navnet "functions.php" i programmets mappe.

  1. 1
    Start en sikker PHP-session.
    Hvis du virkelig er bekymret for sikkerheden, er det vigtigt ikke at bare "session_start ()" i toppen af ​​hver side, hvor du ønsker at bruge php sessioner (siger de er IKKE kendt for at være sikker). Lad os oprette en funktion kaldet "sec_session_start", som vil starte en php-session sikkert. Du skal kalde denne funktion øverst på hver side, hvorfra du vil få adgang til en php-session variabel.

    Denne funktion gør dit login script meget sikrere. Det forhindrer crackers i at få adgang til session cookie-id`en via jаvascript (for eksempel i et XSS-angreb). Funktionen "session_regenerate_id ()" henter sessions-id`et på hver indlæst side, hvilket hjælper med at forhindre sessionsstyveri. Bemærk: Hvis du bruger HTTPS i dit login-program, skal du indstille variablen "$ secure" til true. I et produktionsmiljø er det vigtigt, at du bruger HTTPS.

    Opret en ny fil kaldet functions.php i din applikationsmappe og tilføj følgende kode til den:
  2. 2
    Opret login funktionen.
    Denne funktion kontrollerer, om e-mail og adgangskode er kompatible med, hvad der er i databasen. Hvis det er tilfældet, vender det tilbage som "sandt". Tilføj denne funktion til din functions.php-fil:
    funktion login ($ email, $ password, $ MySQLi) {// Brug foruddefinerede indstillinger betyder, at SQL-injektion (en type angreb) ikke er mulig. if ($ stmt = $ mysqli-> forberede ( "SELECT id, brugernavn, adgangskode, e-mail saltFROM membersWHERE = LIMIT 1?")) {$ stmt-> bind_param ( `s`, $ email) - // lister "$ email . "til parameteren $ stmt-> eksekvere () - // Kører opgaven sat $ stmt-> store_result (.) - // få variabler fra resultaterne. $ Stmt-> bind_result ($ user_id, $ brugernavn, $ db_password, $ salt) - $ stmt-> fetch () - // gør hash af kodeordet med et salt excusivo $ password = hash ( `SHA512`, $ password. . $ salt) -hvis (stmt- $> NUM_ROWS == 1) {// hvis brugeren eksisterer, kontrolleres, om kontoen er låst på grund af de grænseværdier // login-forsøg er blevet overskredet, hvis (checkbrute (user_id $, $ MySQLi) == true) {// kontoen er låst // Send en e-mail til brugeren, at kontoen er låst returnerer falsk (falsk) -} else {// Tjek om adgangskoden passer med posten i databasen // brugerens adgangskode er enviada.if ($ db_password == $ password) {// adgangskoden er korrekt! // Få brugerens user agent streng. User_browser = $ $ _SERVER [ `HTTP_USER_AGENT`] - // XSS sikkerhed trykt som værdien $ user_id = preg_replace ( "/ [^ 0-9] + /" "" $ user_id) - $ _ SESSION [ `user_id`] user_id = $ - // XSS beskyttelse trykt som værdien $ username = preg_replace ( "/ [^ a-zA-ZÆØÅ0-9 _ -] + /" "" $ brugernavn) - $ _ SESSION [ `username`] = $ brugernavn - $ _ SESSION [ `login_string`] = hash ( `SHA512`, $ password $ user_browser.) - // Login afsluttet sucesso.return sandt-} else {// adgangskoden er ikke korrekt // indspillet i dette forsøg database $ nu = tid () - $ mysqli-> query ( "INSERT INTO login_attempts (USER_ID, tid) VALUES ( `$ user_id`, `$ nu`)") - returnere FALSE-}}} else {// denne bruger har ikke existe.return FALSE-}}}

  3. 3
    Brute Force funktion.
    Brute Force eller Brute Force angreb sker, når hackere forsøger for tusindvis af forskellige adgangskoder i en enkelt konto, uanset om de er tilfældigt genererede adgangskoder eller fra en ordbog. I vores script, hvis en bruger fejler i deres login forsøg mere end 5 gange, vil deres konto blive blokeret.

    Brute force angreb er vanskelige at forhindre. En form for forebyggelse omfatter at bruge CAPTCHA-testen, som blokerer brugerkonti og tilføjer en forsinkelse til mislykkede loginforsøg, så brugeren ikke kan prøve igen i de næste 30 sekunder.

    Vi anbefaler kraftigt at bruge CAPTCHA. Vi har endnu ikke implementeret denne funktionalitet i eksemplet kode, men vi arbejder snart for at gøre det tilgængeligt. For nu skal du bruge SecureImage, hvor det ikke er nødvendigt at registrere. Eller du kan bruge noget bedre kendt, som f.eks reCAPTCHA fra google

    Uanset hvilket system du vælger, anbefaler vi dig at vise CAPTCHA-billedet efter to mislykkede loginforsøg for at undgå unødvendige brugerforstyrrelser.

    Når de konfronteres med brute force-angreb, blokkerer de fleste udviklere simpelthen IP-adressen efter en række mislykkede loginforsøg. Men der er en række værktøjer, der gør angrebsgenereringsprocessen automatisk som denne - disse værktøjer kan gennemgå en række proxyer og endda ændre IP hver gang det er nødvendigt. Ved at blokere alle disse IP-adresser kan du ende med at blokere legitime brugere også. I vores kode logger vi de mislykkede forsøg og blokerer brugeren efter fem mislykkede forsøg. Så vil brugeren blive sendt en email til brugeren med et reset link, men vi har ikke implementeret dette i vores kode endnu. Her er en kode for checkbrute () -funktionen, så snart den er skrevet. Tilføj det til functions.php-koden:

    funktion checkbrute ($ user_id, $ mysqli) {// Registrerer den aktuelle tid $ nu = tid () - // Alle login forsøg tælles inden for de sidste 2 timer. $ valid_attempts = $ nu - (2 * 60 * 60) -if ($ stmt = $ mysqli-> forbered ("VÆLG timeFROM login_attempts 
    HVOR user_id = AND tid> `$ valid_attempts` ")) {$ stmt-> bind_param ( `i`, $ user_id) -. // Kører på forhånd etablerede opgave $ stmt-> eksekvere () - $ stmt-> store_result () - // Hvis der var mere end 5 mislykkedes login-forsøg, hvis ($ stmt-> NUM_ROWS> 5) {return sand-} else {return FALSE-}}}
  4. 4
    Kontroller login status.
    Dette gøres ved at kontrollere sessionsvariablerne "user_id" og "login_string". "Login_string" SESSION-variablen har hash- og IP-adresseoplysninger sammen med adgangskoden. Vi bruger IP-adressen og browseroplysningerne, fordi det er meget usandsynligt, at brugeren vil ændre IP-adressen eller browseren under deres session. Ved at gøre dette forhindrer du et kapacitetsangreb på sessionen (session kapring, bogstaveligt). Tilføj denne funktion til din functions.php-fil i mappen med din ansøgning:



    funktion login_check ($ MySQLi) {// Kontroller, om alle variabler sessioner blev sat if (isset ($ _ SESSION [ `user_id`] $ _ SESSION [ `username`] $ _ SESSION [ `login_string`])) {$ user_id = $ _SESSION [ `user_id`] - $ login_string = $ _ SESSION [ `login_string`] - $ brugernavn = $ _SESSION [ `username`] -. // Hent brugeren strengen $ user_browser = $ _SERVER [ `HTTP_USER_AGENT`] - if ($ stmt = $ mysqli-> forberede ( "SELECT adgangskodeOpret membersWHERE id =? LIMIT 1")) {// Tildeler $ user_id "til parameteren. $ Stmt-> bind_param (i, $ user_id) - $ stmt-> eksekvere () - // Udfør forespørgslen fremstillet stmt- $> store_result () -. Hvis ($ stmt-> NUM_ROWS == 1) {/ / Hvis brugeren eksisterer, tager variabler fra resultatet. $ Stmt-> bind_result ($ password) - stmt- $> fetch () - $ login_check -hvis = hash (== $ $ login_check login_string) {// Online !!! ( `SHA512` $ $ user_browser adgangskode.) sandt-retur} else {// ingen logget tilbagevenden FALSE-}} else {// ingen logget tilbagevenden FALSE-}} else {// ingen logget tilbagevenden FALSE-}} else {// Det var ikke logget afkast FALSE- }}
  5. 5
    Ryd PHP_SELF URL
    Følgende funktion rydder resultatet af PHP_SELF servervariablen.
    Det er en ændring af den funktion, der har samme navn, der bruges af WordPress Content Management System:

    esc_url funktion ($ url) {if ( `== $ url) {return $ url -} $ url = preg_replace (` | [^ a-z0-9- ~ + _ # = - /:.?!% ($ `), $ url) - $ strip = array (`% 0d `,`% 0a `,`% 0D `,`% 0A `) - $ url = (string) URL- $ $ -count = 1, mens ($ count) {$ url = str_replace ($ strimmel,` `$ url, $ count) -} $ url = str_replace (` - // ``: // `url $) - $ url = htmlentities ($ url) - $ url = str_replace (` AMP `` # 038-`, $ url) - $ url = str_replace ( "` Vi er kun interesserede i relaterede links fra $ _SERVER [`PHP_SELF`] returnering `` -} else {return $ url-}}


    Problemet med at bruge en ufiltreret servervariabel er, at den kan bruges i et kryds script. De fleste referencer om emnet siger, at du blot filtrerer variablen ved hjælp af htmlentities (). Den dårlige nyhed er, at denne foranstaltning måske ikke er sikker nok, selv med alle forholdsregler i denne funktion.

    Andre vil instruere dig om at forlade opgavehandlingen tom eller sæt den til null. Men ved at gøre det, forlader du miljøet sårbart over for angreb iframe clickjacking angreb.

Del 5
Oprettelse af behandlingssider

  1. 1
    Opret login-behandlingssiden (process_login.php)

    Opret en fil til at behandle logins, kaldet process_login.php i programmets mappe.
    Dette var den mappe, der blev valgt for ikke at efterlade spor i HTML.

    Vi vil bruge PHP-funktionssættet mysqli_ *, fordi det er den nyeste udvidelse af mysql.

  2. 2
    Opret et logout script.

    Dit logout script skal starte sessionen, ødelægge det og derefter omdirigere brugeren til en anden side. Bemærk: Det er bedst at tilføje en CSRF-beskyttelse i dette trin, hvis nogen sender et skjult link på siden. For mere information om CSRF, besøg hjemmesiden Koding Horror.

    Den nuværende kode bruges til at logge ud af brugeren, og som skal tilføjes til en fil kaldet logout.php i applikationens mappe er:

  3. 3
    Records-side.

    Registreringskoden er inkluderet i to nye filer, en kaldet register.php i hovedapplikationsmappen og en anden kaldet register.inc.php i den inkluderende mappe. Det gør følgende:
    • Går og validerer det brugernavn, som brugeren ønsker.
    • Går og validerer brugerens email.
    • Går og validerer det kodeord, som brugeren ønsker at bruge.
    • Indsender kodeordet og sender det til register.php-siden (det vil sige koden viser adgangskoden til sig selv)

    De fleste valideringer udføres i jаvascript i klientversionen. Dette skyldes, at brugeren ikke har nogen motivation til at gennemgå alle disse checks. Hvorfor ville en bruger skabe en mindre sikker konto end normalt? Vi diskuterer jаvascript i det næste emne.

    For nu skal du bare oprette en fil, der hedder register.php-filen og indeholde den følgende kode:

    Sikker login: Registreringsformular

    Tilmeld dig hos os

  4. Brugernavne må kun indeholde cifre, store og små bogstaver og understreger ("_")
  5. E-mails skal følge et gyldigt emailformat.
  6. Adgangskoder skal være mindst 6 tegn lange.
  7. Passwords skal indeholde
    • Mindst et stort bogstav (A..Z)
    • Mindst et lille bogstav (a..z)
    • Mindst et tal (0..9)
  8. Dit kodeord skal tjekke nøjagtigt
  9. Tilbage til login side.



    Register.inc.php filen i den inkluderede mappe skal indeholde følgende kode:

    Den email-adresse, du indtastede, er ikke gyldig

    `-} $ password = filter_input (INPUT_POST,` p`, FILTER_SANITIZE_STRING) -hvis {// Den hash`et password skal have 128 caracteres.// Ellers noget meget mærkeligt der foregår (strlen ($ password) = 128!) $ error_msg. = `

    Ugyldig adgangskode konfiguration.

    `-} // Det brugernavn og adgangskode aldring tillagt den side cliente.// Der bør ikke være nogen problemer i dette trin, da ingen vinder // krænke disse regras.//$prep_stmt = "SELECT id FROM medlemmer WHERE email ? = GRÆNSE 1 "- $ stmt = $ mysqli-> forberede ($ prep_stmt) -hvis ($ stmt) {$ stmt-> bind_param ( `s`, $ email) - $ stmt-> eksekvere () - $ stmt- > store_result () - hvis ($ stmt-> NUM_ROWS == 1) {// En bruger med denne e-mail allerede esixte $ ERROR_MSG =`.

    En bruger med denne emailadresse eksisterer allerede.

    `-}} else {$ error_msg. =`

    Database fejl

    `-} // LISTE OVER BESKÆFTIGELSE: // Vi er nødt til at komme med løsninger til, når brugeren ikke har nogen ret til at // registrere, kontrol, hvilken slags bruger forsøger at udrette // operação.if (tom ($ ERROR_MSG)) {/ / Opret en tilfældig salt $ random_salt = hash ( `SHA512`, uniqid (openssl_random_pseudo_bytes (16), true)) - // Opret en adgangskode med salt $ password = hash ( `SHA512`, $ password $ random_salt.) - // indtaste den nye bruger i databasen if ($ = $ insert_stmt mysqli-> forberede ( "INSERT INTO medlemmer (brugernavn, e-mail, adgangskode, salt) VÆRDIER (?,?,?,?)")) {$ insert_stmt-> bind_param ( `ssss` $ brugernavn, $ email, $ password, $ random_salt) - // Kør præ-estabelecida.if opgave ($ insert_stmt-> eksekvere ()) {header (` Location: ../error. php? err = Registreringsfejl: INSERT `) -}} header (` Placering: ./register_success.php`)-}}


    Hvis der ikke er POST-data, der sendes til formularen, vises registreringsformularen. "Send" -knappen kalder jаvascript-funktionen kaldet regformhash (). Hun foretager den nødvendige valideringskontrol og sender formularen. jаvascript-funktioner vil blive diskuteret i det næste emne.

    Hvis POST-data eksisterer, foretages nogle server-side-checks for at rense og validere dem. Jeg BEKÆMPER, at disse checks ikke er komplette, når de bliver skrevet. Nogle af problemerne nævnes i kommentarerne i filen. For øjeblikket har vi kun kontrolleret, at e-mail-adressen følger det korrekte format, at den hashed-adgangskode har et acceptabelt antal cifre, og at brugeren ikke forsøger at registrere en e-mail, der allerede er registreret.

    Hvis alt går gennem verifikationen, registreres den nye bruger, når han udfylder et nyt register i tabellen over medlemmer af webstedet.

Del 6
Opret jаvascript-filer

  1. 1
    Opret en sha512.js-fil.

    Denne fil er en jаvascript implementering af sha512 hashing algoritmen. Vi vil bruge hashing-funktionen, så vores passwords ikke sendes i almindelig tekstformular.

    Filen kan downloades her: pajhome.org.uk

    (Det gemmes også i githubbiblioteket)

    Gem en kopi af denne fil i en mappe kaldet "js", der kommer fra programmets hovedmappe.

  2. 2
    Opret formularen for forms.js.
    Denne fil vil håndtere kodeordet for adgangskoderne til enhver form. (formhash ()) og registrering (regformhash ()):

    funktion formhash (formular, kodeord) {// Opret et nyt input element, som vil være feltet for hashed password. var p = document.createElement ("input") - // Tilføj et nyt element til vores formular. form.appendChild (p) -p.name = "p" -p.type = "skjult" -p.value = hex_sha512 (password.value) - // Pas på ikke at lade kodeordet i klartekst sendes ikke. password.value = "" - // Endelig indsende formularen. form.submit () -} funktion regformhash (form, uid, e-mail, adgangskode, conf) {// Tjek om alle områder har en valorif (uid.value == `` || email.value == `` || adgangskode }} - return false -} // Kontroller brugernavnet = / ^ w + $ / - hvis (! re.test (form.username.value)) {alert ("Brugernavn skal kun indeholde bogstaver, tal og understregninger. Prøv igen") - form.username.focus / Kontroller, om adgangskoden er lang nok (mindst 6 tegn) // Tjekken er dupliceret nedenfor, men den ekstra forsigtighed er at give flere // specifikke retningslinjer til userif (password.value.length < 6) {alert(`Passwords must be at least 6 characters long. Please try again`)-form.password.focus()-return false-}// Pelo menos um número, uma letra minúscula e outra maiúscula // Pelo menos 6 caracteres var re = /(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{6,}/-if (!re.test(password.value)) {alert(`Passwords must contain at least one number, one lowercase and one uppercase letter. Please try again`)-return false-}// Verificar se a senha e a confirmação são as mesmasif (password.value != conf.value) {alert(`Your password and confirmation do not match. Please try again`)-form.password.focus()-return false-}// Crie um novo elemento de input, o qual será o campo para a senha com hash. var p = document.createElement("input")-// Adicione o novo elemento ao nosso formulário. form.appendChild(p)-p.name = "p"-p.type = "hidden"-p.value = hex_sha512(password.value)-// Cuidado para não deixar que a senha em texto simples não seja enviada. password.value = ""-conf.value = ""-// Finalizando, envie o formulário. form.submit()-return true-}

    I begge tilfælde gør jаvascript kodeordet og sender det gennem POST-data, når du opretter og fylder et skjult felt.

Del 7
Opret HTML-sider

  1. 1
    Opret login-formularen (login.php).

    Dette er en HTML-formular med to tekstfelter, kaldet "email" og "password". jаvascript vil så generere hash af adgangskoden og sende "email" og "p" (password hash) til serveren. Du skal oprette denne fil i hovedapplikationsmappen.

    Når du logger ind, er det bedst at bruge noget, der ikke er offentligt. Til denne vejledning bruger vi e-mailen som et login-brugernavnet kan bruges senere til at identificere brugeren. Hvis e-mail ikke vises på nogen af ​​siderne i en større applikation, vil dette være mere et hinder for dem, der forsøger at knække kontoen.

    Bemærk: Selvom vi har krypteret adgangskoden, så den ikke sendes i almindelig tekstformular, er det vigtigt, at du følger HTTPS (TLS / SSL) -protokollen, når du sender adgangskoder til et produktionssystem. Vi gør opmærksom på, at hash i adgangskoden alene ikke er sikker nok. Et man-i-midten-angreb kan kaldes for at læse hash`en, der sendes, og derefter bruge disse oplysninger til at logge ind.

    Sikker login: Log indFejl ved at logge ind!

    `-}>?

    Hvis du ikke har et login, tak venligst registrere

    Hvis du er færdig, tak venligst log ud.

    Du er logget ind


  2. 2
    Opret en side kaldet register_success.php

    Opret en ny PHP-side på netværket kaldet register_success.php i hovedmapprogrammet.
    Dette er den side, som brugeren omdirigeres efter, efter at den er registreret. Men du kan tilpasse denne side som du vil, omdirigere brugeren til en anden side eller endda stoppe omdirigering af den. Det er dit valg. Siden skal være i hovedapplikationsmappen. Den nuværende register_success.php side, vi skriver, ser sådan ut:

    Sikker login: Registrering succes

    Registrering succesfuld!

    Du kan nu gå tilbage til login side og log ind


  3. 3
    Opret en fejlside

    Opret en ny HTML-side i hovedapplikationsmappen.
    Navngiv det som error.php. Dette er den side, som brugerne omdirigeres, hvis der opstår en fejl under login eller registreringsprocessen, eller når de forsøger at etablere en sikker session. Koden nedenfor giver en ret grundlæggende fejlside. Du skal bruge noget mere sofistikeret. Det er vigtigt, at indgangen på siden er filtreret for at beskytte mod XSS-angreb. Koden for prøvesiden er:

    Sikker login: Fejl

    Der var et problem


Del 8
Beskyttelse af sider

  1. 1
    Page Protection Script.

    Et af de mest almindelige problemer med autentificeringssystemer er, at udvikleren glemmer at kontrollere om brugeren er logget ind. Det er meget vigtigt, at du bruger koden nedenfor på hver beskyttet side for at se, om brugeren er logget ind. Brug følgende funktion:

    // Tilføj funktioner og databaseforbindelser her. Se 3.1. sec_session_start () - hvis (login_check ($ mysqli) == sand) {// Tilføj indholdet på din beskyttede side her! } else {echo `Du er ikke autoriseret til at få adgang til denne side, skal du logge ind .`-}

    Vi har inkluderet en beskyttet side for at tjene som et eksempel. Opret en fil ved navn protected_page.php i hovedapplikationsmappen. Filen skal indeholde noget som:

    Sikker login: Beskyttet sideVelkommen 

    Dette er en beskyttet side, der tjener som et eksempel. For at få adgang til det, skal brugerne være logget ind. På et tidspunkt vil vi også kontrollere, hvilken rolle brugeren spiller, så vi kan bestemme hvilken type bruger der er autoriseret til at få adgang til siden.

    Tilbage til login side

    Du har ikke tilladelse til at få adgang til denne side. venligst logon.


    Vores ansøgning omdirigerer til denne side efter et vellykket udfyldt login. Din implementering er ikke nødvendig for at gøre dette.

tips

  • Med få ændringer kan disse eksempler scripts ændres til at arbejde med andre SQL-systemer som SQLite eller PostgreeSQL.
  • Hvis du vil bruge en hashalgoritme ud over sha512, prøv Whirlpool. Undgå Gost, sha1 (medmindre de er fuldt forstærket med salt og flere iterationer) og som tidligere nævnt md5. Opmuntre brugere til at oprette stærke, unikke adgangskoder, der indeholder både store og små bogstaver samt tal og symboler. Tænk også på, om dine brugere kan oprette en indtjeningsindtjening adskilt fra deres brugernavn for yderligere at forbedre sikkerheden.
  • Brug HTML og CSS til at formatere login-formularen og returnere sider efter dine præferencer.
  • Hold dig væk fra funktionen md5 () i login scripts. Md5 hash-algoritmen anses for øjeblikket at være usikker usikker.

advarsler

  • Både login-siden og registreringssiden skal bruge HTTPS. Skripterne i denne artikel tvinge dig ikke til at gøre dette, og det er faktisk lettere at stoppe med at bruge det. Men husk at disse scripts ikke skal bruges i et produktionsmiljø uden at bruge HTTPS.
  • Sørg for, at PHP-scriptet er usynligt for brugeren, der kan ende med at se scriptet på grund af en forkert serverinstallation. Brugere vil sandsynligvis indsamle oplysninger om deres database som navne og adgangskoder, hvis deres PHP-kode er synlig. Ideelt set er nogen script, der er inkluderet i andre scripts eller sider placeret i en mappe uden for serverens filsystem og bruges som reference ved hjælp af en relativ sti, for eksempel, omfatter` ../../includes/myscript .inc.php `.
  • Intet er 100% sikkert. Husk at holde dig opdateret om de seneste sikkerhedsnyheder for at fortsætte med at forbedre sikkerheden for dine scrits.
  • Den anti brute kraft i dette script, som blokerer en brugerkonto, kan let bruges ukorrekt. Vi anbefaler på det kraftigste, at du bruger en anti-brute teknik som CAPTCHA.
  • Du kan finde en bedre løsning end denne artikel ved hjælp af en ramme som Zend 2, Symfony eller CakePHP. Alle giver struktur til sikre sessioner og moduler for at hjælpe loginprocessen. Bemærk også, at du kan skrive bedre applikationer, hvis du bruger en ramme.
  • Vi anbefaler dig at bruge CAPTCHA på login-siden for at gøre Brute Force og DoS-angrebene vanskelige. Vi anbefaler, at CAPTCHA vises på blanketten efter to mislykkede forsøg. Dette er endnu ikke implementeret i vores kode.
Del på sociale netværk:

Relaterede
© 2024 HodTari.com