27. september 2008 - 11:13Der er
23 kommentarer og 1 løsning
Vurdering af sikkerhed
Hej Eksperter, er der venligst nogen der vil vudere sikkerheden i dette login; overordnet om scriptet: Hver bruger bliver ved login sendt til en side fra mysql databasen brugerne må derfor ikke kunne se hinandens sider hvis de får fat i URL til hinandens. Derfor ville jeg vil vil login bruge;
Set_cookie(username) set_cookie(password)
Men jeg er i tvivl om hvorvidt det så bliver gjort afhængig af databasen, hvis Poul logger ind og de cookies bliver lagret på hans computer vil han så stadig kunne gå til Jespers side via direkte URL?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Det kommer an på om du på Jespers side sikrer at det er hans brugernavn der er gemt i cookien. Husk desuden at man altid kan "hijacke" en cookie.
Og en helt anden ting er at du forhåbentlig tjekker alle inpunts fra brugeren (brugernav, password, o. lign) så du mindsker risikoen for SQL injection.
Mht. hijacking af cookies (det skal dog lige siges at jeg ikke er sikkerheds ekspert hvad angår PHP, men har da mine forholdsregler) at hvis du både tjekker username og password cookieren på siden, samt validere disse (for at være sikker) bliver det straks sværere at skulle hacke sig ind, da man nu skal finde passwordet.
Men jeg tror ikke at det vil hjælpe at sætte en ny cookie.
Mener bare hvis man på en måde indsætter et script der siger ;
"Du må kun kommer herind hvis der er en cookie der hedder Jesper"
det må da være en udemærket sikkerhed idet cookien "jesper" først bliver lavet når login er godkendt af mysql databasen, eller hvad? er det mig der er helt galt på den.
Problemet med cookies (og sessions) er at man man en smule viden om dette samt kender ens browser ret godt kan ændre en cookie så man kan logge ind som "Søren" og ændre navnet til "Jesper". Men hvis du så også beholder passwordet og tjekker dette skal man så samtidig kender Jespers password.
Og jeg skal lige vide om du har en hel PHP side til hver bruger eller er det den samme PHP fil til dem alle, bare med forskelligt indhold?
Nej det er rigtigt nok, viste ikke hvor langt du var nået.
Her er så et alternativ:
Når en bruger logger ind generere jeg et tilfældigt unikt 32-cifret ID, som så gemmes i f.eks. en cookie. Brugernavnet gemmes så også en cookie.
Når så brugeren ønsker at se en side, tester jeg om det unikke ID findes i databasen og om brugernavnet passer til. En bruger kan kun være logget ind med ét ID af gangen.
Jeg synes ikke om at gemme passwordet i en cookie...
Sikkerheden er ikke helt så høj, men den er da i hvert fald lidt højere. (Efter min mening)
I din database laver du bare en tabel der hedder sessions. Den kan have tre felter: Brugernavn/BrugerID, der indeholder brugerens navn. SessionID, der vil indeholde det unikke ID. Tid, der vil angive hvornår brugeren sidst var aktiv.
Når en bruger så logger ind laver du et unikt ID og indsætter det i databasen. Til at generere ID'et kan du jo bruge denne stump kode: md5(uniqid(rand(), true));
Når så brugeren vil se en side, tjekker du om der i tabellen er en række, hvor brugerens navn og det unikke ID begge er. Du kan jo så også lige tjekke om tiden i databasen er ældre end f.eks. 20 min. Her vil jeg anbefale at du bruger et timestamp.
Hvis der findes en række, skal du så lige opdatere tiden...
Så ved login ser det nogenlunde sådan ud:
<?php // Brugernavn og password tjekkes ... // Brugeren skal nu logges ind $id = md5(uniqid(rand(), true));
$query = mysql_query("INSERT INTO Sessions (Brugernavn, Session, Tid) VALUES ($brugernavn, $id, NOW())"; // $brugernavn skal selvfølgelig være escapet! // Brugeren er nu logget ind ?>
if(strlen($session) != 32){ exit; // Session er inkorrekt }
$query = mysql_query("SELECT count(*) FROM Sessions WHERE Brugernavn='$brugernavn' AND Session='$session' AND Tid>(NOW()-1200)"; // 1200 = Det antal sekunder brugeren er logget ind.
list($antal) = mysql_fetch_row($query); if($antal == 1){ $nyquery = mysql_query("UPDATE Sessions SET Tid=NOW() WHERE Brugernavn='$brugernavn' AND Session='$session' LIMIT 1"); // Opdater login // Brugeren er logget ind } else { // Brugeren er ikke logget ind } ?>
Det er altid en god ide at tjekke hvad en variabel indeholde, f.eks. med regex, inden man bruger det i en query. Husk også altid at escape dem!
"systemet bruges til at vise de hjemmeside forslag jeg har lavet til folk så derfor er det en forskellige side hver gang." >> Jamen, man skriver da ikke hjemmesider for andre, hvis man har så grundlæggende mangler i sin viden om emnet. Forhåbentlig tager du ikke penge for at kode!
Nu findes der jo altså mange måder at lave en hjemmeside på, det er jo meget heldigt at der findes andet end php at kode med, men hvis det kan glæde din tilsyneladede kedelige personlighed at forsøge at trampe andre ned fordi de søger informationer til dygtiggørelse så skal du det være velkommen jeg vil bare ikke se det som svar på mine spørgsmål mere.
Moddi; Mange tak. Så har jeg noget at bruge aftenen på :) Det er lækkert at der trods alt findes mennekser herinde der vil hjælpe andre og ikke tager patent på egen viden.
Nu er det jo ikke dig, der bestemmer, hvad du ser i en tråd i et offentligt forum. Da branchens ry stadig belastes af en masse amatører, der udgiver sig for professionelle, kompetente kodere, holder jeg da også fast i min betragtning =)
Olebole; Du skal da være velkommen til at mene hvad du har lyst til, men om hvorvidt der er tale om en økonomisk gevinst ved det, synes jeg stadig går ud over grænsen hvad der er rimeligt at skulle oplyse på dette forum. Branchens rygte? javel ja men hvis ikke folk er nysgerrige og eksperimentere med kodningen så er der ingen branche på længere. Jeg har aldrig givet udtryk for at jeg er hverken professionel eller kompetent men den merkentile kultur i branchen har presset mindre erhvervsdrivende til 2. eller endda 3. rangs kodere.
Jeg har absolut ikke bedt dig bringe oplysninger om dine indtægter. Din tydelige mangel på indsigt i branchens forhold har dog overbevist mig om, du efter al sandsynlighed ikke tjener penge på at skrive hjemmesider - så se det venligst ikke som et personangreb =)
Hvordan kan jeg se det som andet? nej branche forholdene er således også irrelevante for mig idet mine indtægter er at betragte som niche virksomheders.
Men denne diskussion er irrelevant i dette forum, derfor bedes du venligst finde en anden at belære om konkurrencemæssige positioner og hvordan at privatpersoner "Stjæler" arbejdet fra proffer. Men så kan man jo vende den om at sige at hvis jeg som amatør kan tage en opgave frem for en prof så er det vel bare de uddannet der er for ringe. Men som sagt er denne diskussion irrelevant i denne sammenhæng.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.