Waar let je op bij een login systeem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Soccertime website

soccertime website

08/01/2016 23:27:18
Quote Anchor link
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


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
 
PHP hulp

PHP hulp

26/12/2024 22:09:55
 
- Ariën  -
Beheerder

- Ariën -

08/01/2016 23:31:31
Quote Anchor link
Aldoende leert men. Je kan als je wat dingen hebt toegepast en uitgetest gerust hier vragen of je het goed hebt gedaan.
 
Obelix Idefix

Obelix Idefix

09/01/2016 11:38:16
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'}
            }

        ?>

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
 
Soccertime website

soccertime website

09/01/2016 11:46:01
Quote Anchor link
dat van lijn 21 komt omdat er nog regels html staan
en inmiddels werkt het login script naar behoren
 
Obelix Idefix

Obelix Idefix

09/01/2016 13:56:54
Quote Anchor link
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


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?
 
Thomas van den Heuvel

Thomas van den Heuvel

09/01/2016 14:28:43
Quote Anchor link
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
 
Obelix Idefix

Obelix Idefix

09/01/2016 15:03:02
Quote Anchor link
@Thomas: wat ga je dan escapen? Het door bezoeker ingevoerde ww of het gehaste ww?
En mijn overige opmerkingen ?
Gewijzigd op 09/01/2016 15:03:29 door Obelix Idefix
 
Thomas van den Heuvel

Thomas van den Heuvel

09/01/2016 15:50:08
Quote Anchor link
@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.

Welke overige opmerkingen bedoel je precies?
 
Obelix Idefix

Obelix Idefix

09/01/2016 16:02:03
Quote Anchor link
Aanmaken variabelen, gebruik *, exit na header.

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

09/01/2016 23:32:37
Quote Anchor link
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.
 
Soccertime website

soccertime website

11/02/2016 17:14:59
Quote Anchor link
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
 
- Ariën  -
Beheerder

- Ariën -

11/02/2016 17:17:51
Quote Anchor link
Na een correcte inlogpoging kan je een sessie plaatsen, en daarop controleer je in je admin.php
 
Soccertime website

soccertime website

11/02/2016 17:31:44
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'}
            }

        ?>


zou ik het dan zo moeten doen
 
- Ariën  -
Beheerder

- Ariën -

11/02/2016 17:54:26
Quote Anchor link
Je maakt alleen de sessie nog niet aan.
 
Soccertime website

soccertime website

11/02/2016 18:14:35
Quote Anchor link
het is waarschijnlijk een domme vraag maar waar zou ik dat moeten doen (welke regel)
 
- SanThe -

- SanThe -

11/02/2016 18:16:21
Quote Anchor link
Tussen regel 14 en 15.
 
Soccertime website

soccertime website

11/02/2016 18:27:24
Quote Anchor link
dit klinkt waarschijnlijk nog dommer maar hoe moet ik de sessie plaatsen ik gebruik session_start maar dat werkt niet
 
- Ariën  -
Beheerder

- Ariën -

11/02/2016 18:40:35
Quote Anchor link
lees deze tutorial eens door:
http://www.phptuts.nl/view/39/10/
 
Soccertime website

soccertime website

11/02/2016 18:53:48
Quote Anchor link
dit is nu de login.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>


en dit is mijn admin.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 // We werken ook hier met sessies
session_start();

// Controleren of de bezoeker ingelogd is
if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == false)
{

    header('Location: login.php');
    exit();
}

echo 'u bent sucsesvol ingelogd';
?>

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
 
- Ariën  -
Beheerder

- Ariën -

11/02/2016 19:11:59
Quote Anchor link
Op het moment dat je inloggegevens correct zijn, dan maak je een sessie aan. Dat doe je nu nog nergens.
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.
 

Pagina: « vorige 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.