PDO - First Script - (Inlog script) Feedback ronde !!
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)
1
2
3
4
5
6
7
8
9
10
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']);
?>
$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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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");
}
?>
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:
HTML
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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>";
}
?>
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
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)
1
2
3
4
5
6
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']);
?>
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)
1
2
3
4
5
6
7
8
9
10
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 } ?>
<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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
?>
// 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
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 :)
Iets wat ik trouwens volledig gemist heb is dat je NOOIT wachtwoorden raw moet opslaan in de DB, altijd een hash eroverheen gooien.
- 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?
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.
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 ;-)
kan wel met bijvoorbeeld smarty
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)
1
2
3
4
5
6
7
8
9
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>
';
?>
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:
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 op 18/12/2012 15:46:22:
ah Ik wist niet dat dat kon.. misschien vanaf nu het toch maar anders aanpakken, thx.
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'
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.