370 likes | 507 Views
State, sessions, databases. Webtechnologie. Lennart Herlaar. Inhoud. State Cookies en sessions Webdatabases Databases en PHP (Transactions). State, sessions, databases. Webdatabases. Webtechnologie. Lennart Herlaar. Centraal architectuur diagram. Form, parameters, …. Web
E N D
State, sessions, databases Webtechnologie Lennart Herlaar
Inhoud • State • Cookies en sessions • Webdatabases • Databases en PHP • (Transactions)
State, sessions, databases Webdatabases Webtechnologie Lennart Herlaar
Centraalarchitectuur diagram Form, parameters, … Web Browser + Applicatie Parameters, code Interpreter of compiler Webserver HTML, CSS, JavaScript, JSON, … HTML, JavaScript, JSON, … File access File SQL Result set SQL Result set X Files RDBMS RDBMS
Webdatabases? • Wenselijke eigenschappen van RDBMSen • Stabiele structuur van data • Grote hoeveelheden data • Goede performance • Meerdere gebruikers tegelijkertijd (transactions) • Betrouwbaarheid en integriteit van data • Uitbreiding van webapplicatie met een RDBMS voor storage ligt voor de hand • B.v. producten en bestellingen binnen een webshop • Databases op het web is een betere benaming
Computing models revisited • Three-tier C/S model past goedbij het web • Webbrowserfunctioneertals thin client • Webserver functioneertals application server • Database server voor database en transaction logic • Eventueelloskoppeling webserver en applicatie • Diverse technieken voor integratie • Leverancier-specifieke technieken, eigen webservers • Gebruikelijke ondersteuning in programmeertalen • Java: Java DataBase Connectivity (JDBC) • Server side scripting talen
Server side scripting & RDBMSen • Server side scripting talen hebben in de regel faciliteiten voor interactie met een RDBMS • Vaak in de vorm van extensions, modules, libraries • Perl DBI-modules • PHP extensions • Maar ook: RDBMS support in de core • Leverancier-specifiek versus abstractielagen • Vaak een platform-specifieke driver nodig • Interactie vaak op basis van SQL en result set • Client/server request en response
Database smaken • Er zijn vele tientallen RDBMSen beschikbaar • Oracle, MS SQL Server, MySQL, PostgreSQL, SQLite • MS Access, Excel (!) • "Wat is het beste RDBMS?" • Holy Wars! Vergelijk: taal, OS, telefoon, ... • Betere vraag: "gegeven mijn specifieke situatie?" • "Use the tool that does the job best" • Requirements, license, features, stabiliteit, eenvoud, schaalbaarheid, performance, kennis, support, kosten
Databases op het web • HTTP revisited • HTTP is stateless • HTTP kent page based requests • Gevolgen voor database interactie • 1 tot vele tientallen queries per pagina • Queries vaak relatief eenvoudig; binnen een context • Transactions over meerdere requests problematisch • Snelheid versus features? • Snelheid versus betrouwbaarheid en integriteit? GAAAAAAP!!!
De populairste opties • MySQL en SQLite zijn populaire keuzes • Gratis (maar...), snel, relatief eenvoudig • Inmiddels ook een behoorlijke featureset • ACID-compliant database platformen • MySQL is een client/server RDBMS • SQLite is een file database • Geen eigen server proces • Access mechanisme (library) gelinkt in de client(s) • "Concurrent" writes op basis van file locking!
SQLite overwegingen • SQLite files zijn portable • SQLite werkt zonder users / passwords • SQLite is "weakly typed" • SQLite wordt vaak client side gebruikt • Browsers, mobile devices • SQLite is niet zo heel serieus... • ...als server side database platform voor grote sites • ...maar voldoet prima bij een practicumopdracht • Zero-install footprint! • De trend is overigens weer naar client side state!
State, sessions, databases Databases en PHP Webtechnologie Lennart Herlaar
Databases en PHP • Database ondersteuning in PHP is uitgebreid • Specifieke extensions voor > 20 platformen • Daarnaast abstraction layers • Portability is een aandachtspunt • Platform-specifieke functienamen en parameters • mysqli_query, pg_query, ... • Maar wel platform-specifieke features benaderbaar • Eigen database abstraction library schrijven? • MySQL en SQLite support native in PHP aanwezig • Maar niet op onze webserver... En versieafhankelijk!
Databases en PHP <?php if (!($cnx = @pg_connect("host=somehost dbname=somedatabase user=someuser password=somepassword"))) { showerror(); } if (!($result = pg_query($cnx, "SELECT * FROM products"))) { showerror(); } echo "<ul>\n"; while ($row = pg_fetch_array($result)) { echo "<li>" . $row["description"] . " : " . $row["price"] . "</li>\n"; } echo "</ul>\n"; pg_close($cnx); ?>
Database abstraction library? function db_connect ($type, $host, $database, $user, $password) { if ($type == 'pgsql') { if (!($cnx = @pg_connect("host=$host dbname=$database user=$user password=$password"))) { showerror(); } } elseif ($type == 'mysql') { if (!($cnx = @mysql_connect($host, $user, $password))) { showerror(); } mysql_select_db($database, $cnx) or showerror(); } return $cnx; }
PHP database abstraction layers • Diverse database abstraction layers beschikbaar • Deels in de core, deels in PEAR/PECL, deels extern • PDO, dbx, ADOdb, ODBC, ... • PHP Data Objects (PDO) • Standaard in PHP aanwezig • Data-access abstraction, niet database abstraction • Dezelfde functies voor queries en result sets • Geen herschrijving van SQL statements • Geen bijzondere functionaliteit (wel via PDO drivers)
PDO <?php try { $dbh = new PDO('sqlite:mydbfile.sqlite'); $sth = $dbh->query("SELECT * FROM products"); echo "<ul>\n"; foreach ($sth as $row) { echo "<li>" . $row["description"] . " : " . $row["price"] . "</li>\n"; } echo "</ul>\n"; $dbh = NULL; } catch(PDOException $e) { echo "Exception: " . $e->getMessage(); } ?>
PDO prepare & execute <?php $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $calories = 150; $colour = 'red'; $sth->execute(array(':calories' => $calories, ':colour' => $colour)); [...] ?> <?php $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories <:calories AND colour = :colour');$sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); $calories = 150; $colour = 'red'; $sth->execute(); [...] $calories = 90; $colour = 'green'; $sth->execute(); [...] ?> <?php $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->bindParam(1, $calories, PDO::PARAM_INT); $sth->bindParam(2, $colour, PDO::PARAM_STR, 12); $calories = 150; $colour = 'red'; $sth->execute(); [...] ?> <?php $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $calories = 150; $colour = 'red'; $sth->execute(array($calories, $colour)); [...]?>
PDO observaties • Class based • Exception handling • try – catch; informatief, maar niet te informatief • PDO versus PDOStatement • Database handle versus query en result set • Query versus prepare & execute: templates! • Efficiëntie en security; voorkomen SQL injection • Let op data type • Ook data manipulatie en data definitie • INSERT, DELETE, CREATE TABLE, DROP TABLE
Frameworks en databases • Sommige PHP frameworks werken met ORM • Object Relational Mapping; vaak onderdeel MVC • Virtuele object database; persistent objects • Conversie van objecten naar RDBMS records • Een tabel is een class, een record is een object • OR impedance mismatch; lastig probleem • Soms alleen: SQL samenstellen; result in arrays • ORM abstractie bovenop een PDO abstractie waar een ODBC abstractie gebruikt wordt om een SQLite abstractie van een file te benaderen? That hurts!
Session data en databases • Is session data ook data? Ja! • Producten, bestellingen en winkelmandjes • PHP gebruikt files voor opslag session data • Een database is vaak handiger • Grote verzameling sessions verstopt het file system • Niet erg toegankelijk voor externe toepassingen • Schaalt moeizaam: multi-server omgeving • Twee mogelijkheden • Expliciet afhandelen van sessions • Herdefiniëren van default session handlers
State tables • Session data komt terecht in state tables • Basis: session identifier, key, value • Maar ook maatwerk mogelijk; inpassen in database • Reguliere database tabellen met enkele extra velden • Functies nodig voor lezen, wijzigen, verwijderen • En een garbage collection mechanisme • Session data is immers veelal tijdelijk van aard
State tables session_start(); $dbh = new PDO('sqlite:statedb.sqlite'); $sth = $dbh->prepare("SELECT count(*) AS count FROM visitors WHERE sessionid = ?"); $sth->bindValue(1, session_id(), PDO::PARAM_STR); $sth->execute(); $row = $sth->fetch(); $rowcount = $row['count']; if ($rowcount == 0) { $sth = $dbh->prepare("INSERT INTO visitors (sessionid, lastvisit) VALUES (:sessionid, :time)"); } else { $sth = $dbh->prepare("UPDATE visitors SET lastvisit = :time WHERE sessionid = :sessionid"); } $sth->bindValue(':sessionid', session_id(), PDO::PARAM_STR); $sth->bindValue(':time', time(), PDO::PARAM_INT); $sth->execute();
State tables • Herdefiniëren van default session handlers • session.save_handler op "user" in plaats van "file" • Definiëren van functies voor afhandelen sessions • Toegang state tables onderbrengen in deze functies • Sessions kunnen normaal gebruikt worden • session_start, $_SESSION • Transparant, maar wel lastiger om op te zetten class MySessionHandler extends SessionHandler { public function read($sessionid) { global $sess_save_path; $sess_file = "$sess_save_path/sess_$sessionid"; return (string) @file_get_contents($sess_file); } // Vervang dit door een state table query [...] } $handler = new MySessionHandler();session_set_save_handler($handler);session_start(); session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); session_set_save_handler($handler);
Security Webtechnologie Lennart Herlaar
Inhoud • Security, passwords • Session security, XSS • SQL injection • Input validation, RegExp • Odds & Ends
Be afraid. Be very afraid. • Geen enkel systeem is absoluut veilig • Wat mis kan gaan, wordt uiteindelijk misbruikt • Bedoeld of onbedoeld... • De menselijke factor is het minst stabiel • De gebruiker • De developer • Iemand die naar binnen wil, komt binnen (maar) • Security is een kat-en-muis spel • Security is een vakgebied op zich
De essentie van het probleem • Security protocollen zijn complex • Echte experts zijn zeldzaam (en geen gezellige mensen) • Mensen zijn lui en maken fouten • Besteed genoeg tijd aan de opdrachten, en... • ...maak geen fouten tijdens het tentamen! • Verschil tussen bedoeld en onbedoeld gebruik • Points of view: code is... • ...een implementatie van een algoritme • ...een aantal regels tekst, een verzameling instructies, een rij bytes, een rij nullen en enen, een getal, ...
The Real World • De meeste code is door amateurs geschreven • Unix werd ontwikkeld door studenten, nota bene... • En nu flanst iedereen een website in elkaar... • Er is nauwelijks druk om secure code te schrijven • Time-to-market, concurrentie-overwegingen, tijd=€ • En zolang iedereen troep koopt, kom je ermee weg! • Vulnerability cycle • Ontdekking, exploit, media, hype, patch, welterusten • Buggy patches, ongepatcht, script kiddy tooling • De Wet van Behoud van Ellende "Binnen een gesloten systeem blijft de totale hoeveelheid ellende constant. Als het ene probleem wordt opgelost, zal daardoor het volgende probleem ontstaan."
Is er nog hoop? • Think outside of the box! • Maak geen aannames, bekijk het van een afstand • Lastig, ook als het gaat om het vinden van fouten • En dan nog... • "Security is not an afterthought" • Sommige dingen moet je misschien niet willen • Verbeter de wereld, begin bij jezelf • Ga uit van het slechtste in je medemens
Soorten aanvallen • Operation level attacks • Fysiek, social engineering, default accounts, DDOS, password cracking, phishing, ... • Hangsloten, beleid, verwijdering, controles, ... • Architecture & design level attacks • Race conditions, man-in-the-middle, session hijacking, packet-sniffing, replay attacks, ... • Locking, encryption, session dynamics, ... • Implementation level attacks • Buffer overflows, back doors, parsing errors, ... • Controles, Quality Assurance, input validation, ...
Top 10 risico's volgens OWASP • Open Web Application Security Project, 2010
How it works... • Gebruiker logt in • Session wordt gestart • Ze leefden nog lang en gelukkig? Vrijwel overal ligt misbruik op de loer!
Passwords • Mensen zijn lui en maken fouten...
Passwords • Dus: vaak wijzigen, format afdwingen! • Systemen met elke week een nieuw password... • ...hebben gebruikers met eenvoudige passwords • Systemen die een bepaald format afdwingen... • ...hebben gefrustreerde gebruikers... • ...en overwerkte systeembeheerders • Passwords alleen zijn niet het antwoord • Het systeem is zo kwetsbaar als z'n gebruikers
Passwords • Passwords altijd encrypted/hashed verzenden • En ook encrypted/hashed opslaan • Een hash is niet altijd secure • Dictionary attacks • Replay attacks • En soms is het veel simpeler • Shared hosts in bibliotheken, internet cafés, met... • ...key-loggers, packet-sniffers, spyware, trojans, browsers die passwords onthouden
Passwords • Brute force attacks • Automatische tools om passwords te proberen • Of juist om usernames te proberen... • Lockout • Response time doubling met reset na zekere tijd • Lockout kan het doel zijn • Gebruik een multi-layer access methode (OTP) • Geef feedback over de login geschiedenis • Controleer de "menselijkheid" van de gebruiker