Adminpagina beveiligen met sessies

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sven de Haas

Sven de Haas

17/04/2012 09:34:15
Quote Anchor link
Ik heb een website gemaakt met een adminpagina er bij, deze mag alleen gezien worden door 1 persoon.
Momenteel heb ik de directory /admin beveiligd met .htaccess.
Als ik naar mijnsite.nl/admin ga dan vraagt hij wel netjes om username & password maar wanneer ik een adminpagina ga includen kan ik hem gewoon zien.

Aangezien ik de adminpagina toch wil includen in de website zal ik een andere manier moeten verzinnen om hem te beveiligen, ik zat te denken aan sessies, echter hier heb ik niet veel ervaring mee.


Als ik nu een formuliertje maak om in te loggen en dan controlleer of de juiste gegevens zijn ingevuld, aan de hand daarvan een sessie zet. Is dit goed?

Als volgt:


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

session_start();

if($_POST['user'] == "admin" && $_POST['pass'] == "blaat3")
{

    $_SESSION['admin'] = md5("blaat3"); // store session data
}

?>



Vervolgens boven aan elke pagina van de admin het volgende stukje script:


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

if(!isset($_SESSION['admin']) OR $_SESSION['admin'] != md5("blaat3"))
{


    // Niet ingelogd pagina

    exit;
}

?>



Is dit veilig genoeg? Of zou ik dit op een andere manier moeten aanpakken?
Alle tips en informatie is welkom, ik heb al rond gezocht op internet maar de "inlog-pagina's" zijn allemaal veel te grote scripts, ik wil het klein houden. Het gaat immers om 1 persoon die moet inloggen.


Sven
Gewijzigd op 17/04/2012 09:44:01 door Sven de Haas
 
PHP hulp

PHP hulp

27/12/2024 14:55:07
 
B a s
Beheerder

B a s

17/04/2012 09:51:06
Quote Anchor link
Wat je doet is een SESSION definiëren met het versleutelde IP adres. Dit kan en er zijn ook andere oplossingen voor.

Als je kijkt naar de eerste regel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if($_POST['user'] == "admin" && $_POST['pass'] == "blaat3")
?>


Je hoort ten eerste te kijken of er überhaupt wat is ingevuld, dit check je niet. Voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if (!empty($_POST['user']) && !empty($_POST['pass']))
?>


Daarnaast staat het wachtwoord letterlijk in je broncode. Dit is niet veilig. Daarnaast kun je beter sha1 dan md5 gebruiken. De sha1 functie is een verbetering op md5, minder kans op dubbele waardes en meer bits.

Als je het hardcode, dan kun je beter je wachtwoord in sha1 vermelden dan letterlijk. Voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$user
= 'admin';
$pass = 'd0be2dc421be4fcd0172e5afceea3970e2f3d940';

if (!empty($_POST['user']) && !empty($_POST['pass']) && $_POST['user'] == $user && sha1($_POST['pass']) == $pass)
{

  // true
}
else
{
  // false
}
?>


Wat ook aan te raden is, is om een geheime key te gebruiken bij het definiëren van je SESSION. Zo kunnen andere gebruikers op dezelfde server je SESSION niet (of minder snel) highjacken. Op jouw manier hoeven ze alleen hun IP adres door de md5 functie te halen, een SESSION te definiëren en ze zijn binnen. Dmv van een geheime code voorkom je dit. Ook zou ik de SESSION een andere, niet voor de hand liggende naam geven. Voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$blowfish
= 'aS3hpmc'; // willekeurig iets

$_SESSION['admin_iets'] = sha1($_SERVER['REMOTE_ADDR'] . $blowfish);
?>


Nu controleer je IP adres en geheime de geheime code. Wat je nu in totaal krijgt is:

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
<?php
session_start();

$blowfish = 'aS3hpmc'; // willekeurig iets
$user = 'admin'; // gebruikersnaam
$pass = 'd0be2dc421be4fcd0172e5afceea3970e2f3d940'; // je sha1 wachtwoord

if (!empty($_POST['user']) && !empty($_POST['pass']) && $_POST['user'] == $user && sha1($_POST['pass']) == $pass)
{

  $_SESSION['admin_iets'] = sha1($_SERVER['REMOTE_ADDR'] . $blowfish);
}

else
{
  if (empty($_POST['user']) || empty($_POST['pass']))
     echo '<p><b>Je bent je gebruikersnaam of wachtwoord vergeten in te vullen.</b></p>';
  elseif ($_SERVER['REQUEST_METHOD'] == 'POST')
     echo '<p><b>Ongeldige gebruikersnaam of wachtwoord.</b></p>';

  echo '<p>Je inlogformulier.</p>';
}

?>
 
Gerhard l

gerhard l

17/04/2012 09:59:16
Quote Anchor link
Kleine toevoeging op Bas:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?
session_start();
//Nu kan je op de beveiligde paginas zo kijken of iemand ingelogt is:
$blowfish = 'aS3hpmc'; // willekeurig iets
if(isset($_SESSION['admin_iets']) AND $_SESSION['admin_iets'] == sha1($_SERVER['REMOTE_ADDR'] . $blowfish)){//haakje vergeten indd;)
    //welkom admin

}
else{
    //sessie bestaat niet of is onjuist
    header('Location: urlnaarjelogin.php');
}

?>
Gewijzigd op 17/04/2012 10:15:48 door gerhard l
 
Sven de Haas

Sven de Haas

17/04/2012 10:10:07
Quote Anchor link
Jongens bedankt, deze informatie was ik naar op zoek.
Kort maar effectief stukje script.

Kan ik er nu van uit gaan dat het op deze manier een veilige methode is?
Hoe ik het begrijp heeft het niet zo heel veel meerwaarde om de sessie met een ip-adres te beschrijven?
Dat kan ook net zo goed het volgende zijn:

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
<?php
session_start();

$blowfish = 'aS3hpmc'; // willekeurig iets

$user = 'admin'; // gebruikersnaam

$pass = 'd0be2dc421be4fcd0172e5afceea3970e2f3d940'; // je sha1 wachtwoord

if (!empty($_POST['user']) && !empty($_POST['pass']) && $_POST['user'] == $user && sha1($_POST['pass']) == $pass)
{



  $_SESSION['admin_iets'] = sha1("ingelogd") . $blowfish);

?>


Of begrijp ik het dan nog niet helemaal?

Bedankt voor de moeite.
 
B a s
Beheerder

B a s

17/04/2012 10:13:59
Quote Anchor link
Het IP adres heeft in dit geval inderdaad geen meerwaarde, tenzij deze is opgeslagen in een database bij login en je die kunt controleren om zo de SESSION aan een IP adres te koppelen.

Daarnaast gebruik je sha1 nu niet goed. Dit moet zijn sha1('ingelogd' . $blowfish); - je sluit de functie te snel af. Bij de snippet van gerard l hoort nog een ) achter regel 5.
 
Sven de Haas

Sven de Haas

17/04/2012 10:30:48
Quote Anchor link
Bas, klopt dat ik hem niet goed had gebruikt.
Moest even snel in een kladblok bestandje!

Vanavond ga ik er mee aan de slag, ik laat weten of het gelukt is.

Als er nog een simpele mogelijkheid is om hem beter beveiligd te krijgen hoor ik dat ook graag.

Bedankt voor jullie hulp!
 



Overzicht Reageren

 
 

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.