Ik werk aan een zeer simpel login script zonder database of whatever.
Mijn vraag is dan ook wat kan ik verbeteren aan dit simpel script.

In het dashboard staat geen gevoelige informatie en je kan echter alleen dingen lezen en niks aanpassen.

Login.php

<?php
$error = '';
if(isset($_POST['username'], $_POST['password'])){
	$username = $_POST['username'];
	$password = hash('sha512', $_POST['password']);
	if($username !== 'admin' ){
		$error = 0;
	}
	
	if($password !== 'C7AD44CBAD762A5DA0A452F9E854FDC1E0E7A52A38015F23F3EAB1D80B931DD472634DFAC71CD34EBC35D16AB7FB8A90C81F975113D6C7538DC69DD8DE9077EC' ){
		$error = 0;
	}
	
	if($error !== 0)
		session_start();
		$_SESSION['valid'] = true;
		$_SESSION['username'] = 'Administrator';
			header('Refresh: 0; URL = dashboard.php');
		}
	}
?>


dashboard.php

<?php
session_start();
if (isset($_SESSION['valid']) && $_SESSION['valid'] == true) {

}else{
	header('Refresh: 0; URL = login.php');
}
?>
Breid het script verder uit ;-) en bouw met deze info de beveiligde pagina


<?php
//zoiets ongeveer ;-), code nog niet getest

//start de sessie
session_start();

//maak een array accounts met gebruikersnaam en wachtwoord
//Zorg dat je wachtwoorden een hash hebben en niet open bloot te lezen zijn.
$accounts = array(
	'admin' => 'C7AD44CBAD762A5DA0A452F9E854FDC1E0E7A52A38015F23F3EAB1D80B931DD472634DFAC71CD34EBC35D16AB7FB8A90C81F975113D6C7538DC69DD8DE845TR',
	'stefan' => 'C7AD44CBAD762A5DA0A452F9E854FDC1E0E7A52A38015F23F3EAB1D80B931DD472634DFAC71CD34EBC35D16AB7FB8A90C81F975113D6C7538DC69DD8DE9077EC',
);

//loop door de accounts van de array
foreach($accounts as $user => $password) {
	//controleer op bestaan gebruikersnaam
	if($name == $_POST["username"]{
	
		//controleer het wachtwoord
		if(password_verify($_POST['password'], $password)){
			//sla gebruikersnaam op welke je kan gebruiken in het beveiligde gedeelte 
			$_SESSION['name'] = $_POST["username"];
			session_regenerate_id();
			
			//onderstaande kun je enkele checks uitvoeren, zoals het id controleren en IP adres controleren
			$_SESSION['loggedin'] = TRUE;
			$_SESSION['id'] = $id;
			
			//sla het IP adres van de gebruiker op in een sessie variabel
			$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
			
			//doe hier wat je wilt als iemand is ingelogd.

  		}else{
  			echo 'wachtwoord onjuist';
  		}
	}else{
		echo 'Gebruikersnaam onbekend';
	}	
  
}
?>
Een foreach? Wut? Wat dacht je van if (isset($_POST['username']) && array_key_exists($_POST['username'], $accounts) ... etc ...)? En die controle voer je enkel uit als er iets gePOST is.

Daarbij zou je ook geen enkele informatie moeten verschaffen over wat er fout is, anders kan een aanvaller gericht gaan vissen totdat 'ie een username heeft en vervolgens kan 'ie met je wachtwoord aan de slag...

$_SESSION['loggedin'] dient geen enkel doel.
$_SESSION['id'] bestaat niet.
Dank voor de reacties, ik ga hier eens mee aan de slag:)

Nog een dingetje wat betreft een IP check:

Stel dat iemand op zn telefoon doet inloggen en die telefoon is verbonden met de wifi dan word dat IP adres geregistreerd.
Maar als je dan buiten het wifi gebied raakt en over gaat op 4G dan veranderd het IPadres en zal je dus opnieuw moeten inloggen.
Dan is een IP check natuurlijk niet handig maar vervelend toch?
Ja, dat is dan wel een nadeel.
Ik heb ooit in het verleden een inlogsysteem gemaakt welke de inlogsessies opsloeg in de database, en aan de hand van een cookie jou identificeerde. Een voordeel daarvan was dat je zelf controle hebt over je inlogsessie. Zo kan je thuis bijvoorbeeld de inlogsessie die je op school gemaakt hebt weer uitloggen. Of gewoon op alle plekken waar je ingelogd bent.

Een van die functies was een IP-lock waarbij een sessie in de database alleen gekoppeld kon worden als het IP-adres klopt. Dit was bij het inloggen wel een keuze.

Ik denk dat het wel handig is om alle inlogacties en utigevoerde acties in je beveiligide omgeving gelogd worden. Zo kan je altijd zien wie met welk IP-adres bijvoorbeeld een nieuwsbericht heeft gewijzigd, en welke dat is. En eventueel zelfs wát er gewijzigd is. ('diff' in Linux).
Ik denk dat ik het zo ga doen

<?php
session_start();

if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $account = array (
        'stefan' => '$2y$10$96Yi1ezzoS6xZYjPhbvYTeCha.YypKF.7MSYwfruXtKaFyeGRLeMK',
        'bert' => '$3g$10$96Yi1ezzoS6xZYjPhbvYTeCha.YypKF.7MSYwfruXtKaFyeGRLeMK',
    );

    if(array_key_exists($_POST['user'], $account)){
        if(password_verify($_POST['password'], $account[$_POST['user']])){
                session_regenerate_id();
                $_SESSION['username'] = $_POST["user"];
                $_SESSION["loggedin"]) = true;
                header("location: protected_page.php");
        }else{
            echo 'Something wrong';
        }
    }else{
        echo 'Something wrong';
    }
}
?>



<?php
session_start();
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {
    echo 'welcome';
}else{
    header("location: login.php");
    exit;
}
?>


Of zijn er nog dingen waar ik rekening mee moet houden?
Toch ben ik benieuwd naar je redenen waarom je de inloggegevens nou hardcoded in een array hebt staan?
Wat als een niet-technicus deze met spoed moet wijzigen omdat het password op straat ligt, en de IT'er op Ibiza ligt te zonnen?
Bedoel je waarom ik ze niet in een database zet?
Als het een aantal personen waren geweest had ik dit zeker gedaan maar voor 2 á 3 personen vind ik dit onzin om te doen.
Als je mijn bericht hierboven nog eens leest? Vind je het dan nog steeds onzin?
Tot nu toe heb ik nog geen sterk argument gezien en lijkt het alsof je mijn bericht maar half gelezen hebt.
Als je nu eens
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {

verandert in
if (false === empty($_SESSION['username']))

(of iets equivalents)
en $_SESSION['loggedin'] gewoont schrapt?
Misschien kun je ook eens nadenken om je gebruikers en wachtwoorden niet in dezelfde file te zetten maar deze buiten de root te zetten als extra veiligheid.
Stel dat om een of andere reden de configuratie van de server zou veranderen en je php files niet als php geshowd worden maar als platte text dan zijn je gebruikers en je gehashte wachtwoorden in te zien omdat deze in de public map staan.

Als je je gebruikers en wachtwoorden hierbuiten neerzet dan is het weer een stukje veiliger.

Reageren