PDO - First Script - (Inlog script) Feedback ronde !!
Door
Dennis Anderson
op 15-12-2012 23:08
gewijzigd op 15-12-2012 23:09
2.461 views
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 !
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.
[hr]
Wat tips:
- Ik zou de config echt alleen de config laten bevatten. Include deze in je bestand en maak dan de PDO object aan:
<?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. [php]uniqid[/php] 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:
En dan raad ik je aan om de alternatieve statement syntax te proberen (meer informatie: [php]control-structures.alternative-syntax[/php])
- maak je code consistent, op deze manier is het een rommelt. Zomaar wat voorbeelden:
<?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;
?>
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 :)
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 ;-)
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:
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?