Login og sikkerhed
De fleste har vel brugt uanede mængder af tid, på at finde en mulig sikkerheds fejl, her vil jeg personligt beskrive en metode, som kan gøre din side lidt mere sikker, jeg siger ikke at min metode er en sikkerhed, men blot at det hjælper på sagen, og der kan godt være at jeg ikke har ret i alt, men det er ikke derfor jeg har skrevet denne artikel.
Til dette skal der bruges MySql og PHP, MySql er ikke krævet, da det kan udskiftes med almindelige filer. Der kræves også et mindre kendskab til session, da det hele virker efter det konsept, mere info om session i bunden.
Vi skal bruge 5 filer, eller kun 4 filer.
Vi skal bruge en tabel ved navn user (eller efter eget ønske, noget andet), samt felterne username og password, i denne tekst er det begrænset til 30 tegn hver, de er begge varchar med 30 i længde.
Vi skal også bruge et felt der hedder id, denne er int og 11 lang, desuden skal den have auto_increase og primary key.
Config.php
Vi starter med den første fil, som indeholder de tekniske data, som hvordan vi finde vores MySql database. I tilfælde hvor der bruges filer, så er denne ikke nødvendig. Hvis man har disse data tilføjet, så behøves denne fil heller ikke.
<?php
$mysql = mysql_connect("localhost","brugernavn","adgangskode");
$db = mysql_select_db("database",$mysql);
?>
Denne fil gør rent faktisk ikke andet, end at tilslutte til en database i dit MySql, hvis man gerne vil have noget som fortæller dig, at det ikke lykkedes, så kan det laves ved hjælp af en simpel IF-sætning.
Reg.php
Den næste fil vi skal kigge på, indeholder oprettelse af brugere. Dette er endnu en vigtig ting, vi skal stadig sørge for at ingen kan bruge det samme navn, og det skal stadig verificere brugerens adgangskode.
<?php
if (!isset($send)) {
?>
Registrering af en ny bruger<br>
<form action=<?php $php_self ?> method=post>
Indtast ønsket brugernavn!<br>
<input type=text name=name size=30 maxlength=30><br>
Indtast adgangskode!<br>
<input type=password name=passa size=30 maxlength=30><br>
Indtast adgangskode igen!<br>
<input type=password name=passb size=30 maxlength=30><br>
<input type=submit name=send>
</form>
<?php
} else {
$result = mysql_query "SELECT * FROM user WHERE username = ’$name’";
if (!$result) {
if ($passa === $passb) {
$result = mysql_query "INSERT INTO user SET username = ‘$name’, password = ‘$passa’";
if (!$result) {
echo "Du kunne ikke registreres!";
} else {
echo "Du er nu registreret!";
}
} else {
echo "Du har ikke indtastet den samme adgangskode";
}
} else {
echo "Det valgte brugernavn er allerede oprettet";
}
}
?>
Vi lægger ud med en IF-sætning, denne IF-sætning bestemmer hvorvidt vi skal behandle data der er sendt eller ej. Så kommer der formularen, hvis der ønskes flere data, kan dette tilføjes. Alle data der bliver sendt, får automatisk den variabel, som skrevet under name="variabelnavn", disse variabler kommer til at hedde $"det valgte navn". Vi finder herefter en } else { den siger at vi skal kigge på disse data, hvis IF-sætningen er lig 0, eller i dette tilfælde 1. Vi kigger i databasen om brugernavnet allerede er optaget, i dette tilfælde vil der blot blive vist meddelelse herom. Hvis vores fine søgeresultat ikke findes, så går vi videre. Vi ser om de intastede passwords er identisk, og ikke ens som mange vil sige, desuden giver det en stører sikkerhed hvis man bruger identiske passwords, hvis denne handling er 1, så bliver brugeren tilføjet, hvis ikke, er det bare syndt, og prøv venligst igen. Resten er afslutninger på alle de brugte IF-sætninger, samt meddelelser om hvorfor ikke.
Supplerende: ! vender 1 til 0 og omvendt, dette er en god funktion, da der er nogle (som mig selv) som godt kan lide at bruge formularen før noget andet, og en tom variabel vil altid give et 0.
Supplerende: $php_self er predefineret til den url som står skrevet i adresse linien.
Supplerende: * i dit mysql_query, betyder alle felter.
Login.php
Den næste fil indeholder selve login funtionen, man logger ind og får et par globale variabler, det er så det.
<?php
if (!isset($send)) {
?>
Login
<form action=<?php $php_self ?> method=post>
Brugernavn!<br>
<input type=text name=name size=30 maxlength=30><br>
Adgangskode!<br>
<input type=password name=pass size=30 maxlength=30><br>
<input type=submit name=send>
<?php
} else {
$password = md5($pass);
$result = mysql_query "SELECT * FROM user WHERE username = ‘$name’";
if (!$result) {
echo "Det indtastede brugernavn eksisterer ikke!";
}
while ($row = mysql_fetch_array ($result)) {
$check = $row["password"];
}
if (md5($password) === md5($check)) {
session_register("username");
session_register("password");
echo "Du er nu logget ind I vores system!";
} else {
echo "Du kunne ikke logge ind!";
}
?>
Vi har meget af det fra før, det der er nyt her er session_register, den registrerer de informationer som er i variablen på nuværende tidspunkt, alle variabler som bliver registreret er globale, de kan findes ved at bruge variablen, dette kan fjernes ved at bruge session_unregister. Vi ser også en while, den bliver ved med at lave et loop, indtil den er falsk dvs. 0.
Supplerende: session kan stoppes komplet ved at bruge session_destroy.
Logout.php
Den næste fil er til at logge ud, den sletter en session, samt de data man har liggende i den.
<?php
$end = session_destroy();
if ($end) {
echo "Du er nu logget ud!";
} else {
echo "Du kunne ikke logges ud";
}
?>
Der er sådan set ikke noget nyt her, session_destroy sletter en session, din session herefter er komplet ny.
Check.php
Den næste fil er et check, denne fil fortæller ikke noget, men gør livet et helvede for folk, og med god grund.
<?php
$result = mysql_query "SELECT * FROM user WHERE username = ‘$username’";
while ($row = mysql_fetch_array ($result)) {
$check = $row["password"];
}
if ($password !== md5($check) OR !$result) {
session_destroy();
echo "<meta http-equiv=refresh content=0;URL=index.php>";
}
?>
Der er så mesterværket, det som er kedeligt for en almindelig bruger, hvis folk ikke vidste bedre, så ville de sige at du ikke ville have folk på siden. Her er grunden, den sender nemlig folk videre til forsiden (index.php), dette gøres kun hvis en af dem er falsk. Vi bruger en OR i vores IF-sætning, det betyder eller og virker, ved at kun en af dem giver det falske resultat (som altså er sandt) og sender folk videre.
Som konklusion: Kan vi drage nytte af alt, vi har et sikkert login og det er næsten umuligt for folk at logge ind, med mindre at de har oprettet en bruger, vi beskytter også en del andet. Noget som ikke er nævnt, er at vi bruge en md5 encryption, og vi krypterer de sensitive data som vi skal bruge.
Supplerende: session startes ved at bruge session_start, og skal være før alt andet kode, hvis du bruger include, så er det ikke nødvendigt at tilføje på den fil du inkluderer, bare det er på den fil som filen bliver inkulderet i.
Supplerende: Vi encrypterer kun de data vi henter, med andre ord, de encrypterede data eksisterer stadig urørt i databasen.
Som installation: Man kan installere alt dette nemt, for at bruge de globale variabler, skal der være en <?php session_start(); ?> i toppen af siden, denne sørger for at folk har adgang til det de skulle have adgang til. Config.php skal includeres på hver side hvor du skal bruge databasen. Login.php, Logout.php og reg.php kan inkluderes hvor som helst, der er ikke nogen krav til det. Check.php kan inkluderes hvor som helst, men helst først efter body elementet.
Som ændring: Kan det foreslås at skifte variabel-, tabel- og kolone-navne, af sikkerhedsmessige årsager.