Waar let je op bij een login systeem
Pagina: « vorige 1 2 3 volgende »
Thomas van den Heuvel op 08/01/2016 23:03:09:
@Ariën: encryptie is niet hetzelfde als hashing
@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
@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
Ik heb inderdaad best veel moeite gedaan om een login formulier te maken aangezien ik nog niet heel veel kennis heb qua php, maar ik doe het met een gedachte van nu ik het gedaan en nu weet ik hoe het moet
Aldoende leert men. Je kan als je wat dingen hebt toegepast en uitgetest gerust hier vragen of je het goed hebt gedaan.
Soccertime website op 08/01/2016 20:17:53:
als ik dit doe krijg ik een foutmelding na het klikken op login: Parse error: syntax error, unexpected '}', expecting ',' or ';' in C:\xampp\htdocs\index.php on line 21
dit is het script nu:
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'}
}
?>
Bijzonder dat de melding gaat over regel 21, terwijl je script maar 13 regels heeft ;-)
Waarom maak je $name en $password aan als variabelen? Je kunt een $_POST waarde prima direct in een query gebruiken.
Verder hoef je bij een wachtwoord geen mysqli_real_escape_string toe te passen; door de encrypte/hashen zal het wachtwoord al 'onschadelijk' gemaakt zijn.
Waarom gebruik je * in je query en benoem je niet het veld/de velden die je wilt ophalen?
Na een header is het gebruikelijk om exit() te plaatsen; script hoeft immers niet verder te gaan.
Gewijzigd op 09/01/2016 11:39:23 door Obelix Idefix
en inmiddels werkt het login script naar behoren
Soccertime website op 09/01/2016 11:46:01:
dat van lijn 21 komt omdat er nog regels html staan
en inmiddels werkt het login script naar behoren
en inmiddels werkt het login script naar behoren
Geen idee welke html, maar doorgaans is het handiger / logischer om met php te beginnen.
Dat iets werkt wil niet zeggen dat het goed is / niet voor verbetering vatbaar is.
Hoe controleer je op admin.php of iemand is ingelogd?
Obelix en Idefix op 09/01/2016 11:38:16:
Verder hoef je bij een wachtwoord geen mysqli_real_escape_string toe te passen; door de encrypte/hashen zal het wachtwoord al 'onschadelijk' gemaakt zijn.
Desalniettemin kan het toch handig/verstandig zijn om dit toch te doen:
- allereerst, als ik zo naar de code kijk, opent dat de deur voor SQL injectie waarbij iemand niet eens meer hoeft te weten wat het wachtwoord is?
- je hoeft niet meer na te denken of escaping wel/niet nodig is, met mogelijk catastrofale gevolgen als je hierbij een keer een inschattingsfout maakt (zie puntje hierboven)
- de gehashte variant kan nog steeds tekens hebben die in de SQL-context betekenis hebben, en om die reden is het nog steeds verstandig om escaping toe te passen
- het is tevens een manier om de variabele delen in een query te markeren, die meestal van gebruikers afkomstig zijn, dit alleen al maakt het tot een nuttig gebruik: het plaatst uitroeptekens bij bepaalde delen in je code dat deze met zorg behandeld moeten worden, het is een constante reminder dat je voorzichtig en zorgvuldig met die onderdelen te werk moet gaan
Ik zou je dus ten zeerste het advies van Obelix en Idefix afraden. Escape altijd, ook al lijkt dit in eerste geval geen direct nut te hebben, tenzij je een zéér speciale (en gedocumenteerde) reden hebt om dit niet te doen.
Zoals ik het zie kan het escapen alleen achterwege worden gelaten als je de invoer filtert, met andere woorden, onderwerpt aan een test dat de invoer voldoet aan een zeker patroon (EDIT: die tevens veilig is voor direct gebruik in een query zonder dat er escaping nodig is). Je zou dus bijvoorbeeld eerst een match met een reguliere expressie kunnen doen, en op grond daarvan besluiten of je vervolgens de query uitvoert of niet.
Gewijzigd op 09/01/2016 14:30:22 door Thomas van den Heuvel
En mijn overige opmerkingen ?
Gewijzigd op 09/01/2016 15:03:29 door Obelix Idefix
Daarbij, als iemand later code van die query bekijkt zou deze zich mogelijk kunnen afvragen of de escaping expres achterwege is gelaten of per ongeluk vergeten is. Deze spendeert dan mogelijk tijd om uit te zoeken wat het geval is (als dit niet gedocumenteerd is).
Hoe dan ook, het zorgt voor verwarring. Deze verwarring is er niet als er geen enkele ruimte is voor interpretatie door de gebruikmaking van escaping op *alle* DATA-delen in een query.
Dit is tevens een permanente "bewustwordingsoefening" van het credo "Never Trust User Input".
En het is precies dit waar je hier (user login) en op andere plaatsen op moet letten bij het schrijven van (security gerelateerde) code: het nemen van "shortcuts" die mogelijk resulteren in minder code, maar zorgen voor meer verwarring / minder overzicht precies waar het juist heel belangrijk is dat deze ondubbelzinnig en helder is.
Welke overige opmerkingen bedoel je precies?
Mijn vraag aan TS hoe hij controleert op admin.php of er is ingelogd: heb jij enig idee? Naar mijn idee kan ik nu zo naar admin.php surfen zonder in te loggen.
Quote:
Aanmaken variabelen, gebruik *, exit na header.
Aanmaken variabelen is inderdaad niet nodig, en als je dat dan toch doet, gebruik dan zinnige namen. $select_user, $run_user en $check_user zijn nou niet bepaald sterk.
Gebruik * is ook niet echt nodig als je enkel een user id en een password nodig hebt ofzo.
exit() na een header('Location: ...'); is bijna altijd een goede gewoonte.
Quote:
Mijn vraag aan TS hoe hij controleert op admin.php of er is ingelogd: heb jij enig idee? Naar mijn idee kan ik nu zo naar admin.php surfen zonder in te loggen.
Geen idee, dat kan ik ook op geen enkele manier afleiden uit de geplaatste code. Er zal in ieder geval ergens informatie onthouden moeten worden, bijvoorbeeld via een sessie want HTTP zelf is stateless (onthoudt niks).
Ik zie ook nergens enige vorm van sessiemanagement of wat dan ook dus ben zeer benieuwd hoe dit uberhaupt kan werken.
het is alweer een maand geleden maar wat zou ik dan in het script moeten zetten dat je niet zomaar naar admin.php kunt gaan d.m.v het intypen in de browserbalk
Na een correcte inlogpoging kan je een sessie plaatsen, en daarop controleer je in je admin.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if(isset($_SESSION['login'])){
echo 'Welkom';
}else{
header(location:login.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'}
}
?>
if(isset($_SESSION['login'])){
echo 'Welkom';
}else{
header(location:login.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'}
}
?>
zou ik het dan zo moeten doen
Je maakt alleen de sessie nog niet aan.
het is waarschijnlijk een domme vraag maar waar zou ik dat moeten doen (welke regel)
Tussen regel 14 en 15.
dit klinkt waarschijnlijk nog dommer maar hoe moet ik de sessie plaatsen ik gebruik session_start maar dat werkt niet
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
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
<?php
session_start();
// Controle of het formulier verzonden is
if($_SERVER['REQUEST_METHOD'] == 'POST')
// Controle of benodigde velden wel ingevuld zijn
if(isset($_POST['name'], $_POST['pass']))
$con= mysqli_connect('127.0.0.1','root','','lgt');
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';
}
}
?>
<!doctype html>
<html>
<head>
<title>loginscript test</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>
</body>
</html>
session_start();
// Controle of het formulier verzonden is
if($_SERVER['REQUEST_METHOD'] == 'POST')
// Controle of benodigde velden wel ingevuld zijn
if(isset($_POST['name'], $_POST['pass']))
$con= mysqli_connect('127.0.0.1','root','','lgt');
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';
}
}
?>
<!doctype html>
<html>
<head>
<title>loginscript test</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>
</body>
</html>
en dit is mijn admin.php
Code (php)
nu kan ik inderdaad niet meer via mijn browserbalk naar admin.php maar als ik nu mijn inloggegevens invoer kan ik er ook niet naartoe
Gewijzigd op 11/02/2016 20:23:05 door soccertime website
tevens moet je op admin.php niet alleen kijken naar een bestaande sessie, maar ook het recht om de admin te mogen bekijken.
Dat kan je simpel doen met een speciaal 'is_admin' veld in je database.