PDO - First Script - (Inlog script) Feedback ronde !!

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Dennis Anderson

Dennis Anderson

15/12/2012 23:08:44
Quote Anchor link
Beste PHP'ers,

Ik ben net nieuw hier en alles ziet er goed uit ! ik verdiep mij steeds meer in PHP en nu dus ook in PDO gewoon omdat het nieuw is veiliger en mysql_ eruit vliegt in PHP 6 had ik gehoord.

Ik heb mijn eerste PDO Inlog Script gemaakt en wou graag feedback op mijn creatie. Geen idee of ik het slimmer of beter had kunnen doen !

config.php
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$config
['db'] = array(
    'host'        => 'localhost',
    'username'    => 'root',
    'password'    => '***',
    'dbname'    => 'urbanprint',
);


$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);
?>


checklogin.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
<?php
include('config.php');

$user=$_POST['username'];
$password=$_POST['password'];

$stmt = $db->prepare("
    SELECT * FROM inloggen WHERE gebruikersnaam = :username AND wachtwoord = :password
"
);
$stmt->bindParam(":username"   , $user    );
$stmt->bindParam(":password", $password);
$stmt->execute();
$row = $stmt->fetchAll();

 if (count($row) == 1 ){
     session_start();
    $_SESSION['username'] = $user;
    $_SESSION['password'] = $password;
    header("location: index.php");
}

?>


Outlog.php
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
session_start();
session_destroy();
header("location: index.php");
?>


HTML
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
                    if(!isset($_SESSION['username'], $_SESSION['password'])){
                         echo "<form name='inloggen' action='checklogin.php'  method='Post'>
                              <input type='text' name='username' placeholder='Gebruikersnaam' value='' />
                              <input type='password' name='password' placeholder='Wachtwoord' value='' />
                              <input type='submit' value='Log in' />
                             </form>"
;
                    }
else {
                        echo "Welcome " . $_SESSION['username'] . " bij UrbanPrint";
                        echo "<a href='outlog.php'>Logout</a>";
                    }

                 ?>


Is er een betere manier om uit te loggen?

MvG,

Dennis Anderson
Gewijzigd op 15/12/2012 23:09:26 door Dennis Anderson
 
PHP hulp

PHP hulp

07/12/2024 01:11:19
 
Wouter J

Wouter J

15/12/2012 23:45:01
Quote Anchor link
Quote:
nu dus ook in PDO gewoon omdat het nieuw is veiliger en mysql_ eruit vliegt in PHP 6 had ik gehoord.

Even deze argumenten relativeren, of PHP6 er ooit gaat komen weet niemand. Bijna alle PHP6 features komen in de nieuwste PHP5 versies terug en 'eruit vliegen' valt wel mee. PHP zal de extensie nooit kunnen weggooien, aangezien 95% van de PHP websites deze extensie gebruikt. Als laatst is hij nul komma nul veilig dan de mysql_* extensies, als je in MySQL de juiste functies gebruikt is ie veilig, in PDO geldt dat precies hetzelfde.


Wat tips:
- Ik zou de config echt alleen de config laten bevatten. Include deze in je bestand en maak dan de PDO object aan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

require_once 'config.php';

$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);
?>

Dit bestand noem je dan vaak 'bootstrap.php' en die roep je aan in pagina's waar je de PDO extensie gebruikt.
- Je mist elke vorm van foutafhandeling, terwijl dat juist de fundering is van je script.
- session_start moet altijd aan het begin van een bestand
- sla nooit het wachtwoord zomaar op in een sessie
- je inlog script is alles behalve veilig. Ik kan nu bijv. zomaar op mijn computer zelf een 'username' en 'password' sessie aanmaken en ik ben ingelogd! Beter is het om bij het inloggen een unieke sha te maken, bijv. uniqid icm een sha* functie van de username. Deze sha sla je op in de DB en sla je op in een sessie. Bij elke pagina kijk je of de sha in de versie gelijk is aan de sha in de DB, zo ja => gebruiker ingelogd, zo nee => gebruiker is niet ingelogd.
- Ik raad je aan om nooit HTML te echoën, maar PHP te sluiten en dan HTML te plaatsen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php if(!isset($_SESSION['username'], $_SESSION['password'])){ ?>
<form name='inloggen' action='checklogin.php'  method='Post'>
    <input type='text' name='username' placeholder='Gebruikersnaam' value='' />
    <input type='password' name='password' placeholder='Wachtwoord' value='' />
    <input type='submit' value='Log in' />
</form>
<?php } else { ?>
<h3>Welcome <?php echo $_SESSION['username'] ?> bij UrbanPrint
<a href='outlog.php'>Logout</a>
<?php } ?>

En dan raad ik je aan om de alternatieve statement syntax te proberen (meer informatie: control-structures.alternative-syntax)
- maak je code consistent, op deze manier is het een rommelt. Zomaar wat voorbeelden:
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
<?php
// hoeveel spaties zitten er nou tussen een key en => ?
    'password'    => '***',
    'dbname'    => 'urbanprint',

// zijn er nou spaties rond de = of niet?
$password=$_POST['password'];

$stmt = $db->prepare(...);

// hoeveel spaties plaatsen we rond de komma?
$stmt->bindParam(":username"   , $user    );
$stmt->bindParam(":password", $password);

// wat doet die spatie tussen 1 en )
// en waarom hebben de eerste 2 regel 1 spatie extra?

 if (count($row) == 1 ){
     session_start();
    $_SESSION['username'] = $user;
?>
Gewijzigd op 16/12/2012 09:15:45 door Wouter J
 
Dennis Anderson

Dennis Anderson

17/12/2012 01:33:23
Quote Anchor link
Bedankt voor je feedback :) heb de code netjes gemaakt en gebruik gemaakt van de alternatieve statement syntax

de HTML kon ik zo overkopieren, bedankt voor de moeite hiervoor !!
Als beveiliging heb ik exceptions in de PDO gezet en heb ik de password in SHA gezet en opgeslagen in de database.

Dus bij registreren met SHA en dan bij inloggen wordt er weer gekeken, lijkt mij niet helemaal veilig jou manier zou veiliger zijn maar ik zit met een deadline en om alles nog uit te puzzelen ;)

en session start staat nu ook bovenaan :)

Bedankt voor je feedback ! Het was helder en concreet :)
 
Wouter J

Wouter J

17/12/2012 09:10:47
Quote Anchor link
Iets wat ik trouwens volledig gemist heb is dat je NOOIT wachtwoorden raw moet opslaan in de DB, altijd een hash eroverheen gooien.
 
Ama saril

ama saril

17/12/2012 10:56:01
Quote Anchor link
Is niet mijn topic maar zie toch iets staan:
- Ik raad je aan om nooit HTML te echoën, maar PHP te sluiten en dan HTML te plaatsen:

waarom mag je html nooit echoen? als je variabelen in je HTML kwijt wil dan moet dat toch wel, of kan dat ook anders?
 
Wouter J

Wouter J

17/12/2012 23:05:13
Quote Anchor link
Het mag natuurlijk wel, alleen ik raad altijd aan om code te scheiden. Schrijf nooit CSS in HTML of Js en schrijf ook nooit HTML met PHP. Als je later verder bent en frameworks gaat gebruiken merk je dat de logica eigenlijk helemaal niet tussen de HTML hoort en je eigenlijk in de HTML alleen nog maar variabele gaat echoën.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/12/2012 23:40:19
Quote Anchor link
Pre Hypertext Processor, dat is volgens mij waar PHP voor staat. Dan lijkt het me moeilijk om geen html met php te schrijven, zowaar een lege pagina ;-)
 
Tim S

Tim S

18/12/2012 00:40:08
Quote Anchor link
kan wel met bijvoorbeeld smarty
 
Bart V B

Bart V B

18/12/2012 06:03:54
Quote Anchor link
Ama saril op 17/12/2012 10:56:01:
waarom mag je html nooit echoen? als je variabelen in je HTML kwijt wil dan moet dat toch wel, of kan dat ook anders?


Scheiden van php en html is toch niet zo lastig?
Het maakt je code leesbaarder.
Stel je hebt een hele lap met html, dan word het al heel gauw een brei onoverzichtelijke code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

echo'<form name="form" method="post" action="contact">
     <input type="text" name="user" id="user" value="'
.$user.'" />
     <input type="text" name="email id="email" value="'
.$email.'" />
     <input type="submit" name="submit" value="send" />
     </form>
    '
;
?>

Of je scheid het wat een stuk leesbaarder is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<form name="form" method="post" action="contact">
     <input type="text" name="user" id="user" value="<?php echo $user;?>" />
     <input type="text" name="email id="email" value="<?php echo $email;?>" />
     <input type="submit" name="submit" value="send" />
 </form>
 
Ama saril

ama saril

18/12/2012 15:24:25
Quote Anchor link
Maar als jij een formulier dynamisch laat genereren moet je dit toch ook echoen naar de gebruiker toe, want er is eigenlijk 'geen formulier' totdat jij het genereerd. Je moet dan toch wel echoen?

Als ik bijvoorbeeld een MVC gebruik en ik genereer met mijn view de htmlcode, dan is dat toch ook scheiden van logica en wat de gebruiker ziet?
 
Wouter J

Wouter J

18/12/2012 15:46:22
Quote Anchor link
Ama:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php $something = true ?>
<?php if (false == $something) : ?>
<h1>Dit wordt niet getoond.</h1>
<?php else : ?>
<h1>Dit wel</h1>
<?php endif ?>
 
Ama saril

ama saril

18/12/2012 17:00:14
Quote Anchor link
Wouter J op 18/12/2012 15:46:22:
Ama:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php $something = true ?>
<?php if (false == $something) : ?>
<h1>Dit wordt niet getoond.</h1>
<?php else : ?>
<h1>Dit wel</h1>
<?php endif ?>


ah Ik wist niet dat dat kon.. misschien vanaf nu het toch maar anders aanpakken, thx.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/12/2012 17:22:08
Quote Anchor link
@Wouter en Bart
Bij de voorbeelden die jullie geven kan ik in meegaan dan het dan overzichtelijker is, maar doen jullie dat dan ook op die manier als je in één tag meerdere php variabeles moet echoën, of als je binnen wat ingewikkeldere control structures bezig bent.
Ik vond het woord moeten overdreven, een Brabander zou zeggen 'Motten zitten in de kast'
 
Bart V B

Bart V B

18/12/2012 17:46:27
Quote Anchor link
hehe Brabanders..
moeten is dwang natuurlijk.
Hoe je het doet is niet van belang.
Als het een complex probleem oplost is het prima.

Ook in een wat groter stuk code vind ik het persoonlijk ook prettiger om de html te scheiden.
nogmaals, het is een voorkeur.
 



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.