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
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
XAMPP telepítés 60
XAMPP kezdőlap (http://localhost/) 61
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
XAMPP biztonsági beállítások (Security) 63
XAMPP biztonsági beállítások (Security) 64
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