Det er enhver udviklers drøm at oprette eller arbejde på en webside eller et webprojekt, der lover førsteklasses sikkerhedsfunktioner og opfylder enhver brugers bekymringer om privatlivets fred. Før du kan oprette og hoste et websted på en server, skal du dog overholde den bedste kodningspraksis.
Bare fordi du vil oprette en sikker webside, betyder det ikke, at din kode kun skal være forståelig for en raketforskers øjne. Enkelhed er nøglen til at udvikle fantastisk kode.
En simpel kode er ikke en svag kode, men en forståelig en. Enkelhed gælder for koderefaktorering og kontinuerlig brug af kommentarer. Desuden hjælper det dig med at måle og redigere din kode senere, når du skal genbruge den på andre projekter. Da denne artikel søger at give dig en gennemgang til at oprette en sikker login-side i PHP og MySQL, skal vi først overveje fordelene ved denne tilgang.
Oprettelse af et sikkert login-script i PHP og MySQL
For det første, da din login-side vil give privilegeret adgang til brugerlagrede oplysninger, vil du gerne holde cybertyve og hackere væk fra nemt at kompromittere dit system og slippe af sted med følsomme data. For det andet, uden en sikret webplatform, er it-infrastrukturer som netværk og websteder i fare for cybersikkerhedsangreb og malware.
Kom godt i gang
I denne artikeltutorial antager vi, at du har brug for en sikker login-side af to grunde. For det første kan du arbejde på et dedikeret websystem, hvor du har brug for administratoradgang til følsomt lagrede data eller oplysninger. For det andet kan dit websystem rumme specifikke brugere eller besøgende, som vil blive tildelt de nødvendige loginoplysninger, før de kan logge ind på dashboardområdet på dit websystem.
Det vigtigste aspekt af denne artikeltutorial er vores webservermiljø. Vi har brug for en, da vores websystem vil bruge en MySQL-database til at forespørge aktive brugere og give dem autoritativ adgang til det oprettede websystem.
Krav
XAMPP er et ideelt lokalt webservermiljø til at teste dine webbaserede projekter på en lokal maskine. Det giver dig hjemmesidernes præstationsperspektiv, før du lancerer dem i et produktionsmiljø. XAMPP er tilgængelig for Windows-, Linux- og OS X-brugere, hvilket gør det til et webservermiljø på tværs af platforme. Derudover forkorter XAMPP Apache, MariaDB (en forgrening af MySQL), PHP og Perl, hvilket gør det til et komplet PHP-udviklingsmiljø.
Når du først har installeret XAMPP, behøver du ikke installere anden tredjepartssoftware, for at dine PHP-projekter kan køre.
XAMPP Linux-installation
Din XAMPP-fildownload vil have filtypenavnet ".run". Det første skridt er at gøre det eksekverbart. Åbn din terminal på placeringen af din downloadede XAMPP-fil og overvej følgende fremgangsmåde. Sørg for, at navnet på den XAMPP-fil, du indtaster, stemmer overens med den, du downloadede.
$ chmod 755 xampp-linux-x64-8.0.7-0-installer.run
Bagefter skulle du være i stand til at starte XAMPP-installationsprogrammet med følgende kommando.
$ sudo ./xampp-linux-x64-8.0.7-0-installer.run
Følg installationstrinnene, indtil XAMPP er fuldt installeret på din computer.
Sørg for, at ovenstående felter er markeret for at være sikre.
Installationen vil derefter tage noget tid at fuldføre
At starte XAMPP fra din Ubuntu-terminal kræver brug af følgende kommando.
$ sudo /opt/lampp/lampp start
Et output som det følgende skærmbillede betyder, at alt er okay.
Hvis du støder på fejl, mens du starter XAMPP, kan der være tre diagnostiske løsninger på problemet. For det første har du muligvis installeret Apache og XAMPP samtidigt. Du kan løse dette problem ved at stoppe Apache-tjenesten fra terminalen og genstarte XAMPP, da Apache allerede er samlet som en af dens pakker.
$ sudo /etc/init.d/apache2 stop
$ sudo /opt/lampp/lampp start
En installeret NGINX-server kan også bruge din maskines port 80, som er nødvendig for XAMPPs Apache. Derfor bliver du nødt til at stoppe NGINX og genstarte XAMPP.
$ sudo systemctl stop nginx
$ sudo /opt/lampp/lampp start
Du kan også have en MySQL-server installeret samtidigt med XAMPP. XAMPP-serveren er allerede bundtet med en MySQL-pakke. Du bliver nødt til at stoppe den, der kører på dit system.
$ sudo /etc/init.d/mysql stop
$ sudo /opt/lampp/lampp start
Det sidste problem er, at du muligvis mangler netstat-værktøjet på dit system. Du kan installere det med følgende kommando.
$ sudo apt installer net-værktøjer
For at bekræfte den succesfulde installation af XAMPP på dit system, bør du nemt kunne få adgang til følgende URL fra din browser.
http://localhost/dashboard/
Landingssiden skal ligne følgende skærmbillede.
Du bør også være i stand til komfortabelt at få adgang til phpMyAdmin-destinationssiden.
http://localhost/phpmyadmin
Følgende skærmbillede bekræfter, at phpMyAdmin fungerer fint.
Vores selvstudiemål
Når du har downloadet og installeret XAMPP-versionen, der favoriserer din OS-platform, skal vi fremhæve hovedformålene med denne artikel.
Ved slutningen af denne selvstudieartikel vil du have forstået følgende fire hovedkoncepter bag oprettelse af en sikker login-side i PHP og MySQL.
-
Formulardesign:Her skal du udforske nogle moduler af HTML5 og CSS3
-
Forberedelse af SQL-forespørgsler:De SQL-forespørgsler, du opretter, skal være skudsikre over for SQL-injektioner. Det er den eneste måde at bevare integriteten af din MySQL-database på.
-
Grundlæggende formularvalidering:En brugers brugernavn og adgangskode bør matche dem, der er gemt i databasen, for at de ikke er gyldige legitimationsoplysninger.
-
Sessionsstyring:Sessioner er gode, da et system skal huske en gentagen bruger, uden at de skal indtaste deres loginoplysninger, hver gang de besøger et websted. Du vil være i stand til at initialisere sessioner og holde dem aktive.
Projektstruktur og opsætning
Da vi nu er sikre på, at Apache-webserveren og MySQL-databaseserveren kører, er næste skridt at oprette vores PHP-kode. Men først skal vi gøre os bekendt med dets kontrolpanel. Når din XAMPP-installation er afsluttet, startes den med et kontrolpanel, der ligner skærmbilledet nedenfor.
Hvis du klikker på menuen "Administrer servere" i dens overskrift, vil du se tre servere køre (Apache, MySQL og ProFTPD). Alle disse tre servere skal køre. Det betyder, at XAMPP-serveren er i en sund tilstand.
Klik på menuen "Åbn applikationsmappe" på dette XAMPP-kontrolpanel og spor en mappe med navnet "htdocs". Opret derefter en mappe med et navn som "fosslinux_login" inde i denne mappe. Det vil være det vigtigste adgangspunkt for vores projekt. Inde i denne "fosslinux_login"-mappe skal du oprette følgende filer og overveje deres respektive filtypenavne.
\ -- Projektfilstruktur
| -- authenticate.php
| -- home.php
| --
| -- logout.php
| -- style.css
Den enkleste måde at opnå denne filoprettelsesopgave på er at navigere til den grafiske grænseflade i mappen "fosslinux_login" og åbne systemterminalen fra dens placering og derefter bruge "touch"-kommandoen til at oprette de angivne filer. For at oprette filen index.html kan du f.eks. bruge følgende berøringskommandometode.
root@FOSSlinux:/opt/lampp/htdocs/fosslinux_login# touch index.html
Den oprettede index.html-fil vil hovedsageligt bruge HTML5 og CSS3 programmeringssprog til at oprette login-formularen til at indtaste de nødvendige brugernavne og adgangskoder.
Den oprettede style.css-fil vil fungere som et eksternt CSS-script, der refereres til af index.html-filens header.
Den oprettede authenticate.php-fil vil håndtere brugergodkendelse, databaseforbindelse, formulardatavalidering, hentning af databaseresultater og oprettelse af nye sessioner.
Den oprettede logout.php-fil vil håndtere ødelæggelsen af log-in-sessioner, før den omdirigerer brugeren til log-in-skærmen igen.
Den oprettede home.php-fil er destinationen eller landingssiden for brugere, der logger ind på websystemet.
Den oprettede profile.php-fil knytter en succesfuldt logget ind bruger til deres udfyldte og personlige brugerkontooplysninger.
Vores loginformulardesign
For at vores PHP- og MySQL-loin-script skal fungere, skal vi oprette en login-formular, hvorfra godkendte brugere vil indtaste deres loginoplysninger. Derfor opretter vi forsiden af vores login-side. Vi behøver kun CSS og HTLM til denne opgave. Vi vil bruge PHP til den logiske del af vores script.
Du kan bruge nano-editoren eller enhver anden editor efter eget valg til at åbne den index.html-fil, du oprettede tidligere.
root@FOSSlinux:/opt/lampp/htdocs/fosslinux_login# nano index.html
Udfyld filen med følgende kodesegment.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FossLinux Login Tutorial</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css">
</head>
<body>
<div class="login">
<h1>FossLinux Login Tutorial</h1>
<form action="authenticate.php" method="post">
<label for="username">
<i class="fas fa-user"></i>
</label>
<input type="text" name="username" placeholder="Username" id="username" required>
<label for="password">
<i class="fas fa-lock"></i>
</label>
<input type="password" name="password" placeholder="Password" id="password" required>
<input type="submit" value="Login">
</form>
</div>
</body>
</html>
Vi skal nu se en forhåndsvisning af visningen, der er resultatet af denne kode. Indtast følgende adresse i din browser.
http://localhost/fosslinux_login
Den resulterende visning skal ligne det følgende skærmbillede.
Da ovenstående visning er grundlæggende, er vi nødt til at tilføje lidt styling til vores loginformular via CSS. Så åbn først style.css-filen, du oprettede tidligere med din foretrukne terminaleditor.
root@FOSSlinux:/opt/lampp/htdocs/fosslinux_login# nano style.css
Udfyld det med følgende CSS-kodesegment.
* {
box-sizing: border-box;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen, ubuntu, cantarell, "fira sans", "droid sans", "helvetica neue", Arial, sans-serif;
font-size: 16px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
background-color: #435165;
}
.login {
width: 400px;
background-color: #ffffff;
box-shadow: 0 0 9px 0 rgba(0, 0, 0, 0.3);
margin: 100px auto;
}
.login h1 {
text-align: center;
color: #5b6574;
font-size: 24px;
padding: 20px 0 20px 0;
border-bottom: 1px solid #dee0e4;
}
.login form {
display: flex;
flex-wrap: wrap;
justify-content: center;
padding-top: 20px;
}
.login form label {
display: flex;
justify-content: center;
align-items: center;
width: 50px;
height: 50px;
background-color: #3274d6;
color: #ffffff;
}
.login form input[type="password"], .login form input[type="text"] {
width: 310px;
height: 50px;
border: 1px solid #dee0e4;
margin-bottom: 20px;
padding: 0 15px;
}
.login form input[type="submit"] {
width: 100%;
padding: 15px;
margin-top: 20px;
background-color: #3274d6;
border: 0;
cursor: pointer;
font-weight: bold;
color: #ffffff;
transition: background-color 0.2s;
}
.login form input[type="submit"]:hover {
background-color: #2868c7;
transition: background-color 0.2s;
}
Vi er nødt til at linke denne style.css-fil til vores index.html-fil for at se de bemærkelsesværdige ændringer. Tilføj følgende til overskriften på din index.html-fil.
<link href="style.css" rel="stylesheet" type="text/css">
Ovenstående tag skal være mellem
og tags på din index.html fil.Hvis du opdaterer login-visningssiden, bør du få en forhåndsvisning af en mere tiltalende loginformular, som vist på følgende skærmbillede.
Lad os nu prøve at forstå, hvad vi gjorde med vores login-formular. Formen har to egenskaber, "handling" og "metode". "method"-attributten er indstillet til "post", da vi vil føre brugerdata ind i serversystemet og ikke modtage, da det ville kræve, at "method"-attributten er indstillet til "get". "action"-attributten er sat til "authenticate.php", fordi det er filen, der håndterer godkendelsen af de indtastede brugerdata. Det er filen, der behandler de vellykkede formulardatainput.
Hvad angår formularfelterne, er inputtyperne "tekst" for brugernavnet og "adgangskode" for brugeradgangskoden. "Tekst"-inputtet vil være synligt for det menneskelige øje, i modsætning til "adgangskode"-inputtet, der formodes at være krypteret under brugerinput. "Send"-inputtypen er den sidste handling for at sende de registrerede brugerdata til behandling af filen "authenticate.php".
Opsætning af databasen og de nødvendige tabeller
Her skal du navigere til linket "http://localhost/phpmyadmin/" for at få adgang til MySQL-databasen. Den resulterende phpMyAdmin-grænseflade har den primære rolle at administrere en MySQL-databaseapplikation.
Øverst i denne grænseflade vil du se fanen "Databaser". Klik på den for at oprette en ny database. Navngiv det noget som "fosslinuxlogin".
Når du klikker på "opret", vil den nye database (fosslinuxlogin) dukke op på skærmens venstre menusektion/panel. Din nettoopgave ville være at oprette de nødvendige tabeller til din database. Vi har kun brug for én tabel til denne selvstudieartikel.
For at oprette og udfylde en tabel med phpMyAdmin, har du mulighed for at gøre det grafisk eller bruge konsoldisplayet nederst på dets grænsefladedisplay. Det er meget mere effektivt at bruge konsollen, da vi kun behøver at oprette en enkelt SQL-sætning for at oprette og udfylde en hel tabel. Overvej f.eks. følgende SQL-kodesætning.
OPRET TABEL, HVIS IKKE FINDER `konti` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`brugernavn` varchar(50) NOT NULL,
`password` varchar( 255) NOT NULL,
`email` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `accounts` (`id`, `brugernavn`, `adgangskode`, `e-mail`) VALUES (1, 'Brandon', '[email protected]', '[email protected]');
Som vist på skærmbillederne nedenfor, når du trykker på Ctrl+Enter på dit tastatur, udføres SQL-sætningen, og din databasetabel vil blive udfyldt.
Vi har oprettet en kontodatabase med fire kolonner (id, brugernavn, adgangskode og e-mail). Vi har også tildelt disse tabelkolonner nogle standardværdier, men vi skal primært bruge brugernavnet og adgangskoden for at teste PHP login scriptet.
Brugernes godkendelse
I sin tilstand har vi oprettet en tiltalende statisk login-formular og også opsat vores MySQL-database. Databasen har en tabel og nogle nyttige brugerdata til at drive det næste trin i denne øvelse. Først skal vi arbejde på filen authenticate.php, der er knyttet til "action"-attributten på vores login-formularvisning.
Brug din foretrukne terminaleditor til at udfylde den oprettede authenticate.php-fil med følgende data.
<?php
session_start();
// Change this connection setting to your preference.
$DATABASE_HOST = 'localhost';
$DATABASE_USER = 'root';
$DATABASE_PASS = '';
$DATABASE_NAME = 'fosslinuxlogin';
// Try and connect using the info above.
$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if ( mysqli_connect_errno() ) {
// If there is an error with the connection, stop the script and display the error.
exit('Failed to connect to MySQL: ' . mysqli_connect_error());
}
Scriptet starter med at starte en session. Dette trin er fordelagtigt, da webserveren husker brugerkontoens logindetaljer. Så når de samme brugere logger ud og vender tilbage til webstedet senere på den samme computer, vil det være nemt at logge ind igen uden at indtaste et nyt brugernavn og adgangskodeoplysninger.
Vi specificerer også den database, vi ønsker at oprette forbindelse til, sammen med dens vært, bruger og eventuelt adgangskode.
Det første skridt til at autentificere vores loginformular er at sikre, at en bruger ikke kan indsende en tom formular. Begge felter skal udfyldes. Tilføj følgende kode til din authenticate.php-fil for at hjælpe os med at nå dette mål.
// Time to check if the login form data was submitted. The isset() function checks if the form data exists.
if ( !isset($_POST['username'], $_POST['password']) ) {
// Could not fetch any data from form subbmission
exit('Please make sure you filled both the username and password form fields!');
}
Med ovenstående kodestykke vil en bruger modtage en fejl under indsendelse af en tom formular. Da vi har håndteret blanke formularindsendelser, skal vi nu godkende indsendelsen af brugerformularen med data, der allerede findes i databasen.
Tilføj følgende kode til din authenticate.php-fil.
// We need to Prepare our SQL. This SQL preparation helps prevent SQL injections
if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) {
// Bind parameters (s = string, i = int, b = blob, etc). Since a string is the username in our case, we use "s"
$stmt->bind_param('s', $_POST['username']);
$stmt->execute();
// Store or preserve the results. It helps counter-check if the user account exists within our database.
$stmt->store_result();
$stmt->close();
}
?>
Id- og adgangskodeværdierne vælges fra databasetabellen og matches med brugerinput. Det binder id- og adgangskodeværdierne til brugernavnsværdien. Når SQL-sætningen er udført, gemmes resultaterne, så de kan bruges som sessioner. Som du kan se fra ovenstående kode, er linjen "$stmt->store_result();
” tager sig af dette sessionsopbevaringsmål.
Den næste kodelinje, der skal tilføjes til din authenticate.php-fil, skulle efterfølge følgende kodesætning:
$stmt->store_result();
Tilføj følgende kodestykke efter den ovenfor fremhævede kodesætning.
if ($stmt->num_rows > 0) {
$stmt->bind_result($id, $password);
$stmt->fetch();
// At this point, the account exists. The only thing left is to verify the password.
// The use of password_hash in the registration file is encouraged for the storage of hashed passwords.
if ($_POST['password'] === $password) {
// Verification was a success! Use log in took place!
// Sessions creation takes place because a user is logged in. Sessions functionality resemble cookies because they can remember the server's data.
session_regenerate_id();
$_SESSION['loggedin'] = TRUE;
$_SESSION['name'] = $_POST['username'];
$_SESSION['id'] = $id;
echo 'Welcome ' . $_SESSION['name'] . '!';
} else {
// Incorrect password
echo 'Incorrect username and/or password!';
}
} else {
// Incorrect username
echo 'Incorrect username and/or password!';
}
Ovenstående kode omhandler vurderer databaseforespørgslen for levedygtigheden af eventuelle resultater. Hvis det indtastede brugernavn ikke er i databasen, vil der ikke være noget at vise frem. Hvis en bruger er blevet godkendt, finder initialiseringen af sessionsvariabler sted. Webserveren gemmer disse variabler, og brugerens webbrowser refererer til dem for at bestemme den samme brugers login-status.
Det er tid til at teste levedygtigheden af vores autentificeringskode. Opdater dit "http://localhost/fosslinux_login/"-link, før du fortsætter.
Prøv at logge ind med en forkert brugernavn og adgangskode-kombination og se, hvad der sker.
Til sidst fik jeg ovenstående skærmbilledefejl.
Log nu ind med det korrekte brugernavn og adgangskodekombination gemt på din MySQL-database.
Vores destinationsside
At have en login-side er ikke nok til vores tutorial, en bruger, der med succes logger ind på systemet, skal omdirigeres til en startside. Herfra vil en sådan bruger også have mulighed for at logge ud af systemet, hvis det passer dem. Først skal du udfylde din oprettede home.php-fil med følgende kodestykke.
// Vi skal altid huske at bruge sessioner. Kodesætningen nedenfor start bør altid bruges til at starte sessioner.
session_start();
// En bruger, der ikke er aktivt logget ind, omdirigeres til hovedloginsiden. ..
if (!isset($_SESSION['loggedin'])) {
header('Location:index.html');
afslut;
}
?>
Tilføj følgende HTML-kode til din home.php-fil.
FossLinux-hjemmeside
FossLinux Login Selvstudium
Log ud FossLinux-hjemmeside
Velkommen tilbage, =$_SESSION['navn']?>!