Veilige simpele login
Graag had ik wat advies om een dashboard login veilig te maken.
Het graat hierom een dashboard waarvoor je je niet kunt registreren, dus voor vaste mensen.
index:
Code (php)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<html>
<head>
<title>Dashboard</title>
<link rel="stylesheet" href="css/style.css"></link>
</head>
<body>
<form action="" method="POST">
<input type="text" class="logscreen_fields" name="user" id="user" placeholder="Gebruikersnaam"></input>
<input type="password" class="logscreen_fields" name="password" id="password" placeholder="Wachtwoord"></input>
</form>
</body>
</html>
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$user = $_POST['user'];
$password = $_POST['password'];
$users = array(
'Gebruikera' => 'wachtwoorda',
'Gebruikerb' => 'wachtwoordb',
'Gebruikerc' => 'wachtwoordc'
//enz.
);
if(isset($users[$user])){
if($password == $users[$user]){
$_SESSION['login-naam'] = $user;
$_SESSION['login'] = "success";
//en word doorgestuurd naar beveiligd epagina
}else{
echo 'Wachtwoord is onjuist bij deze gebruikersnaam';
}
}else{
echo 'deze gebruiker is niet bij ons bekend.';
}
}
?>
<head>
<title>Dashboard</title>
<link rel="stylesheet" href="css/style.css"></link>
</head>
<body>
<form action="" method="POST">
<input type="text" class="logscreen_fields" name="user" id="user" placeholder="Gebruikersnaam"></input>
<input type="password" class="logscreen_fields" name="password" id="password" placeholder="Wachtwoord"></input>
</form>
</body>
</html>
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$user = $_POST['user'];
$password = $_POST['password'];
$users = array(
'Gebruikera' => 'wachtwoorda',
'Gebruikerb' => 'wachtwoordb',
'Gebruikerc' => 'wachtwoordc'
//enz.
);
if(isset($users[$user])){
if($password == $users[$user]){
$_SESSION['login-naam'] = $user;
$_SESSION['login'] = "success";
//en word doorgestuurd naar beveiligd epagina
}else{
echo 'Wachtwoord is onjuist bij deze gebruikersnaam';
}
}else{
echo 'deze gebruiker is niet bij ons bekend.';
}
}
?>
securepage:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
session_start();
if ($_SESSION['login'] != "success")
{
header('Location: index.php');
exit();
}
?>
session_start();
if ($_SESSION['login'] != "success")
{
header('Location: index.php');
exit();
}
?>
Gr. Yoeri
Gewijzigd op 21/03/2016 15:49:57 door Yoeri Achterbergen
Want wat als iemand nou zijn wachtwoord laat slingeren, er achterkomt, en zijn wachtwoord niet zelf kan wijzigen? Moet hij dat hopeloos toezien dat iemand met kwaadwillige bedoelingen zonder zelf gerechtigd te zijn bedrijfinformatie kan inzien, wijzigen of verwijderen?
Hopelijk heb je wat aan mijn advies, mochten er verder nog vragen zijn hoor ik het natuurlijk graag.
Als ik een admin account aanmaak, hoe kan ik dan het beste regelen dat dan de functie tevoorschijn komt om gebruiker te wijzigen / verwijderen of aan te maken?
Of maak je een hele andere omgeving hiervoor?
password_hash. Het allersimpelst is een veld in de database die "is_admin" heet. Hierop controleer je dan of iemand admin is. Zo ja, dan geef je diegene extra rechten.
Als je meerdere rechten wilt hebben, voor diverse acties, dan loont het om eens te kijken naar een RBAC-rechtensysteem.
Ik zou als eerste de accounts in de database opslaan, waarbij je het wachtwoord gehashed opslaat met Als je meerdere rechten wilt hebben, voor diverse acties, dan loont het om eens te kijken naar een RBAC-rechtensysteem.
Gewijzigd op 21/03/2016 19:54:27 door - Ariën -
Ik mis filtering van de input... htmlspecialchars, trim etc...
L deB op 21/03/2016 19:59:36:
Ik mis filtering van de input... htmlspecialchars, trim etc...
Wat is het nut daarvan wanneer je alleen leest uit de database ?
Aangezien we geen verdere info hebben zou er, bij wijzigingen in de database, ook heel goed gebruik gemaakt kunnen worden van prepared statements.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<form action="" method="POST">
<input name="passwod">
<button type="submit">
send
</button>
</form>
</html>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$password = $_POST['password'];
}
$passwordhash = password_hash('$password', PASSWORD_DEFAULT)."\n";
$doc = new_xmldoc('1.0');
$root = $doc->add_root('data');
$data->new_child('user','Gebruikera');
$data->new_child('password','$password');
fclose($fp);
?>
<form action="" method="POST">
<input name="passwod">
<button type="submit">
send
</button>
</form>
</html>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$password = $_POST['password'];
}
$passwordhash = password_hash('$password', PASSWORD_DEFAULT)."\n";
$doc = new_xmldoc('1.0');
$root = $doc->add_root('data');
$data->new_child('user','Gebruikera');
$data->new_child('password','$password');
fclose($fp);
?>
Niet om een ledenbeheersysteem.
Niet om een rechten managementsysteem.
Er is een verschil tussen wat gevraagd wordt en wat de beantwoorders als ideale oplossing zien/aanleveren.
Ik zie zo gauw weinig mis met de oorspronkelijke oplossing, behalve misschien:
- de onversleutelde wachtwoorden, maar als je er over nadenkt, maakt het eigenlijk niet zoveel uit of deze versleuteld zijn of niet indien je de code in kan zien, er is dan mogelijk een andere zwakste schakel
- het controleren op het bestaan van een variabele, pas altijd eerst isset() toe voordat je de waarde van een variabele (die mogelijk helemaal niet bestaat) vergelijkt met iets anders
- het starten van sessies, het versturen van headers; dit dient te gebeuren voor verzending van enige output; wat ik op zijn minst zou doen is deze code opdelen in afzonderlijke "acties"
En later kun je bovengenoemde beheersystemen nog altijd toevoegen indien nodig. Wat als TS simpelweg een mockup wil? Tenzij je dit soort functionaliteit op de plank hebt liggen ga je deze systemen toch niet op voorhand schrijven?
In plaats van meteen weg te lopen met "dan moet je dit of dat doen" loont het misschien eerst de moeite om te vragen waar TS naartoe wil, nog voordat je zelf een kant op begint te rennen...
Thomas van den Heuvel op 22/03/2016 13:58:31:
@Ariën etc., @Yoeri vraagt om een simpele loginfunctionaliteit.
Niet om een ledenbeheersysteem.
Niet om een rechten managementsysteem.
Niet om een ledenbeheersysteem.
Niet om een rechten managementsysteem.
je leest hier blijkbaar overheen:
Yoeri Achterbergen op 21/03/2016 19:48:45:
Als ik een admin account aanmaak, hoe kan ik dan het beste regelen dat dan de functie tevoorschijn komt om gebruiker te wijzigen / verwijderen of aan te maken?
Of maak je een hele andere omgeving hiervoor?
Of maak je een hele andere omgeving hiervoor?
Dan is een beheerpaneel in ieder geval een must, want je wilt zulke rechten niet direct via de database invoeren. Verder heb ik gezegd dat een RBAC-systeem altijd een optie is als je meerdere rechten wilt aanmaken.
- Ariën - op 22/03/2016 14:01:25:
je leest hier blijkbaar overheen:
Yoeri Achterbergen op 21/03/2016 19:48:45:
Als ik een admin account aanmaak, hoe kan ik dan het beste regelen dat dan de functie tevoorschijn komt om gebruiker te wijzigen / verwijderen of aan te maken?
Of maak je een hele andere omgeving hiervoor?
Of maak je een hele andere omgeving hiervoor?
Het is onduidelijk of dat een reactie is op jullie voorstellen, of dat dat echt de oorspronkelijke bedoeling van TS was. Deze reactie kwam ook pas na jullie opmerkingen. Deze vraag is dus mogelijk gestuurd/een gevolg van de "gekozen" oplossing. Dat lijkt mij de verkeerde volgorde.
EDIT: in de oorspronkelijke opzet was namelijk helemaal geen sprake van accounts aanmaken, dit was een statische lijst gebruikers (waarbij geen onderscheid werd gemaakt tussen de verschillende gebruikers (of beheerders))!
@Yoeri: wat probeer je uiteindelijk te bereiken?
Gewijzigd op 22/03/2016 14:24:52 door Thomas van den Heuvel
Aangezien er maar een beheerder is (ik zelf) dacht ik het zonder admin functies te doen, maar Ariën heeft mij wel iets van gedachte veranderd.
Natuurlijk moet het een simpele login blijven maar een admin account waarmee je snel en simpel gebruikers kunt wijzigen en/of aanmaken is natuurlijk wel handig mocht ik dit in de toekomst willen uitbreiden. Ik ben vandaag beetje bezig geweest en ben nu een xml file het genereren waar alle users instaan inclusief een password hash.
Ik kan de xml file dan met php herschrijven en als er ingelogd word php laten nakijken of de gegevens kloppen.
Gewijzigd op 22/03/2016 19:04:22 door - Ariën -
Wat zijn precies de verschillen tussen xml en MySQL?
MySQL maakt gebruik van tabellen en xml van elementen, komt dat niet ongeveer op het zelfde neer?
Zeker een aanrader voor een inlogsysteem!
Met xml kun je toch ook met elkaar koppelen en zo verbanden met elkaar leggen?
Pipo Clown op 21/03/2016 21:47:26:
Wat is het nut daarvan wanneer je alleen leest uit de database ?
Aangezien we geen verdere info hebben zou er, bij wijzigingen in de database, ook heel goed gebruik gemaakt kunnen worden van prepared statements.
L deB op 21/03/2016 19:59:36:
Ik mis filtering van de input... htmlspecialchars, trim etc...
Wat is het nut daarvan wanneer je alleen leest uit de database ?
Aangezien we geen verdere info hebben zou er, bij wijzigingen in de database, ook heel goed gebruik gemaakt kunnen worden van prepared statements.
Voor zover ik weet leest hij niet uit een database en zijn er wel meer mogelijkheden om een website te gebruiken in plaats van slechts sql injectie. Lijkt me bij een inlogsysteem dat je altijd input wil filteren, of je het nou haalt uit een bestand of de database. Maar goed als ik er helemaal naast zit en het geen nut heeft hoor ik het graag, serieus, dit is gewoon wat ik tot nu toe meen ervan begrepen te hebben.
Heeft iemand hier ervaring mee?
Jop B op 22/03/2016 22:38:57:
Ik kwam op internet ook NoSQL databases tegen alleen is er weinig te vinden over het opzetten hiervan.
Heeft iemand hier ervaring mee?
Heeft iemand hier ervaring mee?
Waarom zou je juist nou weer zo'n 1 uit 100 alternatief willen gebruiken?