Viikkotehtävä 8 ja templatet - Luento 18
Käsitellään edellinen viikkotehtävä ja tutkitaan PHP:n template-mahdollisuuksia. Pohditaan millä tavalla kaikille sivuistoille yhteiset osat voidaan koota yhteen paikkaan. Käydään läpi perusteita PHP:n tietoturvasta.
Luentotaltiointi
- sovellukset18.wmv 54M
- sovellukset18.mp3 16M
- sovellukset18_xvid.avi 113M
Viikkotehtävä 8
Huomioita:
- Merkistöt ja AJAX
- Button formin sisällä ja submit-tapahtuman esto
- Etu: enterilläkin voi hakea!
- Miksi vaikeasti kysymysmerkkejä eikä ID:eitä suoraan SQL:ään?
- PHP:lla on tuotettava validia XHTML:ää (pienet tagien kirjaimet ja yksiosaisten elementtien kauttaviivat yms.).
bindParam-ongelmat:- Sitominen parametrijärjestyksessä
- Sitominen muuttujaan
- LIKE-operaattori ja %-merkki SQL:ssä
DOM ja namespacet
DOMDocument->getElementsByTagNameNS
Templatet
Yhtenäisen sivusto eri sivuilla on usein samankaltaisia osia, jotka joudutaan jokaisella sivulla liittämään includella tai copy&pastella jokaiselle sivulle. Näitä osia ovat esimerkiksi navigoinnit ja autentikoinnista huolehtiminen. Entäpä jos joltain sivulta tärkeitä käyttäjätarkistus unohtuukin?
Templateilla (eli sivupohjilla) saavutetaan seuraavia etuja:
- Yhteiset osat kootaan samaan paikkaan
- Yhteiset osat liitetään automaattisesti sivulle
- Sivun tekijän tarvitsee keskittyä ainoastaan sisältöosaan
- Voidaan myös pyrkiä erottamaan ohjelmalogiikka esitystavasta.
- Erotetaan SQL:t ja ohjelmakoodit muualle
- Sivun sisällön, ulkoasun ja bisneslogiikan tuottajat voivat tehdä työtä erikseen
- Ei kannata kuitenkaan pyörää keksiä uudelleen - näiden välillä on aina jonkinlaisia kytköksiä
Template-esimerkki
Tehdään users.jyu.fi:ssä toimiva template-esimerkki ilman erilliskirjastoja käyttäen Apache handlereita:
Template-ongelmia
Alikansioissa sijaitsevien dokumenttien käsittely pitää tehdä seuraavalla tavalla tai toinen vaihtoehto on kirjoittaa käsittelijään kaikki tiedostoviittaukset absoluuttisilla poluilla ja aina siirtyä käsiteltävän tiedoston kansioon.
// polku käsiteltävään tiedostoon
$file = $_SERVER["PATH_TRANSLATED"];
// oletuspolku (käsittelijän polku)
$sijainti = getcwd();
// suhteellinen polku käsiteltävään _kansioon_
$suhtpolku = ereg_replace("/home(.*)/html/", "../", $file);
// siirrytään kansioon ennen tiedoston käsittelyä
// koska muuten kaikki suhteelliset operaatiot
// toimivat väärin
chdir($suhtpolku);
include($file);
// palataan oletuspaikkaan
chdir($sijainti);
// oletuspaikkaan ei tarvi palata jos käsittelijän omat
// tiedosto-operaatiot tehdään absoluuttisilla poluilla
// vrt "pohja.xml" vs. "/omaHOMEpolku/html/sovellukset/handlers/pohja.xml"
Huomaa kuitenkin, että sivun Javascript-viitteet toimivat normaalisti suhteessa selaimen pyytämään hakemistoon, koska Javascript-tiedostojen haku tapahtuu selaimen toimesta.
Jos template ei toimi XHTML-tiedostojen kanssa, niin vika piilee luultavasti XHTML-dokumenttien xml-deklaraatioissa joita php-tulkki kuvittelee php:ksi. Käytä siis readfile-funktiota html-tiedostoille include-funktion sijaan. toinen vaihtoehto on laittaa .htaccessiin rivi:
php_flag short_open_tag off
Ei voida asettaa valitettavasti users.jyu.fi:ssä, antaa Server Erroria.
Valmiita template-järjestelmiä
PHP:lle on kirjoitettu useita valmiita template-järjestelmiä, jotka helpottavat sivuston luomista ja ylläpitoa. Kts.
Lisätietoa
Välimuistit
Välimuistit ovat väliaikaista tallennustilaa, johon WWW-sivu tallennetaan ja josta se voidaan uudelleen ladata. Välimuisteista on hyötyä, koska ne
- Nopeuttavat sivun latautumista
- Vähentävät tietoliikennekaistan kulutusta
Välimuisteja voidaan hyödyntää seuraavasti
- Selaimen ja välityspalvelimen (proxy) välimuistit
- Annetaan sopivat HTTP-vasteessa sopivat otsikkotiedot niin, että sivu tallentuu välimuistiin ja latautuu sieltä
- Cache-control, Last-Modified, Expires ja If-Modified-Since
- Palvelimen sivuvälimuisti
- Aina ei kannata luoda PHP-sivua dynaamisesti uudelleen vaan tallentaa luodun XHTML-version ja tarjoaa sitä
- Yksinkertaisimmillaan voidaan määrittää päivitysaikaväli, jolloin sivu luodaan uudestaan
- Paremmissa ratkaisuissa voitaisiin tutkia esimerkiksi tiedostojen tai tietokantataulujen muutoksia (tutkiminenkin vaatii jonkin verran palvelimelta!)
Cache-esimerkkejä
Templatet cachetuksella:
Lisätietoa
- Conditional GET
- Caching with PHP - W3C Mobile Web Initiative
- http_conditional_get_for_rss_hackers
- Cache
- HTTP
- Nopeaa cachea
- Conditional GET
Tietoturva
Muutamia käytännön perustietoturvapointteja:
- Request-parametrit
- Älä upota koskaan suoraan sivulle!
- Aja esim. htmlentities
- Tarkista myös esim. ettei JavaScriptiä voida upottaa sivullesi.
- SQL Injection
- stripslashes, *_escape_string
- tai paremmin: $sql->prepare
- exec - varo!
- Älä luota JavaScript-validointiin.
- Älä upota koskaan suoraan sivulle!
- Käyttäjätunnistus
- Kannattaa tehdä keskitysti esim. template-käsittelijässä, jolloin ei
ole vaaraa, että joltain sivulta jää
include("tunnistus.php");kirjoittamatta. - Sessiotunniste voidaan kaapata verkkoliikenteestä! Yhteys on salattava ennenkuin todella voidaan luottaa käyttäjän tunnistamiseen.
- Kannattaa tehdä keskitysti esim. template-käsittelijässä, jolloin ei
ole vaaraa, että joltain sivulta jää
- Salasanasuojaus
- Turvaton yksistään!
- Onnistuu Apachen
.htaccess-direktiiveillä tai PHP:ssa erikseen
- Palvelimen tietoturva
- Rajoitetaan palvelintunnuksen kirjoitus- ja suoritusoikeudet tiettyihin hakemistoihin.
- Rajoitetaan palvelimen tiettyihin hakemistoihin pääsyä esim. IP:n perusteella
- Kaikki palvelimen toimintaan ja salasanoihin liittyvät jutut kannattaa sijoittaa sellaiseen hakemistoon mihin webin käyttäjällä (palvelintunnuksella) ei ole oikeuksia.
- PHP:n
error_reportingvoi kertoa kriittisiä palvelun kannalta olennaisia toimintoja! Kytke se pois, kun kehitystyö on valmis. Parasta olisi, jos käytössä on erillinen kehityspalvelin ja toinen tuotantokäytössä oleva. - PHP:n asetuksissa on ns.
safe_mode-tila, joka estää muiden kuin PHP-skriptin luoneen käyttäjän omistamien tiedostojen avaamisen
- HTTPS
- Palvelin hoitaa, kun sopivat asetukset on kunnossa
- Apache SSL/TLS Encryption
- Tietokannat
- Tietokantayhteyden salaus
- Tietokannan käyttöoikeudet
- Salasanojen suojaus, esim. md5 tai sha1.
Ei kannata kuitenkaan luottaa pelkkään tunnisteeseen, sillä
- Entä jos joku varastaa md5-tunnisteen verkkoliikenteestä tai tietokannasta? Salasanan voi saada selville vertaamalla md5-summaa sanastoista luotujen yhdistelmien md5-summiin.
- Suolaus: tallennetaan tietokantaan $satunnaisnro, md5($satunnaisnumero.$salasana). Tämä hidastaa salasanojen murtamista sanastojen avulla ja erottaa samat salasanat toisistaan.
- Edelleen tietokannalle ja skriptille voidaan määrittää esimääritelty tunniste, jonka avulla voidaan sotkea verkkoliikenteessä kulkevaa tietoa md5-summista.
- Parasta on kuitenkin salata SSL:llä tms. kaikkien koneiden väliset verkkoyhteydet.
Lisätietoa:


Käyttäjien kommentit