Login systeem

Door , 14 jaar geleden, 29.258x bekeken

Aantal mappen nodig: 4
Aantal bestanden: 13

Om dit script te laten werken, moet je de volgende mappen aanmaken:
-modules
-procedures
-talen
-style

-------------------------
De mappen bevatten de volgende bestanden:

modules:
-encryption.js
-index.php (leeg bestand)

procedures:
-geldig_ip.php
-index.php (leeg bestand)
-maak_functies.php

talen:
-nl.php
-index.php (leeg bestand)

style:
login.css

In de rootmap:
-configuratie.php
-controle.php
-index.php
-index2.php
-uitloggen.php

Uitvoeren in de database:
database.sql
--------------------------

Ik heb bij dit loginsysteem gekozen voor de pagina: index2.php inplaats van een map home/index.php of iets dergelijks, om het makkelijker te houden. Zou je dit script in gebruik nemen, raad ik wel aan om een andere map aan te maken, anders wordt alles onoverzichtelijk.

Het systeem gebruikt mysql_real_escape_string tegenover SQL injecties.
Tegen XSS injecties is gekozen om geen gegevens te onthouden bij een foute login.
Tegen man in the middle is gekozen voor een javascript hash van het wachtwoord, zodat het wachtwoord niet in 'plain text' kan worden onderschept.
En het script heeft een challenge/response om te controleren of de gebruiker wel de echte persoon is.
De lege index.php bestanden in elke map is om path traversal te voorkomen.

Het script gebruikt SHA512 om wachtwoorden tijdelijk te coderen.


Het script is gebruikt als login voor enkele personen, er is geen wachtwoordvergeten/register script bij gesloten.
Het wachtwoord zal in de vorm van: "laJx6HsXNQris" worden gemaakt.


EDIT:
'Tegen XSS injecties is gekozen om geen gegevens te onthouden bij een foute login.'
moest zijn:
Er is gekozen om geen gegevens te onthouden, zodat als iemand fout heeft geantwoord en opzoek gaat naar zijn wachtwoord (misschien opgeschreven oid) dan kan een andere persoon niet zijn gebruikersnaam uitlezen.

ADD:
Het HTML van de login pagina gevalideerd en goed HTML 5 gemaakt en een css bestand voor de login toegevoegd.



Credits:
encryption.js = pajhome.org.uk/crypt/md5/

Gesponsorde koppelingen

PHP script bestanden

  1. Bcrypt.php
  2. encryption.js
  3. index.php
  4. index.php
  5. login.css
  6. maak_functies.php
  7. geldig_ip.php
  8. index.php
  9. index.php
  10. nl.php
  11. configuratie.php
  12. controle.php
  13. index2.php
  14. uitloggen.php
  15. database.sql

 

Er zijn 25 reacties op 'Login systeem'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
- Raoul -
- Raoul -
14 jaar geleden
 
Wat ik wel een beetje raar vind is dit: "Tegen XSS injecties is gekozen om geen gegevens te onthouden bij een foute login."

Wat is er mis met htmlspecialchars()?
Dos Moonen
Dos Moonen
14 jaar geleden
 
isset() is niet nodig in combinatie met empty().
De beschijving van empty() "is Determine whether a variable is considered to be empty. A variable is considered empty if it does not exist or if its value equals FALSE. empty() does not generate a warning if the variable does not exist."

Ik ga mogelijk nachtmerries krijgen van maak_wachtwoord.php =[
Bezoek de php.net pagina van crypt nog eens. Volgens mij heb je nog niet helemaal door hoe je er mee hoort te werken. Een keer het de hmac van het wachtwoord door crypt() halen met een bcrypt salt is wat Mozilla aanraad.
Jij bent alleen maar mogelijke collisions aan het op ophopen en een foutief gevoel van veiligheid aan het wekken.

Verder staat index.php er vier keer tussen en alleen de laatste heeft inhoud gekregen.

Ik weet dat ik negatief klink, maar ik heb jammer genoeg veel erger gezien.
Eddy E
Eddy E
14 jaar geleden
 
3x leeg index.php is inderdaad wat raar.
Zet er dan gewoon een header() in naar je index oid.

Heb je een online voorbeeld?
En ipv losse bestanden voor elke functies: kan dat niet in 1 bestand genaamd functies.php oid?


14 jaar geleden
 
0 +1 -0 -1
@Raoul, dat is zodat anderen de gebruikersnaam niet kunnen aflezen wanneer de persoon een mislukte inlog heeft gedaan en even weg is van de computer, zonder dat hij het venster heeft gesloten.

@Dos Moonen, sommigen maken problemen over of isset() of empty() moet worden gebruikt, vandaar dat ik alle 2 gebruik.

En die index.php is tegen path traversal, daarom zijn ie bestanden leeg maar bestaan ze wel.

En heb je misschien een voorbeeld, want ik heb nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
include('modules/bcrypt.php');

function
maak_wachtwoord($wachtwoord)
{

$bcrypt = new Bcrypt(15);
$wachtwoord = hash_hmac('sha512', $wachtwoord, 'thisisaveryverysecretkeyyouknow');
$hash = $bcrypt->hash('thisisancoolsalt');
$wachtwoord = crypt($wachtwoord, $hash);
return $wachtwoord;
}

?>


Maar hiermee kan ik het wachtwoord niet meer verifieren.

@Eddy, zoals ik al tegen Dos heb gezegt, die index.php is tegen path traversal.

En een online voorbeeld is er nog niet, ik draai het op mijn laptop, maar ik zal het binnenkort online zetten voor tests en dan laat ik het je weten.

Ik heb de 3 losse maak bestanden samen gevoegt tot 1 bestand, als er meer controle scripts bijkomen, worden die ook naar zo'n soort bestand gezet.
Dos Moonen
Dos Moonen
14 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
include('modules/bcrypt.php');

function
bcrypt()
{

  static $bcrypt;

  if (empty($bcrypt))
  {

    $bcrypt = new Bcrypt(15);
  }


  return $bcrypt;
}

function
maak_wachtwoord($wachtwoord)
{

  $hmac = hash_hmac('sha512', $wachtwoord, 'thisisaveryverysecretkeyyouknow');
  $hash = bcrypt()->hash($hmac);

  return $hash;
}

function
controleer_wachtwoord($wachtwoord, $hash)
{

  $hmac = hash_hmac('sha512', $wachtwoord, 'thisisaveryverysecretkeyyouknow');

  return bcrypt()->verify($hmac, $hash);
}

?>
Eddy E
Eddy E
14 jaar geleden
 
0 +1 -0 -1
Lege index.php tegen Path Transveral.... geef dan een header("Location: ../index.php"); oid.


14 jaar geleden
 
0 +1 -0 -1
@Dos Moonen, dankje voor het voorbeeld, ik heb het gelijk ingeplanteert. Dit is wel een stukje beter ahahah:P

@Eddy, de lege pagina's vind ik toch makkelijker, kan niemand er ook iets injecteren.
Victor -
Victor -
14 jaar geleden
 
0 +1 -0 -1
Wat doe je precies met de maak_challenge() en hoe controleer je een random string? Ik snap het idee er niet achter, want nu is de maak_challenge() gewoon een random string generator


14 jaar geleden
 
0 +1 -0 -1
@Victor-, de maak_challenge() creert een string die wordt gebruikt voor de response. Daarmee kan iemand die de gegevens heeft onderschept deze niet hersturen, aangezien de response ondertussen weer is veranderd.
- Raoul -
- Raoul -
14 jaar geleden
 
0 +1 -0 -1
@Cas Onthoud dan gewoon de gebruikersnaam en niet het wachtwoord? Dan wel met htmlspecialchars erover


14 jaar geleden
 
0 +1 -0 -1
@Raoul, ik zou het er wel in kunnen zetten, dat verhoogt de gebruiksvriendelijkheid zeker. Maar dan is er wel het veiligheidsprobleem, dat anderen ook de gebruikersnaam kunnen zien.

@Iedereen, is er niemand die kritiek heeft op dit script, of een fout heeft gevonden of een tip/idee ervoor heeft, op de personen die al hebben reageerd na?
John Berg
John Berg
14 jaar geleden
 
0 +1 -0 -1
@Cas nou als je er toch om vraagt: Het is allemaal achter elkaar geplakte procedurele code. Wellicht als je voor een oplossing met classes had gekozen het hergebruik gemakkelijk was geweest. Uiteindelijk leven we in 2012 ;-)


14 jaar geleden
 
0 +1 -0 -1
@John Berg, Dat leven in 2012 snap ik niet xD maar je hebt gelijk, misschien als ik mijn script nog even verbeter met de laatste beveiligingsmethoden dat ik ook een oplossing met classes maak:)
John Berg
John Berg
14 jaar geleden
 
0 +1 -1 -1
@Cas: ik bedoelde te zeggen dat procedurele code iets is uit de vorige eeuw.
Willem vp
Willem vp
14 jaar geleden
 
0 +1 -0 -1
In maak_challenge() wordt $sLetters (en twee andere variabelen) gevuld met array(). Dat is wel heel veel dom tikwerk. ;-) Uit luiheid (en om de code wat beter leesbaar te maken) zou ik daarvoor range('a','z') kiezen.

Daarnaast suggereert de naamgeving van de variabele dat $sLetters een string is. Dat is niet zo; het is een array van strings. Ik zou als naam dus $aLetters of $asLetters verwachten.

Verder heeft $sCijfers een element '10'. Ten eerste is dat geen cijfer en ten tweede wordt 'ie nergens gebruikt. Weg ermee dus. ;-)

In index.php (die ene die niet leeg is) staat een diep geneste if-else-if-else-if-else-constructie. Ik zou daar zelf if-elseif-elseif-else gebruiken. Ook hier weer omwille van de leesbaarheid, al was het maar omdat je dan niet zo diep hoeft te nesten. Ook is de loop vanaf regel 46 een niveau te ver ingesprongen.
Willem vp
Willem vp
14 jaar geleden
 
0 +1 -0 -1
@John Berg: OOP stamt ook uit de vorige eeuw.

Er is niks mis met procedurele code. Het is gewoon een stuk gereedschap; de ene keer kun je beter iets met procedurele code doen, de andere keer is OOP geschikter.

Wanneer je alleen maar OOP zou gebruiken is het net alsof je een timmerman bent die alleen met een hamer loopt en geen schroevendraaier heeft. Okay, een schroef kun je met een hamer ook wel in de muur krijgen, maar het is niet het beste gereedschap in die situatie.

Het is het vakmanschap van de programmeur dat bepaalt of in een bepaalde situatie gebruik moet worden gemaakt van procedures of van classes.


14 jaar geleden
 
0 +1 -0 -1
@Willem vp, heb de arrays veranderd in range(), om de code leesbaarder te maken. Scheelt weer ruimte.

Ik moet eerlijk zeggen dat ik niet uit de naamgeving kwam of het nu een string of array moest zijn en op string heb gegokt, bedankt voor de verbetering, heb de 3 variablen een a voor de naam gegeven en de s verwijderd:)

De 10 is uit het $aCijfers variabele gehaald.

De loop van regel 46 kan ik niet vinden, (waar hij te ver is ingesprongen) en ik zal eens kijken naar de if-else statement, of het handiger is om het naar een if-elseif code te veranderen.

Bedankt voor je commentaar:)
Willem vp
Willem vp
14 jaar geleden
 
0 +1 -0 -1
Regel 46 is de regel met if ($_SESSION['pogingen'] >= 10)


14 jaar geleden
 
0 +1 -0 -1
@Willem VP, sorry maar ik zie daar geen verkeerde ingesprong.

@Eddy erkelens, ik zal vandaag proberen een online voorbeeld neer te zetten.
Willem vp
Willem vp
14 jaar geleden
 
0 +1 -0 -1
Regel 46 is 2 niveaus ingesprongen, terwijl hij slechts 1 niveau ingesprongen hoort te zijn. Dat werkt helemaal door tot en met regel 235. Die regel (235) is ingesprongen, terwijl hij juist niet ingesprongen hoort te zijn. Die accolade hoort bij de accolade op regel 37 en zou dus hetzelfde indentatie-niveau moeten hebben.


14 jaar geleden
 
0 +1 -0 -1
@Willem Vp, Als het goed is is het nu verbeterd:)
Niels B
Niels B
14 jaar geleden
 
0 +1 -0 -1
misschien een domme vraag maar ik gebruik wordpress,
kan ik van deze code ook een wordpress plugin maken?
- Marco -
- Marco -
14 jaar geleden
 
0 +1 -0 -1
Jammer tot er bij de bestanden 5 of 6 x index.php staat en niet welke index.php welke is :)
Ugur Arslan
Ugur Arslan
14 jaar geleden
 
Goedendag,
Ben opzoek naar iemand die verstand van heeft om een complete inlogsysteem op te zetten voor mijn site www.duivenclub.nl Wie kan mij hieraan helpen?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Wouter J
Wouter J
14 jaar geleden
 
Maak aub hier een topic voor aan in het vacature onderdeel van het forum. Houdt je daarbij aan de vacature regels: http://www.phphulp.nl/php/forum/topic/criteria-php-vacature-berichten/16800/

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Bcrypt.php
  2. encryption.js
  3. index.php
  4. index.php
  5. login.css
  6. maak_functies.php
  7. geldig_ip.php
  8. index.php
  9. index.php
  10. nl.php
  11. configuratie.php
  12. controle.php
  13. index2.php
  14. uitloggen.php
  15. database.sql

Labels

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.