Avatar billede danco Nybegynder
27. september 2008 - 11:13 Der 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?
Avatar billede danco Nybegynder
27. september 2008 - 11:14 #1
**ps**

Ville det kunne løses med endnu en cookie
fx
Set_cookie(page)
Avatar billede kjeldsted Novice
27. september 2008 - 11:25 #2
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.
Avatar billede kjeldsted Novice
27. september 2008 - 11:39 #3
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.
Avatar billede danco Nybegynder
27. september 2008 - 11:46 #4
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.
Avatar billede kjeldsted Novice
27. september 2008 - 11:53 #5
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?
Avatar billede danco Nybegynder
27. september 2008 - 12:02 #6
systemet bruges til at vise de hjemmeside forslag jeg har lavet til folk så derfor er det en forskellige side hver gang.
Avatar billede kjeldsted Novice
27. september 2008 - 12:08 #7
Men jeg går ud fra at både jepser og og poul skal kunne se indhold på den samme PHP fil?
Avatar billede danco Nybegynder
27. september 2008 - 12:15 #8
Nej overhovedet ikk,,

Poul sendes videre til /poul/index.php
jesper sendes til /jesper/index.php
osv osv

Det skal derfor kører sådan så at hvis jesper skriver /poul/index.php så skal den spørge om login fordi at cookie ikke godkender ham til det.
Avatar billede moddi100 Seniormester
27. september 2008 - 12:26 #9
du kan jo evt bare bruge .htaccess til dette. Så jesper kun har adgang til mappen jesper osv...
Avatar billede danco Nybegynder
27. september 2008 - 12:29 #10
det ville jo ikke give nogen mening nu når jeg har opbygget hele systemet omkring mysql
Avatar billede moddi100 Seniormester
27. september 2008 - 12:39 #11
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...
Avatar billede moddi100 Seniormester
27. september 2008 - 12:42 #12
Ps, det er en god ide at have et script, der automatisk sletter data i mysql, hvor der ikke har været nogen opdatering i f.eks. 20 minutter.
Avatar billede danco Nybegynder
27. september 2008 - 12:52 #13
Moddi;

Der er vi jo ude i en sikkerhed der minder om fx. netbanker og digital signatur, er det korrekt forstået?

Kan du give mig de scripts der skal bruges til det?
Avatar billede moddi100 Seniormester
27. september 2008 - 13:14 #14
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
?>

Til at tjekke om en bruger er logget:
<?php

$brugernavn = mysql_real_escape_string($_cookie['brugernavn']);
$session = mysql_real_escape_string($_cookie['session']);

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!
Avatar billede olebole Juniormester
27. september 2008 - 13:57 #15
<ole>

"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!

/mvh
</bole>
Avatar billede danco Nybegynder
27. september 2008 - 15:40 #16
Olebole ;

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.
Avatar billede olebole Juniormester
27. september 2008 - 16:10 #17
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  =)
Avatar billede danco Nybegynder
27. september 2008 - 20:10 #18
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.
Avatar billede olebole Juniormester
27. september 2008 - 20:18 #19
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  =)
Avatar billede danco Nybegynder
27. september 2008 - 21:44 #20
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.
Avatar billede kjeldsted Novice
27. september 2008 - 22:27 #21
For at vende tilbage i stedet for denne barnline diskussion.

Fik du moddi100's forslag til at virke som det skal? (Er interesseret i et system der er mere sikkert end mit eget :) )
Avatar billede danco Nybegynder
27. september 2008 - 23:59 #22
Kjeldsted;
jaa jeg kan heller ikke se hvad den skulle til for,

nej jeg har nu heller ikke forsøgt endnu, arbejdet kom lige i vejen.
Avatar billede moddi100 Seniormester
28. september 2008 - 11:05 #23
Kjeldsted og danco:
I kunne tage et kig på denne php-funktion. Den bør bruges når man bruger brugerinput i sine mysql queries.

http://dk.php.net/manual/en/function.mysql-real-escape-string.php
Avatar billede danco Nybegynder
22. november 2008 - 23:25 #24
lukkes
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester