hoi,
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
@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
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
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:
<?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'}
}
?>
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.
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.
@Obelix: wat uiteindelijk de query ingaat dient ge-escaped te worden. Als dit een een hash is dan bevat deze mogelijk geen karakters die een speciale betekenis hebben binnen SQL, maar waarom zou je ruimte voor interpretatie open laten?
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.
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.
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.
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.