Ero sivun ”PHP” versioiden välillä

Wikikirjastosta
Poistettu sisältö Lisätty sisältö
Kenkku (keskustelu | muokkaukset)
→‎PHP:n käyttö: siirretty sivulle PHP/Käyttö
Kenkku (keskustelu | muokkaukset)
→‎Tietoturvavinkkejä: siirretty sivulle PHP/Tietoturvavinkkejä
Rivi 50: Rivi 50:




== Tietoturvavinkkejä ==


Tämä kappale käsittelee PHP:n [[tietoturva]]a, ja etenkin sitä, kuinka pystyt tekemään tietoturvallisempaa koodia.

==== Asetukset ====

PHP:n asetuksia säädetään ''php.ini'' -tiedostosta. Tämä määrittelee monia perustason asetuksia, joista osa saattaa olla haitallisia tietoturvan kannalta. Kannattaa kiinnittää huomiota ainakin seuraaviin riveihin:

* ''register_globals''
** Yksi PHP:n vaarallisimmista asetuksista päällä pidettäväksi. Kun ''register globals'' on kytkettynä, voidaan globaaleista taulukoista (kuten $_POST) käyttää muuttujia suoralla nimellä (esimerkiksi lomakkeelta tuleva $_POST['nimi'] löytyy valmiiksi muuttujasta $nimi). Tämä yhdistettynä heikosti tarkastettuun syötteeseen ja tietokantaan antaa mahdollisuuden käyttää tietokantaa vastaan [[haavoittuvuus (tietotekniikka)|haavoittuvuutta]] pelkän osoiterivin avulla (esimerkiksi vanhemmassa PHP:ssä toiminut ''http:://www.foo.bar/index.php?nimi=%27%20%27;%20DROP%20DATABASE%20db'' eli kyselystä tuleekin "SELECT * FROM taulu WHERE nimi = ' '; DROP DATABASE db").
* ''error_reporting''
** Määrittelee virheilmoitusten näyttötason (oletuksena näytetään kaikki paitsi ''E_NOTICE''-luokan virheilmoitukset). Virheilmoitukset kertovat kehittäjälle mikä meni väärin ja missä. Myös huomautukset ovat hyödyllisiä ilmoituksia ehkäisten esimerkiksi ohjelmointivirheiden syntymistä kun muuttujaa, jota ei ole olemassa, käsitellään. Tämän asetuksena kannattaisi olla ''E_ALL'', ja näkyvyyttä kehitysympäristön ja käyttäjille näytettävän ympäristön välillä tulisikin säätää ''error_reporting''-asetuksen avulla.
* ''safe_mode''
** ''Safe mode'' -tila estää palvelimen kannalta kriittisten funktioiden (kuten ''exec'') ajamisen tietyin rajoittein, sekä rajoittaa PHP:n oikeutta käyttää vain omia tiedostoja ja hakemistoja. Monesti tätä ei pidetä päällä (johtuen mm. lähestulkoon mahdottomuudesta luoda hakemistoja), mutta tämän päällä pitääminen lisää tietoturvaa huomattavasti.
* ''magic_quotes_gpc''
** Määrittelee asetetaanko käyttäjiltä tuleviin syötteisiin (GET, POST, COOKIE) automaattisesti karkausmerkit. Tämä on syytä pitää päällä, mutta ohjelmoija ei saisi kuitenkaan liikaa nojautua tämän tuomaan turvallisuuteen. Esimerkiksi MySQL-tietokantaa käytettäessä tämä lisäisi vain lainausmerkkien eteen karkausmerkit, mutta jättäisi huomioimatta MySQL-tietokannan kannalta monia muita kriittisiä merkkejä.
* ''short_open_tag''
** Määrittelee, ovatko lyhyet aloitustagit ("<?") sallittuja. Ei sinänsä liity tietoturvaan, mutta erittäin tärkeä asetus, jos PHP-tiedostoissa aiotaan käyttää XML-pohjaista merkkausta.

==== Koodi ====

* ''Tarkista käyttäjältä tuleva syöte''
** Kun vastaanotat käyttäjältä syötteitä, muista tarkistaa sen sisältö (kokonaisluvut ovat kokonaislukuja, ettei teksti sisällä virheellisiä merkkejä ja niin edelleen) ennemmin kuin käyttäisit syötteitä suoraan. Hyödyllisiä funktioita syötteiden tarkistamiseen ovat esimerkiksi ''is_int, is_float'' sekä tekstisyötteiden varmistamiseen ''addslashes'' ja ''{tietokanta}_real_escape_string'' (tai ''{tietokanta}_escape_string'' mikäli real escape string ei löydy käyttämäsi tietokannan funktioista).
* ''Tarkista muuttujan olemassaolo''
** Ennen muuttujan käyttämistä esimerkiksi ehtolauseessa kannattaa miettiä muuttujan olemassaolon tarkastamista. Tähän hyödyllisiä funktioita ovat ''isset'' ja tyhjän muuttujan hylkäämiseksi ''empty''.
* ''Löyhä vertailu vs. tiukka vertailu''
** Kannattaa miettiä tilanteen mukaan kumpaa käyttää. Jotkut PHP:n funktioista saattavat palauttaa ''FALSE'' tai onnistuneena tuloksena löyhän vertailun ''FALSE''n (esimerkiksi nolla tai tyhjä merkkijono). Käyttämällä tiukkaa vertailua === vertaillaan sekä sisältö että tyyppi.
* ''Näytä virheet vain itsellesi''
** Kun kehität palvelua, pidä virheilmoitukset päällä tasolla ''E_ALL''. Kun teet virheetöntä koodia tällä asetuksella, olet askelta lähempänä tietoturvaa. Käyttäjille suunnatussa palvelussa virheilmoitukset kannattaa pitää myös päällä, mutta piilottaa ne näkyvistä ''error_reporting''-asetuksen avulla. Tämä onnistuu esimerkiksi lisäämällä koodin alkuun ''ini_set("error_reporting", 0);''.
* ''Käytä eval() -funktiota harkiten.''
** Eval on yksi PHP:n mielenkiintoisimpia mutta samalla myös vaarallisimpia funktioita. Eval-funktio '''ei koskaan''' saisi ottaa parametrejaan POST tai GET-muuttujissa annettavista arvoista tai arvoista, johin kuka tahansa käyttäjä pystyy vaikuttamaan. Eval-funktiolla pystytään suorittamaan teoriassa melkein mitä tahansa toimenpiteitä kohdekäyttöjärjestelmässä, joten sen kautta voidaan suorittaa todella vakavia hyökkäyksiä.
* ''Tarkasta huolella system, exec ja shell_exec -komentojen parametrit tai vältä niiden käyttämistä kokonaan''.
** Tähän pätee samat ohjeet kuin eval() -funktioon. Mikäli suoritat shell-komentoja, niiden parametrit eivät koskaan saisi tulla suoraan käyttäjän syöttämistä arvoista, koska ne voivat sisältää piilotettuja shell-komentoja. Muuttujat, jotka ennetaan shell-komentosarjoihin parametreina tulisi käsitellä ''escapeshellcmd()'' ja ''escapeshellarg()'' -funktioilla (johon ei niihinkään pitäisi sokeasti luottaa).
*''Älä luota $HTTP_POST_FILES tai $_FILES -muuttujiin vaan käytä funktioita move_uploaded_file ja is_uploaded_file''
**Näillä voit varmistaa, että siirrettäväksi pyydettävä tiedosto on todellakin kotoisin sen lähettäneeltä käyttäjältä. Pahimmillaan pahansuopainen käyttäjä voi yrittää lähettää virheellisiä tiedostonimiä, esim. /etc/passwd ja näin yrittää huijata järjestelmää siirtämään tärkeitä tietoja sisältäviä tiedostoja hänen itsensä nähtäväksi.


== Taulukot ==
== Taulukot ==

Versio 25. huhtikuuta 2007 kello 13.20

Wikipedia
Wikipedia
Wikipedia-tietosanakirjassa on artikkeli aiheesta:

PHP (lyhenne sanoista PHP: Hypertext Preprocessor) on eräs suosituimmista palvelinpohjaisista skriptikielistä, joka tarkoittaa että koodi käsitellään ennen kuin se näytetään selaimelle, joten koodia ei pysty näkemään sivun lähdekoodista. PHP:tä käytetään dynaamisten internet-sivustojen tekemiseen. Esimerkiksi MediaWiki (ohjelmisto, jota Wikikirjasto käyttää) on tehty PHP-kielellä. PHP on C/C++:n kaltainen kieli, johon on lisätty valtava määrä helpottavia funktioita. Tästä syystä PHP ei ole niin ohjelmakirjastopohjainen (ohjelmakirjasto = engl. "library") kuin C/C++-kieli.

PHP on kehitetty avoimen lähdekoodin projektina. Toiminnaltaan jossain määrin vastaavia tekniikoita ovat esimerkiksi Microsoftin ASP ja Sun Microsystemsin JSP. PHP:n tärkein ero verrattuna avoimen lähdekoodin Perl-skriptikieleen on se, että PHP on suunniteltu nimenomaan web-käyttöön. PHP:stä löytyy myös suoraan tietokantaominaisuudet mm. MySQL:lle, PostgreSQL:lle, ja SQLitelle (PHP 5).

Esimerkki:

<?php
echo "Hei, maailma!"; // Tulostaa tekstin: Hei, maailma!
?>

Tässä oppaassa PHP:n komennot on linkitetty PHP:n omaan käyttöohjeeseen. Se on englanninkielinen, mutta sieltä löytyy jokaiselle komennolle syntaksi ja kattavat käyttöohjeet esimerkein.

Sisältö

  1. Historiaa
  2. Rakenne
  3. Ulkoasu
  4. Kielen perusominaisuudet
    • Perussyntaksi
      • Koodilohkon merkitseminen
      • Lausekkeiden erottelu
      • Kommentointi
    • Muuttujat
    • Muuttujatyypit
      • Taulukot (array)
      • Merkkijonot (string)
        • Muuttujien lisääminen merkkijonoon
    • Operaattorit
    • Muuta huomioitavaa
  5. PHP:n käyttö
    • Luokkakirjastot
    • Tietokannan käyttö
    • Olio-ohjelmointi
  6. Tietoturvavinkkejä
    • Asetukset
    • Koodi









Taulukot

Taulukko on muuttuja, jossa on monia avain/arvo -pareja peräkkäin. Tyhjän taulukon voi luoda näin:

$taulukko = array();

Tyhjää taulukkoa harvemmin tarvitsee, joten luodaan taulukko vaikkapa maista:

$taulukko = array("Suomi", "Viro", "Irkutski");

Taulukossa on nyt kolme arvoa(Suomi, Viro, Irkutski) ja kolme avainta (0, 1, 2), joihin voi viitata seuraavasti:

//tulostaa "Suomi"
echo $taulukko[0];

Avainten numerointi alkaa oletuksena nollasta. Irkutski voitaisiin tulostaa korvaamalla äskeisestä 0 numerolla kaksi. Numeroinnin voi alkaa halutessaan muustakin numerosta. Seuraavassa numerointi aloitetaan numerosta 5, jota seuraa 6 ja 7:

$taulukko = array(5 => "Suomi", "Viro", "Irkutski");

Arvot voidaan myös nimetä, jolloin PHP:n taulukosta tulee muista kielistä tuttu hash-tyyppinen taulukko. Tällöin numerointi ei ole voimassa:

$taulukko = array("lähellä" => "Suomi", "kaukana" => "Viro", "erittäin kaukana" => "Irkutski");
//tulostaa "Viro"
echo $taulukko["kaukana"];

Taulukko voi olla kolmiuloitteinen. Tällöin tarvitaan kaksi avainta arvon löytämiseen.

$taulukko = array("lähistöllä" => array("Suomi" => "suomalaiset", "Viro" => "virolaiset"));
//tulostaa "suomalaiset"
echo $taulukko["lähistöllä"]["Suomi"];

Taulukko voi olla neli- tai viisiuloitteinenkin. Käytännössä sen monimutkaisempia taulukoita ei juuri koskaan tarvitse. Jos ihmettelet miksi, yritäpä piirtää kuusiulotteinen taulukko paperille.

Taulukkoa käytetään yksinkertaistamaan koodia. Esimerkiksi kuukausien nimet on kätevä tallettaa taulukkomuotoon siten, että avain 6 vastaa kesäkuuta ja niin edelleen. Jotkin tietorakenteet olisi vaikea toteuttaa ilman taulukkoa, sillä taulukosta on helppo suorittaa esimerkiksi arvontaa. Funktioille on helppo siirtää monia arvoja kerrallaan taulukkomuodossa. PHP:n monesti käyttämät POST- ja SESSION -muuttujat ovat taulukkoja.

Taulukkoon on helppo sijoittaa tietoa myöhemmin, $taulukko[] = "tieto"; sijoittaa tiedon seuraavaan vapaaseen paikkaan.

Lähteet

Aiheesta muualla