Een vraag over inloggen.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Jasper Schellekens

Jasper Schellekens

20/02/2018 11:44:05
Quote Anchor link
Goeiedag iedereen,

Ik ben de ontwerper van een online game die gebruikt maakt van sqlite.
Nu ben ik gestart met PHP om een UCP te maken.
Dit gaat tot nu toe goed en dus heb ik een simpel login formuliertje gemaakt.
In het script worden na het inloggen de goede data getoond.
Het probleem is eigenlijk dat als je weer naar de home pagina gaat waar ook de staat worden laten gezien, dat er niks word laat gezien. En ik denk dat dit komt omdat het script niet weet waar het de data vandaan moet halen.
Nu vraag ik me af, kan ik niet de gebruikersnaam in een soort tijdelijke array opslaan en vandaar ophalen?(zo werkt dat in de code waar ik de game mee ontwerp ook.) En als dit mogelijk is? Hoe doe ik dit dan?

Mocht het nodig zijn is hier de pagina login.php:

Quote:
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
38
<?php
                    error_reporting(E_ALL);
                     class MyDB extends SQLite3
                     {
                        function
__construct()
                        {

                           $this->open('LARPSERVER/scriptfiles/Data/database/testdatabase.db');
                        }
                     }

                     $db = new MyDB() or die ("Unable to open");
                    
                    
                     $sql = 'SELECT * FROM USERS WHERE MAIL="'.$_POST["MAIL"].'" AND PASSWORD="'.$_POST["PASSWORD"].'"';
                    
                     $stmt = $db->query($sql);
                     while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
                     {

                          $email_address = $row["MAIL"];  
                          $password = $row["PASSWORD"];
                          if($password==$_POST["PASSWORD"])
                          {

                            
                             echo "<h1>Logged In</h1>";
                             echo "ID = ". $row['ID'] . "<br>";
                             echo "NAME = ". $row['NAME'] . "<br>";
                             echo "USERNAME = ". $row['USERNAME'] . "<br>";
                             echo "MAIL = ". $row['MAIL'] . "<br>";  
                          }
                     }

                     while(!$row = $stmt->fetchArray(SQLITE3_ASSOC) )
                     {

                            header("Location: login_fail.html");
                            exit("Try again.");
                     }

                    
                     $db->close();
                    
                    ?>
Gewijzigd op 20/02/2018 11:51:11 door Jasper Schellekens
 
PHP hulp

PHP hulp

19/04/2024 01:13:44
 
Ward van der Put
Moderator

Ward van der Put

20/02/2018 13:46:09
Quote Anchor link
Jasper Schellekens op 20/02/2018 11:44:05:
Nu vraag ik me af, kan ik niet de gebruikersnaam in een soort tijdelijke array opslaan en vandaar ophalen?

Ja, PHP heeft daarvoor een interne array: $_SESSION voor sessies.
 
Jasper Schellekens

Jasper Schellekens

20/02/2018 18:32:37
Quote Anchor link
Ward van der Put op 20/02/2018 13:46:09:
Jasper Schellekens op 20/02/2018 11:44:05:
Nu vraag ik me af, kan ik niet de gebruikersnaam in een soort tijdelijke array opslaan en vandaar ophalen?

Ja, PHP heeft daarvoor een interne array: $_SESSION voor sessies.


Dankjewel, met de gegeven link is het gelukt. Nu vraag ik me af, hoe zou uitloggen dan werken?
Word er met session_destroy(); uitgelogd?
En hoe kan ik checken of iemand ingelogd is?
 
- Ariën  -
Beheerder

- Ariën -

20/02/2018 18:36:57
Quote Anchor link
Je kan kijken of er een bepaalde sessie bestaat met isset:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if(isset($_SESSION['LoggedIn'])) {
// ingelogd
} else {
// je bent niet ingelogd
}
?>


Als je alles wilt wissen, dan raad ik dit aan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// open de sessie-handler
session_start();

// leeg de SESSION-global
$_SESSION = array();

// Verwijder alle sessies.
session_destroy();
?>
 
Rob Doemaarwat

Rob Doemaarwat

20/02/2018 19:52:17
Quote Anchor link
Hm, lees deze link https://nl.wikipedia.org/wiki/SQL-injectie dan ook even, want met wachtwoord
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
" or "1"="1
kan nu iedereen inloggen ...
 
Thomas van den Heuvel

Thomas van den Heuvel

20/02/2018 19:52:51
Quote Anchor link
Aanvulling: ook doe je er verstandig aan om het sessie-cookie te verwijderen. En dit alles zou je in een routine moeten zetten, zodat je dit lijstje altijd in zijn geheel afwerkt, dus bijvoorbeeld zoiets als:
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
<?php
function session_stop() {
    // @see php.net/session_destroy
    // Empty $_SESSION.

    $_SESSION = array();

    // Do not close the session as this will make it readonly, preventing the physical file from being deleted.

    // Delete session cookie.

    if (ini_get('session.use_cookies')) {
        $params = session_get_cookie_params();
        setcookie(
            session_name(),
            '',
            time() - 42000,
            $params['path'],
            $params['domain'],
            $params['secure'],
            $params['httponly']
        );
    }


    // Destroy the session.
    session_destroy();
}
// function session_stop
?>
 
Jasper Schellekens

Jasper Schellekens

21/02/2018 12:13:59
Quote Anchor link
Bedankt voor jullie reacties, ik ben er zeer door gevorderd.

@Rob Doemaarwat
Ik ben bekend met SQL injectie en in de code waarmee ik de game ontwerp word dit voorkomen op de volgende manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
format(szQuery2, sizeof(szQuery2), "INSERT INTO `PINCODES` (`PlayerName`, `Pin1`) VALUES('%s', '%d')", DB_Escape(GetName(playerid)), DB_Escape(inputchar[playerid]));

In de bovenstaande query word DB_Escape() gebruikt om SQL injectie te voorkomen.

Hoe voorkom ik zo een SQL injectie nou in PHP/SQLite3? Ik neem aan door de query te escapen? Ik vind er helaas niks over.
 
- Ariën  -
Beheerder

- Ariën -

21/02/2018 12:33:51
Quote Anchor link
Het ligt eraan wat DB_Escape precies doet. Als deze op de juiste manier je string met de SQL-query escaped, dan is er niks aan de hand.
 
Jasper Schellekens

Jasper Schellekens

21/02/2018 13:12:32
Quote Anchor link
Bedankt voor de snelle reactie.

DB_Escape is inderdaad om te escapen maar is geen php functie en ik betwijfel of het compitabel met PHP/sqlite3 is.
Dit is de functie DB_Escape:
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
DB_Escape(text[])
{
    new
        ret[MAX_INI_ENTRY_TEXT * 2],
        ch,
        i,
        j;
    while ((ch = text[i++]) && j < sizeof (ret))
    {
        if (ch == '\'')
        {
            if (j < sizeof (ret) - 2)
            {
                ret[j++] = '\'';
                ret[j++] = '\'';
            }
        }
        else if (j < sizeof (ret))
        {
            ret[j++] = ch;
        }
        else
        {
            j++;
        }
    }
    ret[sizeof (ret) - 1] = '\0';
    return ret;
}


Wat is de juiste manier om te escapen in PHP/SQLite3?
Gewijzigd op 21/02/2018 13:14:58 door Jasper Schellekens
 
- Ariën  -
Beheerder

- Ariën -

21/02/2018 13:15:18
Quote Anchor link
Die code zal zeker niet werken in PHP.
Kijk hier eens naar:
http://php.net/manual/en/sqlite3.escapestring.php
Gewijzigd op 21/02/2018 13:16:14 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

21/02/2018 16:54:02
Quote Anchor link
- Ariën - op 21/02/2018 13:15:18:
Die code zal zeker niet werken in PHP.
Kijk hier eens naar:
http://php.net/manual/en/sqlite3.escapestring.php

Mja, maar dat is em ook niet helemaal, kijk maar eens naar de omschrijving (waarschuwing: niet binary safe) en naar de user comments (escaped geen dubbele quotes die wel een speciale betekenis hebben en er gebeurt ook iets wanneer een string \0 (een "null byte") bevat).
 
Jasper Schellekens

Jasper Schellekens

22/02/2018 01:27:11
Quote Anchor link
Bedankt voor jullie reacties.
@Thomas dat viel mij ook al op. Dat is wel een minpunt.

Ik heb nu deze code maar de volgende error:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Fatal error: Call to undefined function escapeString() in D:\AppServ\www\ucp\login.php on line 9

Ik denk dat ik de functie verkeerd gebruik.

code:
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
38
<?php
 error_reporting(E_ALL);
 
 $db = new MyDB() or die ("Unable to open");
 $postmd5pass = $_POST["PASSWORD"];
 $postmd5pass = md5($postmd5pass);
 $postmail = $_POST["MAIL"];
 escapeString($postmd5pass);
 escapeString($postmail);
 $sql = "SELECT * FROM USERS WHERE MAIL='$postmail' AND PASSWORD='$postmd5pass'";

 $stmt = $db->query($sql);                      
 while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
 {
                                                                          
      $email_address = $row["MAIL"];  
      $password = $row["PASSWORD"];
      $l_mail = $row["MAIL"];  
      $l_name = $row["NAME"];
      $l_username = $row["USERNAME"];
      $l_id = $row["ID"];
      if($password==$postmd5pass)
      {

        
         echo "Succesfully logged in!.<br><br><a href='index.php' class='btn btn-info'>Continue</a>";                            
         $_SESSION['loggedin_user']= $l_username;
         $_SESSION['loggedin_mail']= $l_mail;
         $_SESSION['loggedin_name']= $l_name;
         $_SESSION['loggedin_id']= $l_id;
      }
 }

 while(!$row = $stmt->fetchArray(SQLITE3_ASSOC) )
 {

        include"login_fail.php";  
        include"loginform.php";                        
 }

 

?>
 
- Ariën  -
Beheerder

- Ariën -

22/02/2018 01:31:01
Quote Anchor link
Ik zou eens $db->escapeString(...) proberen.

Een paar tips:
- Gebruik geen md5() meer, omdat die zeer zwak is, en gebruik bij sterke voorkeur: password_hash() en password_verify()
- Het is niet nodig om op lijn 15 t/m 20 variabelen te kopiëren.
- Sla alleen een userID op in een sessie. Waarom zou je een mailadres of een naam nodig hebben?
 
Thomas van den Heuvel

Thomas van den Heuvel

22/02/2018 02:44:13
Quote Anchor link
Tevens:
- ververs de pagina met een header()
- voer een session_regenerate_id() uit als je inlogt, dit is een state change
- combineer geen serverside/clientside zooi: eerst een echo en dan dingen die je wegschrijft naar de sessie? Hoe werkt dat dan? :/
 
Jasper Schellekens

Jasper Schellekens

22/02/2018 13:24:50
Quote Anchor link
Bedankt voor de tips. Ik heb mijn code aangepast naar jullie tips.
Echt een behulpzame plek hier:)

Nu probeer ik in-game reports te laten zien en dat werkt prima.
Ik heb dan boven aan de page een stukje code die het admin level zou moeten nakijken.
Echter hier gaat wat mis:

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
<?php
if(isset($_SESSION['loggedin_id'])){  
 $dbget_id = $_SESSION["loggedin_id"];  
 }

 
$sql_prep = "SELECT * FROM USERS WHERE ID='$dbget_id'";
$stmt = $db->query($sql_prep);
$adminlevel = $row['ADMINLEVEL'];

if($adminlevel <= 1)
{

    exit( "Hello there, ". $row['NAME'] . "!<br>You are unauthorized to visit this page.");
}



?>


Als ik mij niet vergis betekend dit; if($adminlevel <= 1). als admin level kleiner dan 1 is.
Nu is het admin level 6 en toch laat hij me deze melding zien. Wat doe ik fout?

Edit:
deze code doet het hem wel maar er zijn bepaalde functies die bijv een admin level van 3 nodig hebben. Dat lukt niet hiermee:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
if(!$adminlevel == 0)
{
    exit( "Hello there, ". $row['NAME'] . "!<br>You are unauthorized to visit this page.");
}
Gewijzigd op 22/02/2018 13:28:13 door Jasper Schellekens
 
- Ariën  -
Beheerder

- Ariën -

22/02/2018 13:30:05
Quote Anchor link
Waar komt $row vandaan? Zo te zien mis je nog het fetchen van je data uit je result.
 
Jasper Schellekens

Jasper Schellekens

22/02/2018 14:40:59
Quote Anchor link
- Ariën - op 22/02/2018 13:30:05:
Waar komt $row vandaan? Zo te zien mis je nog het fetchen van je data uit je result.


Inderdaad, je hebt gelijk.
Stom foutje van me.
Dit werkt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
 {    
    $adminlevel = $row['ADMINLEVEL'];
    if($adminlevel <= 1)
    {
        exit( "Hello there, ". $row['NAME'] . "!<br>You are unauthorized to visit this page.");
    }
 }
Gewijzigd op 22/02/2018 14:41:21 door Jasper Schellekens
 
- Ariën  -
Beheerder

- Ariën -

22/02/2018 14:48:01
Quote Anchor link
Persoonlijk zou ik geen exit() of die() gebruiken omdat je script niet hoeft te worden afgebroken. Ook niet in het geval als iemand geen juiste rechten heeft. Handel het gewoon af met een nette foutmelding in een 'if-else'-statement.
 
Jasper Schellekens

Jasper Schellekens

22/02/2018 14:49:20
Quote Anchor link
- Ariën - op 22/02/2018 14:48:01:
Persoonlijk zou ik geen exit() of die() gebruiken omdat je script niet hoeft te worden afgebroken. Ook niet in het geval als iemand geen juiste rechten heeft. Handel het gewoon af met een nette foutmelding in een 'if-else'-statement.


Dat heb ik gedaan, maar als ik geen exit() gebruik spamt hij de echo (foutmelding) 100 x over de pagina.
 
- Ariën  -
Beheerder

- Ariën -

22/02/2018 14:50:54
Quote Anchor link
Dan moet je goede afhandeling met if-else inbouwen.
Desnoods kan je ook een functie/method maken die foutmeldingen in een net HTML-document toont. Exceptions zouden al heel handig zijn hiervoor.
Gewijzigd op 22/02/2018 14:51:39 door - Ariën -
 
Jasper Schellekens

Jasper Schellekens

22/02/2018 14:51:47
Quote Anchor link
- Ariën - op 22/02/2018 14:50:54:
Dan moet je goede afhandeling met if-else inbouwen.
Desnoods kan je ook een functie/method maken die foutmeldingen in een net HTML-document toont.


sorry ik volg je even niet.
Heb je misschien een voorbeeldje van de juiste afhandeling?

Edit: had de link nog niet gezien.
Gewijzigd op 22/02/2018 14:52:12 door Jasper Schellekens
 

Pagina: 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.