Dynamische Websites Week 6
AGENDA Herhaling Databank SQL Injection Ontwerp
OO _ indien private of protected magic
zo weinig mogelijk php! View MVC home.php confirm.php vehicledetail.php Controller Model Controller navigatie dispatching Vehicle alle logica en gegevens
taak: controller aanmaken index.php taak: navigatie, dispatch controller.php home.php taak: data tonen of opvragen
taak: controller aanmaken index.php taak: navigatie, dispatch controller.php vehicle.php vehicledetail.php home.php taak: data tonen of opvragen taak: data bijhouden
taak: controller aanmaken taak: valideren sanitize index.php taak: navigatie, dispatch validator.php controller.php vehicledetail.php confirm.php vehicle.php taak: data tonen of opvragen taak: data bijhouden
ToDo vehicleoverview.php
AGENDA Herhaling Databank SQL Injection Ontwerp
Vehicle php DB Vehicle_Mapper interface SQL PHP Data Objects (PDO)... postgres drivers implementeren interface
MAPPER vertaalt objecten naar SQL spreekt PDO-interface aan Vehicle_Mapper logisch, werkt met objecten verraadt niets over onderliggende db + construct() +add($vehicle) +update($vehicle) +delete($id) +get($id):vehicle +getall():array...
MAPPER: STAPPEN 1. Connecteren: vb: mysql:host=localhost;dbname=test $db = new PDO($dsn, $user, $password); in methode construct() 2. Aanspreken: wijzigen: $db->exec($sql); bevragen: $db->query($sql); in andere methodes SQL statement
OP WEBONTWERP....db_password.php <?php $dbuser = "r0123456"; $dbpassword = "1234hvp";?> hidden nu reeds op server
IN PROJECT config.php <?php date_default_timezone_set('europe/brussels'); require_once('../.db_password.php'); $db_config = array( 'driver' => 'pgsql', 'username' => $dbuser, 'password' => $dbpassword, 'schema' => 'test_kubeh', r0123456 'dsn' => array( 'host' => 'gegevensbanken.khleuven.be', 'dbname' => 'webontwerp', 'port' => '51314', 2TX3R1 of ) 2TX3R2... );
MAPPER: CONNECTEREN $dsn opbouwen o.b.v. config.php connectie schema-prefix overbodig
MAPPER: WIJZIGEN SQL opbouwen statement uitvoeren
MAPPER: BEVRAGEN SQL opbouwen statement uitvoeren resultaat in associatieve array array omzetten naar objecten
CONTROLLER
AGENDA Herhaling Databank SQL Injection Ontwerp
OK? Wat als: OR 1=1 $sql = "SELECT password FROM users WHERE username = '". $_GET['username']. "';"; $result = $db->query($sql); $value = $result->fetchcolumn(); if ($value == sha1($_get['password'])) { " echo 'your are logged in'; }
RISICO $sql: SELECT password FROM users WHERE username = OR 1=1 $result: alle users en paswoorden 1ste rij: wellicht admin altijd true!
PREPARED STATEMENTS Placeholders in plaats van values statement éénmaal parsen herhaaldelijk oproepen met andere parameterwaarde Voordelen: tijdswinst overzichtelijke syntax structuur query ligt vast, dus veilig
// query met een sql-parameter $sql = "SELECT password FROM users WHERE username = :user_name;"; // statement wordt op voorhand geparsed $stmt = $db->prepare($sql); // php variable linken aan sql-parameter // het moet een string zijn met maximum 15 karakters $stmt->bindparam(':user_name', $_GET['username'], PDO::PARAM_STR, 15); // statement uitvoeren $stmt->execute(); $value = $stmt->fetchcolumn(); if ($value == sha1($_get['password'])) { " echo 'your are logged in'; }
MAPPER
AGENDA Herhaling Databank SQL Injection Ontwerp
EXTRA VEREISTE Ook werknemers registereren Klassen: Employee EmployeeMapper
EMPLOYEE_MAPPER DRY!
Vehicle_Mapper + construct() +add($vehicle) +update($vehicle) +delete($id) +get($id):vehicle +getall():array... aanmaken specifieke SQL, objecten OPLOSSING Db Employee_Mapper + construct() +add($employee) +update($employee) +delete($id) +get($id):employee +getall():array... + construct() +select($sql, $arguments) generieke functionaliteit
Controller MVC Vehicle_Mapper Vehicle Db Employee_Mapper Employee
Controller FAÇADE Garage_Model Vehicle_Mapper Vehicle Db Employee_Mapper Employee
OK? $db1:db Db + construct() +select($sql, $arguments) $db3:db $db2:db te veel connecties!
SINGLETON
AGENDA? Herhaling Databank SQL Injection Ontwerp