Multidesk.be » Forums » PHP » Inloggen en beveiligde pagina's

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door Kilian op maandag 7 juli 2008 om 19:02:23.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Hey,

Ik wil op m'n site wat pagina's maken die enkel toegankelijk zijn voor geregistreerde leden. Het registreren is al klaar, maar ik zoek de juiste manier voor de beveiliging. Ik wou eerst met sessies en cookies werken, maar nadat ik ergens gelezen heb (weet al niet tmeer waar) dat je ook sessies kan vervalsen weet ik niet juist meer wat de inhoud van de sessie/cookie moet zijn. Ik dacht aan de gebruikersnaam, id en paswoord (gehashed) in de sessie. Als je dan ingelogd wilt blijven worden dezelfde gegevens in de cookie geplaatst, en de volgende keer dat je op de site komt, zonder de juiste sessie wordt er gechecked of die cookie bestaat, en zo nodig de sessie aangemaakt.

Is dit echter een veilige manier? Ik zou een systeem willen vinden dat 99% hackvrij is. Ik besef wel dat de 100% nooit haalbaar zal zijn, maar je kan ze maar zo dicht mogelijk proberen te benaderen ;)

Kilian
^ Reactie #1 geschreven door Martijn op maandag 7 juli 2008 om 19:59:03.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Dit geldt voor veel zaken en ook in deze situatie: een systeem is maar zo veilig als de zwakste schakel. Ik zie geen serieuze beveiligingsproblemen in je huidige situatie.

Waarom zou je overigens de gebruikersnaam ook opslaan? Is in principe niet nodig hoor. Je sessie zou ik overigens niet opslaan/controleren. Je moet nakijken of er nog een sessie voor de gebruiker actief is (aannemend dat je het lidnummer opslaat als lidid in de sessie):

PHP
  1. <?php
  2.  
  3. if(isset($_SESSION)) {
  4.     echo "Lidnummer van het huidig ingelogde lid: ".$_SESSION['lidid'];
  5. }
  6.  
  7. ?>


Indien er nog geen sessie actief is, kijk je of de (in de cookie) opgeslagen gegevens overeen stemmen met die in de database (in principe doe je dus dezelfde actie als wanneer iemand inlogt).

Overigens, je kan je inspiratie ook opdoen in een artikel hier op Multidesk.be in de artikelsectie (categorie PHP) genoemd Hoe maak ik een loginsysteem met php en mysql dat meerdere leden ondersteunt?. Let wel op dat je de zaken niet klakkeloos overneemt, want het is niet zeker dat deze code inherent veilig is op je systeem. Wanneer magic quotes voor GPC uitstaat, is de code potentieel vatbaar voor SQL injections ;).
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #2 geschreven door Kilian op maandag 7 juli 2008 om 21:06:01.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Dat artikel had ik al gelezen, maar omdat het wachtwoord niet gecodeerd opgeslagen werd (bij snel overzien) leek het me wat minder veilig. Die magic quotes heb je me al eens geleerd, Mbm dit artikel. Dit pas ik nog steeds toe.

Hoe zit het nu met die sessies: zijn deze aan te maken door een eventuele hacker zonder met de juiste gegevens in te loggen (in veronderstelling dat het inloggen veilig is)? Is het niet mogelijk voor hem om bepaalde gegevens aan te passen? Ik zal nog eens zoeken naar de site waar ik dat gelezen had.

Kilian
^ Reactie #3 geschreven door Martijn op dinsdag 8 juli 2008 om 17:48:43.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
In het artikel wordt het wachtwoord toch door de MD5() functie gehaald? MD5 is in het verleden reeds "gekraakt" (je kan echter nooit met 100% zekerheid zeggen wat het originele wachtwoord was), maar dit kan je eenvoudig veranderen in bijvoorbeeld SHA1().

Sessies worden gemanaged vanaf de server. Het enige hoe je dit zou kunnen faken, is door een cookie aan te maken met de gegevens van een lid welke je dan gebruikt om in te loggen (gekend als session hijacking of cookie theft). Probleem zit dus bij het inloggen en minder zeer bij de sessie zelf.

Sommige websites zijn ook vatbaar voor aanvallen waarbij het SESSION_ID bekend wordt gemaakt. Een aanvaller kan het session id sniffen en gebruiken om zo de sessie over te nemen. Dit kan je oplossen door te zorgen dat je cookies gebruikt om het sessie_id op te slaan of door bij elke request een nieuw session id aan te maken.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #4 geschreven door Kilian op dinsdag 8 juli 2008 om 20:18:08.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Wat is het sessie id juist? Dit heb ik nog nooit gebruikt. Ik wil wel even snel toevoegen dat ik ook nog een sessie gebruik voor de navigatie, mb de sessie page. Ik vermoed dus dat ik op de sessies id en paswoor dmoet gaan controleren. Dit lijkt me best met een functie op te lossen.
^ Reactie #5 geschreven door Martijn op dinsdag 8 juli 2008 om 21:56:10.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Het sessie id is, zoals het woord zegt, een unieke identifier voor een bepaalde sessie. In PHP wordt dit standaard automatisch gegenereerd, maar je kan dit ook overschrijven met een eigen ID moest je dat voor een bepaalde reden nodig achten.

Wat bedoel je precies met een sessie gebruiken voor navigatie?

Algemene informatie (en gedetailleerde ook trouwens) kan je terugvinden op deze pagina's.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #6 geschreven door Kilian op dinsdag 8 juli 2008 om 23:19:13.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Bij mij wete hoef ik geen eigen sessie id te gebruiken. Met de navigatiesessie bedoel ik dat op iedere pagina een sessie wordt meegegeven om eventuele sublinks te tonen die in die categorie zouden horen.
^ Reactie #7 geschreven door Kilian op vrijdag 11 juli 2008 om 16:49:35.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Ik heb nu iets gemaakt. ZOu jij het even kunnen nakijken op veiligheid, foutjes, ...?
Zo ben in zeker dat ik iets goed heb gemaakt.

Normaal zit er nog wel een sessie "page" bovenaan de pagina, waar de pagina benoemd wordt (zie reactie hier ergens boven).

Alvast bedankt

Kilian
*Update*
Even een controle bijgevoegd of je ingelogd bent of niet (config, laatste regels). ZO kan ik indien je ingelogd bent bepaalde dingen verbergen (login, registreer, ...) en andere dingen laten zien (mijn profiel) zonder een andere pagina te hoeven te maken.

--edit--
Dat laten verdwijnen van bepaalde zaken als je ingelogd ebnt lukt me niet echt 100%. Hoe kan ik dit best doen?
Ik heb nu die functie in config.php die loggedin noemt. Ik doe het volgende:
PHP
  1. <?php
  2. loggedin($check);
  3. if ($check==1){
  4. echo 'blaat';
  5. } else {
  6. echo 'bleet';
  7. }
  8. ?>
  9.  

en ik krijg steeds bleet.


Bijlage: 26a9a9f484a5afe48bcca6438bf0daf9.zip
Deze tekst werd het laatst bewerkt voor 26.94 % door Kilian op vrijdag 11 juli 2008 om 17:29:17.
^ Reactie #8 geschreven door Martijn op dinsdag 15 juli 2008 om 11:41:14.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Ik zou gewoon controleren op een parameter in de sessie. Dus iets van (eventueel gewrapped):
PHP
  1. <?php
  2.  
  3. if (isset($_SESSION['username'])) echo 'ingelogd';
  4.  
  5. ?>
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #9 geschreven door Kilian op dinsdag 15 juli 2008 om 11:50:33.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Ok, bedankt.

Is de rest volgens jou veilig? Als er nog extra dingetjes zijn waar ik op moet letten moet je het maa weten te zeggen.

Kilian

Opmerking van de crew

Even de auteur aangepast van gast naar Kilian ;).
Martijn
^ Reactie #10 geschreven door Martijn op dinsdag 15 juli 2008 om 12:01:29.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Ik begrijp een aantal delen in je code niet echt.

Te beginnen met config.php (van voor af aan dus ;)):

Zorg ervoor dat je OVERAL session_start() aanroept, anders heeft de rest van de checks geen zin (best dus in een include plaatsen - desnoods auto prepended - , tenzij je dit graag op elke pagina ziet terugkomen).

Wat wil je net checken met !$_SESSION['id']? Ik denk dat !isset($_SESSION['id']) hier beter zou zijn (indien id inderdaad effectief NULL is).

Waarom het wachtwoord in de sessie opslaan? Alle gegevens zitten reeds in de sessie; je hoeft de authenticatie dus slechts eenmalig (d.i. bij het aanmaken van de sessie) te doen.

Bij de functie loggedin, geef je een variabele via parameter door, maar je doet hier verder niets mee. Daarnaast ga je de waarde, die via parameter doorgegeven werd, later nog overschrijven. Waarom geef je die variabele in eerste instantie mee? Ben je van zin hier later nog iets meer mee te doen?
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #11 geschreven door Kilian op dinsdag 15 juli 2008 om 12:13:56.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
1. Session_start(); wordt overal aangeroepen en een bestand waar oa de header mee wordt aangeroepen (natuurlijk voor iedere html)
2. Wat is het juiste verschil tussen !$var en !isset($var)?
3. Het wachtwoord wordt meegegeven en iedere keer te controleren of het wachtwoord niet gefaked is. Ik vind het jammer dat ik die site niet meer heb gevonden waar ze melden dat je een sessie kan faken. Als dat waar zou zijn moeten ze het wachtwoord al op de juiste manier hashen en het juiste paswoord weten.
Denk je dat het overbodig is? Dan zal ik het er eventueel wel uit halen (is ook sneller)
4. De bedoeling van die functie was om op en snelle, simpele manier in de navigatie te kunnen controleren of er iemand ingelogd was, om zo eventuele links te tonen en te verbergen. Deze functie is nu overbodig met die manier die je daarstraks zei.

Kilian
^ Reactie #12 geschreven door Martijn op dinsdag 15 juli 2008 om 13:50:55.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Bij !$var ga je een boolean waarde checken. Bij !isset($var) ga je nakijken of die variabele ooit een waarde heeft geassigned gekregen. isset($var) && $var is dus volledig geldig.
Ik zou punt 3 er zeker uithalen, veiligheid kan je nog op andere manieren afdwingen (zoek maar eens op session spoofing e.d.)
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #13 geschreven door Kilian op vrijdag 18 juli 2008 om 15:07:01.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Ik het eens op session spoofing gezocht, maar snap het niet helemaal. Ik heb wel begrepen dat ik best iedere keer het sessie id verander door session_regenerate_id(); te gebruiken. Is het dan voldoende om dit te doen en enkel het id van het lid op te slaan?

Kilian
Deze tekst werd het laatst bewerkt voor 2.3 % door Kilian op vrijdag 18 juli 2008 om 15:07:14.
^ Reactie #14 geschreven door Martijn op vrijdag 18 juli 2008 om 15:13:45.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
In principe haal je nu twee verschillende zaken aan.

Enerzijds heb je die session_regenerate_id() die de session_id wijzigt. Dit artikel op Wikipedia vertelt je ook al meer over session spoofing.

Anderzijds kies je in feite zelf wat je opslaat in de sessie. In de meeste, kleine, situaties is het lid id alles wat je nodig hebt en kan je aan de hand daarvan toch een hoop andere informatie uit bijvoorbeeld de database trekken.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #15 geschreven door Kilian op vrijdag 18 juli 2008 om 15:33:01.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Dat had ik reeds gevonden, en gelezen, maar ik dacht dat het nog om iets anders ging. Mag ik dus aannamen dat ik, mits iedere keer van sessionid te veranderen en mits het wachtwoord uit de sessie te houden een veilig systeempje heb?

Bedankt voor de moeite

Kilian
^ Reactie #16 geschreven door Martijn op vrijdag 18 juli 2008 om 15:36:40.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Neen.

Er zijn zoveel factoren die je systeem veilig of onveilig maken. Je hoeft op je server maar een bepaalde instelling te hebben gemaakt of een oude versie van een bepaald pakket te draaien en je "o-zo-veilige" script is ineens kwetsbaar voor aanvallen.

In veel sitauties is het wijzigen van het session id zelfs al "overkill" m.i.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #17 geschreven door Kilian op vrijdag 18 juli 2008 om 15:41:04.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
En het script zelf, is dat veilig?
Als je dit script gebruikt en je hebt het veilig gemaakt dan denk ik dat de serverinstellingen van de serverbeheerder afhangen.
Ik heb het dus enkel over dit scriptje.
Als er extra punten zijn die beter kunnen mag je het gerust zeggen, beter een extra beveiliging teveel dan te weinig.
^ Reactie #18 geschreven door Martijn op vrijdag 18 juli 2008 om 15:51:09.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Het is vooral belangrijk dat je het concept begrijpt. Indien niemand je sessie van buitenaf kan benaderen (dus het sessie ID zelf instellen), zit je al vrij safe hoor op dit vlak (nog meer leesvoer overigens!).
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #19 geschreven door Kilian op zaterdag 19 juli 2008 om 11:50:49.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Nog even een korte update: ik ga de hask van sha1(md5()) naar gewoon md5() veranderen. Op die manier kan ik mijn coppermine fotogalerij makelijk "samenvoegen" met mijn registratiesysteempje.
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen