Adminpagina beveiligen met sessies
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)
1
2
3
4
5
6
7
8
9
10
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
}
?>
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)
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
Als je kijkt naar de eerste regel:
Je hoort ten eerste te kijken of er überhaupt wat is ingevuld, dit check je niet. Voorbeeld:
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)
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)
1
2
3
4
5
2
3
4
5
<?php
$blowfish = 'aS3hpmc'; // willekeurig iets
$_SESSION['admin_iets'] = sha1($_SERVER['REMOTE_ADDR'] . $blowfish);
?>
$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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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>';
}
?>
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>';
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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');
}
?>
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
?>
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.
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.
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!