WEBES ALKALMAZÁSFEJLESZTÉS 1. Horváth Győző Egyetemi adjunktus 1117 Budapest, Pázmány Péter sétány 1/C, 2.420 Tel: (1) 372-2500/1816
Tartalom 2
Adatbázis-biztonság Model-View-Controller minta MVC keretrendszerek CodeIgniter
3
Adatbázis-biztonság
Biztonsági szempontok 4
Különböző vetületek Programozás Adminisztrációs Üzemeltetés Munkaszervezés
Különböző rétegek Adatbázis Csatorna Kliens
Biztonsági szempontok 5
Adatbázis Ne
a tulajdonos vagy adminisztrátor nevében kapcsolódjunk Saját felhasználó vagy csoport létrehozása Adatbázis, tábla, mező szintű jogosultságok beállítása Magasabb szintű elemek használata Nézetek Tárolt
eljárások Triggerek Adatok
titkosítása (pl. jelszó)
Biztonsági szempontok 6
Csatorna a szerver és kliens között Hálózati
forgalom titkosítása
Kliens SQL
összeállításának módja
Szövegösszefűzés
(SQL injection)
Paraméterkötés
Adatok Black
ellenőrzése
list White list Megfelelő típusra hozatal Veszélyes karakterek escape-elése
SQL injection 7
Ellenőrizetlen adatok és kevésbé biztonságos SQL előállítási módszerek használata hibához illetéktelen
vezethet
hozzáféréshez
SQL injection 8
Elvárt működés $user = 'alma'; $pwd = 'korte'; $q = "SELECT count(1) from users where userid='" + $user + "' and passwd='" + $pwd + "'; "; $q === "SELECT count(1) from users where userid='alma' and passwd='korte'; "
DE: $user = ''; $pwd = "' or '1'='1"; $q === "SELECT count(1) from users where userid='' and passwd='' or '1'='1'; "
SQL injection 9
//Elvárt mûködés $offset = 10; $q = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"; $q === "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET 10;"; //DE: $offset = "0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres';"; $q === "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET 0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres';;";
SQL injection 10
További példák union
a selectben xp_cmdshell
Linkek http://www.php.net/manual/en/security.database.sql-
injection.php http://www.unixwiz.net/techtips/sql-injection.html http://en.wikipedia.org/wiki/SQL_injection
SQL injection elkerülése 11
Adatok ellenőrzése Speciális karakterek szűrése, escape-elése mysql_real_escape_string()
Összefűzés helyett szövegsablon használata sprintf
Összefűzés helyett adatkötés használata binding
Adatkötés (binding) 12
Adatbázis-kezelőnek támogatnia kell SQL utasításban csak paramétereket tüntetünk fel, nem konkrét értékeket A sablont az adatbázis-kezelő dolgozza fel, készíti elő A paraméterek konkrét értéket kapnak (típusos) Végrehajtás kezdeményezése
Adatkötés (binding) 13
Előnyei Nincs
manuális escape-elés SQL utasítások többszöri futtatása újraértelmezés nélkül Bináris adatok hatékonyabb közlekedtetése Olvashatóbb kód
Hátrányai Egyszer
futó lekérdezéseknél lassabb Általában csak DML-re működik
14
Model-View-Controller minta
Model-View-Controller 16
Modell Alkalmazás
adatai és folyamata Üzleti logika
Nézet Web
design, sablon, HTML, CSS, JavaScript Modell adatait jeleníti meg megfelelően formázva
Vezérlő Folyamatot
irányítja, begyűjti az input adatokat és azokat a modellnek és a nézetnek átadja
MVC architektúra 17
Vezérlő
Modell
Nézet
MVC a weben 18
MVC a weben 19
MVC a weben 20
Modell 21
Üzleti logika Alkalmazás adatai Tárolás,
feldolgozás, absztrahálás
Független a nézettől és a HTTP kérés feldolgozásától Általában
nincs benne HTML és pl. $_GET
Általában adatbázisokkal dolgozik Adatbázis-elérési
absztrakció (réteg) Adatbázis-absztrakció (réteg)
Nézet 22
Megjelenítés HTML,
CSS, JavaScript, XML, PDF, szöveg, kép
Nem tartalmazhat logikát, adatfeldolgozást Sablonnyelv használata PHP alternatív
szintaxis limitált utasításkészlet Smarty,
stb.
PHP mint sablonnyelv (Savant2) 23
require_once 'Savant2.php';
$tpl =& new Savant2(); $tpl->assign('title', 'Colors of the Rainbow'); $tpl->assign('colors', array('red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet')); $tpl->display('rainbow.tpl.php');
title ?> title ?>
colors as $color): ?>
Vezérlő 24
Az MVC minta legáltalánosíthatóbb része Kérés feldolgozása, adatok továbbítása a modellnek és nézetnek Több további részekre bontható bootstrap
file Front Controller Action Controller
MVC előnye 25
Fejlesztési munkafolyamatokat támogatja Három fő szerepkör van egy fejlesztői csapatban Fejlesztők Modellen
dolgoznak (PHP, adatbázis, algritmus, architektúra)
Tervezők Nézeten
dolgoznak (HTML, CSS, JavaScript, grafikus elemek, mockup, stb.)
Integrátorok Vezérlőn
dolgoznak, ők kapcsolják össze a modellt a nézettel, kevésbé képzettek, mint a fejlesztők
26
MVC keretrendszerek
Keretrendszerek 27
bizonyos filozófiának megfelelő szabályok gyűjteménye ahány keretrendszer, annyi féle szabályok korlátokat is jelentenek egységesebb alkalmazásfejlesztés szétválasztott kód és logika meghatározott könyvtárszerkezet csoportmunka támogatott rétegek szétválasztása
MVC-s keretrendszerek 28
Az MVC filozófiájára épülő keretrendszerek Nem egységesek, sokféle megoldás Alkalmazott minták Front egy
MVC
Controller belépési pont
Hogyan válasszunk keretrendszert 29
Architektúra Dokumentáció Közösség Támogatás Rugalmasság
30
CodeIgniter
CodeIgniter 31
PHP MVC keretrendszer http://codeigniter.com Jó dokumentáció: http://codeigniter.com/user_guide/ Egyik legrégebbi PHP MVC keretrendszer Nagy
közösség
Oldal életciklusa 33
Könyvtárszerkezet 34
CodeIgniter URL-ek 35
Szegmens alapú URL kezelés pelda.hu/index.php/class/action/par1/par2 pelda.hu/class/action/par1/par2 .htaccess
beállítás
Keresőbarát forma Könnyű könyvjelzőzni Beszédes RewriteEngine on RewriteCond $1 !^(index\.php|images|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L]
Konfiguráció 36
application/config könyvtárban config.php routes.php database.php autoload.php
Vezérlők 37
pelda.hu/index.php/products/detail/12 application/controllers/products.php Vezérlő egy osztály, amely a CI_Controller-ből származik Alapértelmezések Ha
nincs class, akkor default_controller a config/routes.php-ban $route['default_controller']
Ha
= 'Main';
nincs action, akkor: index
Privát metódusok _-sal kezdődnek: _belso()
Vezérlő 38
class Products extends CI_Controller { public function __construct() { parent::__construct(); //Konstruktor kódja } public function index() { //Alapértelmezett action } public function detail($id) { // $id-jú termék megjelenítése } private function _belso() {
} }
Nézetek 39
application/views könyvtárba Vezérlő tölti be
Több nézet betöltésekor az eredmény összefűzésre kerül Adatokat a nézetnek átadni 2. paraméterként lehet asszociatív tömbként
$this->load->view('detail')
A kulcsból változónevek lesznek a view-ban a megfelelő értékkel
3. paraméterként megadott true értékkel a view eredményét szövegesen vissza lehet kapni
$string = $this->load->view('nezet', '', true);
Nézetek 40
class Products extends CI_Controller { public function index() { $data = array( 'alma' => 'piros', 'korte' => 'kukacos', ); $this->load->view('proba', $data); } }
My Blog Az alma .
A körte .
Modellek 41
application/models könyvtárba Osztály CI_Model-ből származik Osztály
nevének első betűje nagy Fájlnév kisbetűs
Vezérlő tölti be általában $this->load->model('Product_model');
Használata $this->product_model->get_products();
Modellek 42
class Product_model extends CI_Model { function __construct() { parent::__construct(); $this->load->database(); } function get_products() { $query = $this->db->get('products'); return $query->result(); } } class Products extends CI_Controller { public function index() { $this->load->model('Product_model'); $products = $this->procuct_model->get_products(); $this->load->view('proba', array( 'products' => $products, )); } }
Adatbázis használat 43
CodeIgniter tartalmaz egy adatbázis-elérési és adatbázis-absztrakciós réteget Adatbázis-kezelő
független kód írása
Konfiguráció: config/database.php Betöltés: $this->load->database(); Tipikusan a modellben használjuk Automatikus betöltés: config/autoload.php
Lekérdezések 44
$q = $this->db->query('SQL') Adatkötés $this->db->query( 'select * from table where mezo1=? and mezo2=?', array('alma', 12) );
Eredmények $q->result()
$q->result_array()
$query = $this->db->query("SQL"); foreach ($query->result() as $row) { echo $row->mezo1; echo $row->mezo2; }
Active record 46
$this->db->get('table') $this_>db->select() $this_>db->from() stb.
$this_>db->insert('table', array()) $this_>db->update('table', array()) $this_>db->delete('table', array()) array(): kulcs-érték párok
Könyvtárak és segédfüggvények 47
Library $this->load->library(); Form
Validation
Input Email
Helper Form
helper URL helper HTML helper