Viikkotehtävä 8 ja välimuistit - Luento 18
Käsitellään edellinen viikkotehtävä ja tutkitaan Googlen Ajax-rajapintoja ja välimuistiratkaisuja. Käydään läpi perusteita PHP:n tietoturvasta.
Luentotaltiointi
- sovellukset18.avi 204M
- sovellukset18.mp3 17M
- sovellukset18.wmv 61M
Viikkotehtävä 8
Huomioita:
- ajax-pyynnön parametrit pitää muistaa koodata (escape)
- 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ä
AJAX API
Myös AJAX:in päälle voidaan rakentaa "etäkutsupalveluja". Esim. Google Maps API:
Muita hyödyllisiä:
Curl
CURL (Client URL) on PHP:hen sisäänrakennettu kirjasto, jonka avulla voidaan luoda kaikenlaisia HTTP-pyyntöjä. CURL:in avulla voidaan luoda siis eräänlainen WWW-selain "sivun sisälle".
Esim. luodaan kaavio ulkopuolisesta palvelusta saadusta XML-datasta. Kaaviota ei ole kuitenkaan järkevä luoda jokaisella haulla uudestaan mikäli alkuperäinen XML-data ei ole muuttunut. Käytetään siis välimuistissa olevaa kaaviota.
- curl.php
- weather.xml - kuvitteellisessa palvelussa oleva säätieto, joka muuttuu vain aika-ajoin
- kaavio.png - tiedosto "välimuistissa"
- Libchart-kirjasto
Kaavion voisi upottaa siis XHTML- tai PHP-dokumenttiin img-elementillä:
<p><img src="curl.php" alt="Säätilakaavio" /></p>
vertaa: Google chart
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