100% sikkert login

Tags:    php

<< < 12 > >>
Hej udviklere:B

Jeg har arbejdet lidt på at lave et 100% sikkert login system, men ville hører om der var nogle som havde lidt idéer (gerne lidt kode).

Login systemet skal indeholde:
SQL database
Krytering af input
Beskyttelse mod SQL injection
En sikker brug af sessions
Skal helst virke med register_globals = on og off
Og andet jeg ikke lige har tænkt på...:roll:

Når vi står tilbage med et fantastisk login system:P, så regner jeg med at få lavet en artikel omkring det, så alle kan få et sikkert login system.



20 svar postet i denne tråd vises herunder
8 indlæg har modtaget i alt 9 karma
Sorter efter stemmer Sorter efter dato
Der er også en anden metode til at lave salt strings, som jeg mener er mere sikker, da Jonas' eksempel rent faktisk oplysninger din salt-string! - Det hjælper jo ikke noget.

Det fungerer ved at du har din almindelig password-streng, eks 'abc123'.

Dertil lægger du din salt-string, her kan vi sådan set godt bruge en forskellige for hver gang, som eksempelvis kan genereres sådan her:

$salt = md5(mt_rand());

Hvis du genererer en ny for hver skal du sørge for at gemme denne sammen med brugerlogin i din database.

Du kan også vælge at bruge den samme streng hver gang, i dette tilfælde kan man for ekstra sikkerhed, krytere denne streng før man kryterer den sammen med passworded.

$salt = 'givMigSalt';

Hermed tager jeg udgangspunkt i sidstnævnte, og laver flg. eksempel:

$password = 'detteErMit1stePassw00rdEks3mpel';
$md5_pass = md5(md5($salt).$password);

Dette giver flg. værdi til $md5_pass: 'caebecb9287ef9a982d844e948a5dcdf'

For at kontrollere om brugeren har indtastet det korrekte password, gør du blot flg.:

Lad som om at flg. to variabler er hentet fra din database, ud fra det indtastede brugernavn:
$salt = 'givMigSalt';
$md5_pass = 'caebecb9287ef9a982d844e948a5dcdf';

Variablen $password er den adgangskode brugeren har indtastet.

if ($md5_pass == md5(md5($salt).$password))
{
// Korrekt indtastet adgangskode
}

Du kan også lave denne kontrol med MySQL (hvis du benytter denne database):

SELECT
`id`
FROM
`users`
WHERE
`username`='$username'
AND
`password`=MD5(CONCAT(MD5(`salt`),'$password'))



Mit sidste tip går på at du skal huske at kontrollere login på hver side der kræver login. Ikke blot ved login, men på hver enkelt side. Gem det indtastede brugernavn og adgangskode i en SESSION eller COOKIE og kontroller ved være request, op imod databasen.



kræv en hvis længde på passwords, helst over 6 tegn, og kræv endvidere at passwordsne indeholder både tal og bogstaver - gør også login'et case sensitive.



Lavede en demo af saltede hash for et stykke tid siden da jeg sad og kedede mig.


salthash.php
Fold kodeboks ind/udKode 


Så kører du bare dinside.dk/salthas.php?pass=bla&check=bla

pass giver dig en hash af koden du angiver.
Med i demoen er et tilfældigt hash af koden 'test'. I check kan du prøve at angive et kodeord. Lavede det bare for at teste om de 2 koder er ens.

Det du skal lægge mærke til, er at selvom du giver det samme password, bliver hashen forskellig hver gang.

Håber du kan bruge det.



Indlæg senest redigeret d. 07.02.2008 20:12 af Bruger #3275


Hej Sam,

Salt string benyttes til at gøre kodeordene længre, og til at sikre at de ikke bare kan findes i en ordbog, ikke til at forhindre sniffing af sendte informationer fra klientens side.

Benyt udover salt string, md5 krypering en SHTTP forbindelse
http://www.mosaic-commons.org/~adam/shttp.html

Imod SQL Injections kan du se følgende:
http://www.phpfreaks.com/phpmanual/page/security.database.sql-injection.html

Held og lykke med guiden

Med venlig hilsen
Ieet






shttp står for secure hypertext transfer protocol. Det kan også omdefineres til SSL. SSL kræver certifikat og har ikke direkte noget med PHP at gøre.

Det nærmeste man kommer på noget du kan bruge, uden at det skal være forbundet med omkostninger er nok OpenSSL http://dk.php.net/openssl



Indlæg senest redigeret d. 08.02.2008 01:31 af Bruger #10216
Nej det kan ikke lade sig gøre at lave et 100% sikkert login system.

Men du kan selvfølgelig gøre det besværlig for Hackeren.

Først skal passwordet helst være på den anden side af 6 tegn og med tal blandet ind i ordet, så er der en lille risiko for at hackeren gætter det.

Dernæst skal du lave et hash på passwordet, efter min mening forstændig ligegyldig med hvilken du bruger om det så er md5 eller sha1 osv.
For den Hacker som ønsker at komme ind har højest sandsynlig en database med forskellige kodeord hashet i det forskellige.

Så fraråder jeg dig i at bruge tegn som <>/""# osv. da man inplementere Javascript kode idet. og det er nok til at nedlægge hele din side.

Læs evt.
http://www.ilovejackdaniels.com/php/writing-secure-php/

og søg på google omkring PHP security




shttp er en protokol. En samling kommandoer, tjek wikipedia.



En ting jeg gjorde på et tidspunkt, for at gøre brute force attacks mindre irriterende, var simpelt at når hvem/hvad det nu var der forsøgte sig havde prøvet x antal gange, ville brugernavnet og ip blive bannet i y antal timer, men det ville ikke give sig til udtryk for brugeren, det ville stadig se ud som om at den rent faktisk checkede login hver gang (faktisk ville selv kildekoden på siden heller ikke forandre sig. Jeg satte endda en kunstig latence tid), men i virkeligheden ville forsøgende bare blive afvist af serveren. Dette gav mindre belastning på serveren og brute force attack var nytteløse.

Når det så er sagt, så er dette ikke en løsning der løser særlig meget og det er svært at sætte ordenligt op. (det tog i hvert fald mig noget tid)

Selv det at forsikre sig om at loginsystemet ikke kan hackes direkte, mener jeg ikke er et størrer problem, men serveren ville altid have sikkerheds huller.

Mist bedste bud er at køre med en BSD baseret server og bruge lidt omtanke.



Saltstænger!!

eller...
Salt strings som det også hedder... :)



Som Per siger: Både tal, bogstaver og tegn i adgangskoden.

Kryptering af input: Hvad mener du præcis med det? Hvis du vil gøre det umuligt for andre at "sniffe" brugernavn/adgangskode når der trykkes login skal du have fat i noget https (google it!).

SQL Injections:
Kig på funktionen mysql_real_escape_string





<< < 12 > >>
t