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 ellenőrzése Black 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 hozzáféréshez vezethet
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.sqlinjection.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
18 MVC a weben
19 MVC a weben
20 MVC a weben
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'); <html><head> <title><?php echo $this->title?></title> </head><body> <h1><?php echo $this->title?></h1> <ol> <?php foreach ($this->colors as $color):?> <li><?php echo $color?></li> <?php endforeach;?> </ol> </body></html>
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 Controller egy belépési pont MVC
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
33 Oldal életciklusa
34 Könyvtárszerkezet
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'] = 'Main'; Ha 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 $this->load->view('detail') 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 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); } } <html> <head> <title>my Blog</title> </head> <body> <p>az alma <?php echo $alma;?>.</p> <p>a körte <?php echo $korte;?>.</p> </body> </html>
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
49 Fejlesztői környezet
Fejlesztői környezet részei 50 Szerver oldalon webszerver PHP adatbázis-kezelő Kliens oldalon böngésző Fejlesztői környezet HTML, CSS és PHP szerkesztésére egyaránt alkalmas IDE Adatbázis kliens: adatbázisok elérésére és kezelésére SFTP, SCP kliens az állományok webszerverre töltéséhez
Szerver oldal 51 webprogramozas.inf.elte.hu Felhasználónév: ETRAZON Jelszó: almafa1 SSH klienssel bejelentkezve passwd paranccsal változtatható meg
Webszerver 52 Apache 2 Dokumentumok gyökérkönyvtára: http://webprogramozas.inf.elte.hu/~etrazon/ Ez a szerveren a következő mappa: ~/public_html/
PHP 53 Modulként telepítve nem processként, hanem threadként fut phpinfo()
Adatbázis-kezelő 54 MySQL webprogramozas.inf.elte.hu Csak localhostból érhető el Felhasználónév: neptun Jelszó: almafa1 Adatbázis: neptun
Böngésző 55 Bármelyik kurrens böngésző választható Kényelmesen és gyorsan lehessen fejlesztésre használni Kiegészítő modulok: http figyelése, validátorok Fejlesztőeszközök Forrás színezése Keresés a forrásban is Sütik, képek kezelése Funkciók letiltása Gyorsítótár ürítése
IDE 56 Kényelmi funkciók PHP, HTML és CSS szerkesztése szintaxis alapján színezés kódkiegészítés blokkok jelölése, össszecsukása behúzások intelligens kezelése nyomkövetés támogatása utasítások szignatúrája, leírása projektek kezelése állományok szerverre feltöltése verziókövető rendszerek integrálása kódrészletek definiálása pluginek kezelése Notepad++ Netbeans IDE Eclipse Aptana
Adatbázis kliensek 57 Sokféle funkciót kell ellátnunk Felhasználók és jogosultságok kezelése Táblák, nézetek, tárolt eljárások kezelése Adminisztrációs teendők Kliensek parancssori kliensek: mysql, mysql_dump, stb webes kliens: phpmyadmin asztali kliens: MySQL Workbench
SFTP, SCP kliensek 58 WinScp FileZilla Néhány IDE ezt automatikusan megteszi
Otthoni fejlesztéshez 59 XAMPP telepítőcsomag http://www.apachefriends.org/en/xampp.html Multiplatform XAMPP 1.7.3 tartalmazza Apache 2.2.14 (IPv6 enabled) + OpenSSL 0.9.8l MySQL 5.1.41 + PBXT engine PHP 5.3.1 phpmyadmin 3.2.4 Perl 5.10.1 FileZilla FTP Server 0.9.33 Mercury Mail Transport System 4.72
60 XAMPP telepítés
61 XAMPP kezdőlap (http://localhost/)
XAMPP Biztonsági figyelmeztetés 62 A feltelepült rendszerben A MYSQL adminisztrátornak nincs jelszó beállítva MYSQL démon a hálózaton elérhető phpmyadmin elérhető a hálózaton A XAMPP kezdőlap elérhető a hálózaton A Mercury és FileZilla alkalmazások alapértelmezett felhasználói adatai ismertek Ha nyilvános webszervert készítünk, akkor biztonságossá kell tenni
63 XAMPP biztonsági beállítások (Security)
64 XAMPP biztonsági beállítások (Security)
XAMPP portable 65 Nem kell telepíteni, pendriveról is működik Lépések Mappa létrehozása XAMPP ZIP változatának letöltése, kitömörítése a mappába setup_xampp.bat elindítása xampp-control.exe elindítása és a vezérlőpulton elindítható a kívánt szolgáltatás