Dynamische Websites Week 6
vrijdag 25 oktober 13
AGENDA • Herhaling • Databank • SQL Injection • Ontwerp vrijdag 25 oktober 13
OO _ indien private of protected ‘magic’
vrijdag 25 oktober 13
zo weinig mogelijk php!
View
MVC home.php
confirm.php vehicleDetail.php
Controller
Model
Controller
navigatie dispatching
Vehicle
alle logica en gegevens vrijdag 25 oktober 13
taak: controller aanmaken
index.php
taak: navigatie, dispatch
controller.php home.php
taak: data tonen of opvragen vrijdag 25 oktober 13
taak: controller aanmaken
index.php
taak: navigatie, dispatch
controller.php vehicleDetail.php home.php
taak: data tonen of opvragen vrijdag 25 oktober 13
vehicle.php
taak: data bijhouden
taak: valideren sanitize
taak: controller aanmaken
index.php
taak: navigatie, dispatch
validator.php
controller.php vehicleDetail.php confirm.php
taak: data tonen of opvragen vrijdag 25 oktober 13
vehicle.php
taak: data bijhouden
ToDo
vehicleOverview.php
vrijdag 25 oktober 13
AGENDA • Herhaling • Databank • SQL Injection • Ontwerp vrijdag 25 oktober 13
Vehicle
DB
php Vehicle_Mapper
SQL interface
PHP Data Objects (PDO)
postgres
vrijdag 25 oktober 13
...
drivers implementeren interface
MAPPER • vertaalt objecten naar SQL • spreekt PDO-interface aan
logisch, werkt met objecten verraadt niets over onderliggende db vrijdag 25 oktober 13
Vehicle_Mapper +__construct() +add($vehicle) +update($vehicle) +delete($id) +get($id):Vehicle +getAll():array ...
MAPPER: STAPPEN 1. Connecteren:
• $db
vb: “mysql:host=localhost;dbname=test”
= new PDO($dsn, $user, $password);
• in methode
__construct()
2. Aanspreken:
• wijzigen: $db->exec($sql); • bevragen: $db->query($sql); • in andere methodes SQL statement vrijdag 25 oktober 13
OP WEBONTWERP... .db_password.php
hidden
vrijdag 25 oktober 13
nu reeds op server
IN PROJECT
config.php
'pgsql', 'username' => $dbUser, 'password' => $dbPassword, 'schema' => 'test_kubeh', r0123456 'dsn' => array( 'host' => 'gegevensbanken.khleuven.be', 'dbname' => 'webontwerp', 'port' => '51314', 2TX3R1 of ) 2TX3R2 ... ); vrijdag 25 oktober 13
MAPPER: CONNECTEREN $dsn opbouwen o.b.v. config.php connectie
schema-prefix overbodig vrijdag 25 oktober 13
MAPPER: WIJZIGEN SQL opbouwen
statement uitvoeren
vrijdag 25 oktober 13
MAPPER: BEVRAGEN SQL opbouwen statement uitvoeren resultaat in associatieve array array omzetten naar objecten
vrijdag 25 oktober 13
CONTROLLER
vrijdag 25 oktober 13
AGENDA • Herhaling • Databank • SQL Injection • Ontwerp vrijdag 25 oktober 13
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'; }
vrijdag 25 oktober 13
RISICO • $sql: SELECT password FROM users WHERE username = ” OR 1=1
• $result: • •
vrijdag 25 oktober 13
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
vrijdag 25 oktober 13
// 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'; } vrijdag 25 oktober 13
MAPPER
vrijdag 25 oktober 13
AGENDA • Herhaling • Databank • SQL Injection • Ontwerp vrijdag 25 oktober 13
EXTRA VEREISTE • Ook werknemers registereren • Klassen: • •
vrijdag 25 oktober 13
Employee EmployeeMapper
EMPLOYEE_MAPPER
DRY ! vrijdag 25 oktober 13
Vehicle_Mapper
OPLOSSING
+__construct() +add($vehicle) aanmaken specifieke +update($vehicle) SQL, +delete($id) objecten +get($id):Vehicle +getAll():array ... Employee_Mapper +__construct() +add($employee) +update($employee) +delete($id) +get($id):Employee +getAll():array ... vrijdag 25 oktober 13
Db
+__construct() +select($sql, $arguments)
generieke functionaliteit
Controller
MVC
Vehicle_Mapper
Vehicle Db
Employee_Mapper
vrijdag 25 oktober 13
Employee
Controller
FAÇADE Garage_Model
Vehicle
Vehicle_Mapper Db Employee_Mapper
vrijdag 25 oktober 13
Employee
OK? $db1:Db Db $db2:Db +__construct() +select($sql, $arguments) $db3:Db
te veel connecties! vrijdag 25 oktober 13
SINGLETON
vrijdag 25 oktober 13
AGENDA • Herhaling • Databank • SQL Injection • Ontwerp vrijdag 25 oktober 13
?