Waar let je op bij een login systeem
ik ben nu bezig met een loginscript voor de admin en zou graag willen weten waar je rekening mee moet houden bij een loginscript het is maar voor 2 tot 5 admins aangezien het mijn eerste loginscript gaat worden weet ik niet echt waar ik mee moet beginnen
alvast bedankt, soccertime
- Gebruik bij voorkeur SSL als men inlogt. Vooral als je persoonlijke gegevens gaat verwerken
- Sla wachtwoorden encrypted op met password_hash en vergelijk ze met de invoer met password_verify. Een enkele keer encrypten van een wachtwoord is voldoende, doe niet niet voor de veiligheid vaker, want je 'hash' wordt daardoor wel zwakker.
- Ga brute-force tegen door een max. aantal inlogpogingen toe te staan per IP-adres per +/- 15 minuten.
- Vermeld nooit als iemand een foute inlogpoging doet wel ingevoerde gegeven fout is gegaan, maar uitsluitend dat "username en/of wachtwoord" is fout.
- Gebruik bij voorkeur de Secure-flag voor cookies.
- Bied als het kan een systeem aan dat de gebruiker inzicht heeft in de aangemaakte inlogesessies, zodat men alle elders aangemaakte inlogsessies van hemzelf kan wissen.
- Sla NOOIT wachtwoorden op in sessies of cookies, ook niet als ze geëncrypted zijn. Een wachtwoord heb je maar één maal nodig, en dat is de authenticatie bij het inloggen.
- Stuur bij een 'vergeten wachtwoord' nooit een nieuw wachtwoord per mail, maar stuur de gebruiker naar een nieuwe tijdelijke pagina toe waar men een nieuw wachtwoord kan bedenken.
Wat extraatjes:
- Bied een Social Sign-On aan. En koppel de ID van de gebruiker aan zijn nieuw aangemaakte registratie.
- Als je belangrijke gegevens gaat verwerken en veel met transacties doet, bied een Two-Factor login aan. Denk bijv. aan een SMS met een extra code die je stuurt. Of gebruik van Google Authenticator.
Gewijzigd op 08/01/2016 18:06:53 door - Ariën -
Payment Card Industry (PCI) Data Security Standard (DSS) voor creditcardbetalingen kent nog meer eisen: Om er een paar uit te vissen:
• een lock-out van minimaal 30 minuten na niet meer dan 6 mislukte inlogpogingen;
• verplicht opnieuw inloggen na 15 minuten inactiviteit in de sessie;
• wachtwoorden moeten minimaal om de 90 dagen worden gewijzigd;
• een nieuw wachtwoord mag niet gelijk zijn aan de 4 laatst gebruikte wachtwoorden.
De standaard • een lock-out van minimaal 30 minuten na niet meer dan 6 mislukte inlogpogingen;
• verplicht opnieuw inloggen na 15 minuten inactiviteit in de sessie;
• wachtwoorden moeten minimaal om de 90 dagen worden gewijzigd;
• een nieuw wachtwoord mag niet gelijk zijn aan de 4 laatst gebruikte wachtwoorden.
jan test - [email protected]
(hier mag dus niemand zomaar inkunnen komen het is alleen voor mij en de andere beheerders)zijn er dan regels voor werken met persoonlijke gegevens
---------------
had niet gezien dat je had geschreven over persoonlijke gegevens en ssl, ik weet eigenlijk niet echt wat ssl inhoudt kan ik hier wat meer info over krijgen
Gewijzigd op 08/01/2016 18:25:08 door soccertime website
https://nl.wikipedia.org/wiki/SSL, eerste link.
SSL is tegenwoordig zo uitgroeiend, dat je er niet omheen kan. Zelfs hier op PHPhulp hebben we er nieuwartikelen aan gewijd, waaronder de gratis LetsEncrypt mogelijkheid.
SSL is tegenwoordig zo uitgroeiend, dat je er niet omheen kan. Zelfs hier op PHPhulp hebben we er nieuwartikelen aan gewijd, waaronder de gratis LetsEncrypt mogelijkheid.
Gewijzigd op 08/01/2016 18:34:58 door - Ariën -
<html>
<head>
<title>loginscript</title>
</head>
<body>
<form action="" method="post">
Naam: <br/> <input type="name" name="name" value=""/><br/>
Wachtwoord: <br/> <input type="password" name="pass" value=""/><br />
<input type="submit" value="inloggen" name="login">
</form>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0)
header('location:admin.php');
}
else{
echo('uw naam en/of wachtwoord kloppen niet');
}
?>
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0)
header('location:admin.php');
}
else{
echo('uw naam en/of wachtwoord kloppen niet');
}
?>
</body>
</html>
nu heb ik alleen 2 problemen
-als ik een verkeerde combinatie van naam en wachtwoord invoer krijg ik niet mijn echo 'uw naam en wachtwoord kloppen niet' maar refresht de pagina
-google chrome slaat de goede combinatie en als je op de index.php pagina komt staat er meteen de goede combinatie en hoef je alleen nog maar op inloggen te klikken hoe kan ik dit weghalen bij google chrome
Je mist een statement bij je if vanaf lijn 9. Nu heb je één if-statement die van lijn 3 t/m 14 duurt.
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
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0){
header('location:admin.php');
}
}
else{
echo('uw naam en/of wachtwoord kloppen niet');
}
?>
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0){
header('location:admin.php');
}
}
else{
echo('uw naam en/of wachtwoord kloppen niet');
}
?>
Ik zou ook eens foutafhandeling gebruiken op je query's.
https://github.com/panique/php-login-minimal
Heeft mij wel geholpen om het goed te begrijpen in ieder geval. Een werkend en veilig login script.
dit is het script nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0){
header('location:admin.php');}
else{echo'uw naam en/of gebruikersnaam kloppen niet'}
}
?>
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0){
header('location:admin.php');}
else{echo'uw naam en/of gebruikersnaam kloppen niet'}
}
?>
laat maar zie dat ik een ";" ben vergeten achter de echo het script werkt nu zoals het hoort te werken nu wil ik 1 stap verder en dat is dat je niet meer dan 5keer mag proberen in 15 minuten
Gewijzigd op 08/01/2016 20:20:38 door soccertime website
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0){
header('location:admin.php');
} else {
echo 'uw naam en/of gebruikersnaam kloppen niet';
}
}
?>
$con= mysqli_connect('127.0.0.1','root','','tdb');
if(isset($_POST['login'])){
$name= mysqli_real_escape_string($con,$_POST['name']);
$password= mysqli_real_escape_string($con,$_POST['pass']);
$select_user="SELECT * FROM user WHERE naam ='$name' AND wachtwoord ='$password' ";
$run_user= mysqli_query($con, $select_user);
$check_user= mysqli_num_rows($run_user);
if($check_user>0){
header('location:admin.php');
} else {
echo 'uw naam en/of gebruikersnaam kloppen niet';
}
}
?>
Benut gewoon de TAB-toets waarvoor hij bedoeld is. ;-)
Verder zou ik eerst maar even zorgen voor goede foutafhandeling en encryptie van je wachtwoord, voordat je extra dingen gaat toevoegen.
Gewijzigd op 08/01/2016 20:23:53 door - Ariën -
en hoe bedoel je dat ik de tab toets niet (goed) gebruik, naar mijn idee is dit een overzichtelijk stukje php (maar ik kan er ook 100% naast zitten)
En dat moet je voorkomen. In een stukje code zoals dit is een fout zo gevonden, maar wat als je straks 5 in elkaar genestte if-else structuren hebt in een codebase van 400 regels?
En waar loop je bij stap 2 dan precies op vast?
Gewijzigd op 08/01/2016 21:08:46 door - Ariën -
$sql = "INSERT INTO leden
VALUES ('',
'".mysql_real_escape_string($_POST['gebruikersnaam'])."',
'".mysql_real_escape_string($_POST['wachtwoord'])."'
)
";
deze URL:
Quote:
Is dit duidelijk? Bekijk dan zeker even de voorbeeldjes dan kan je zien hoe dit in de praktijk werkt.
Het is dus geen tutorial voor een inlogsysteem, maar een tutorial over het invoegen van foutafhandeling elke soort query.
Gewijzigd op 08/01/2016 21:16:35 door - Ariën -
oké dit maakt het al duidelijker, bedankt voor al deze info
Let er wel op dat deze tutorials van MySQL vanuit gaat. Dit moet je wel even herschrijven naar MySQli!
ja dat had ik al in de gaten
@soccertime: als je hier al zoveel moeite mee lijkt te hebben heb je wellicht wat meer oefening nodig voordat je je gaat bezig houden met zaken omtrent beveiliging
Leg eens uit, met encryptie genereer je toch een hash?