Ero sivun ”PHP” versioiden välillä

Wikikirjastosta
Poistettu sisältö Lisätty sisältö
Kenkku (keskustelu | muokkaukset)
→‎Rakenne: siirretty sivulle PHP/Rakenne
Kenkku (keskustelu | muokkaukset)
→‎Ulkoasu: siirretty sivulle PHP/Ulkoasu
Rivi 44: Rivi 44:




== Ulkoasu ==


PHP-koodin ulkoasusta kannattaa tehdä melko yksinkertainen ja selkeä. Rivinvaihdoilla ja muilla samantyyppisillä ole koodin toimivuuden kannalta merkitystä, mutta niitä oikeinkäytettynä saadaan aikaan selkeää ja nopeasti omaksuttavaa koodia.

Jos katsot seuraavaa esimerkkiä, huomaat, että jokainen ohjelmalause loppuu puolipisteeseen ; ja merkkijonot ympäröidään heittomerkeillä (<nowiki>''</nowiki>). Myös lainausmerkkien ("") käyttö on mahdollista.

Kommentit, joita tulkki ei ota huomioon suorittaessa, kirjoitetaan joko //-merkin jälkeen samalle riville tai /*- ja */-merkkien väliin. Kommentteja kannattaa käyttää viimeistään silloin, kun koodista on tulossa monimutkaista ja pitkää. Ne auttavat nopeasti omaksumaan koodin uudelleen ja myös ulkopuolisten on helpompi ymmärtää toisten kirjoittamaa koodia, jos se on järkevästi kommentoitu.

Seuraava esimerkki tuottaa täysin samanlaisen tuloksen kuin aikaisempi, mutta koodin ulkoasua on vain muutettu:

<?php
/*Seuraava
ohjelmalause
tulostaa
tekstiä */
{{phpkomento2|echo}} 'Hei, maailma!'; // Tulostaa tekstin: Hei, maailma!
?>

Oikeasti edellisen kaltainen kommentointi ei ole järkevää, mutta hieman vaativammissa sovelluksissa kommentteja kannattaa toki käyttää.


== Kielen perusominaisuudet ==
== Kielen perusominaisuudet ==

Versio 25. huhtikuuta 2007 kello 13.17

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






Kielen perusominaisuudet

Jokaisella ohjelmointikielellä on omat perusominaisuutensa. Tämä kappale käsittelee PHP:n perusominaisuuksia kuten perussyntaksia, muuttujatyyppejä, muuttujia ja operaattoreita. Aivan lopusta löytyy vielä muuta huomioitavaa joka käsittelee yleisiä kohtia kielen perusominaisuuksista.

Perussyntaksi

Perussyntaksi eli koodin kielioppi määrittelee, miten kielelle kerrotaan tulkittavat lausekkeet, ja missä muodossa ne kerrotaan.

Koodilohkon merkitseminen

  1. Suositeltu tapa merkitä koodilohkon alku ja loppu on <?php ja ?> (niin kutsuttu pitkä aloitustagi). Tämä tapa on turvallisin siinä mielessä, että se ei sekoitu esimerkiksi XHTML-määrityksen <? -aloitukseen, joka aiheuttaa monille aloitteleville PHP-koodaajille päänvaivaa luomalla virheen PHP:n tulkkauksessa.
  2. On myös mahdollista käyttää lyhyttä aloitustagia <? ja ?>(short_open_tag). Tässä on kuitenkin riskinä se, että PHP:n ulkopuolella tulostettava XHTML-määritys aiheuttaa PHP-tulkille virheen. Vaikka PHP:ssa on määritelty short_open_tag-asetus on-tilaan oletuksena, ovat useat palvelimet poistaneet tämän ominaisuuden käytöstä.
  3. Tarvittaessa voidaan käyttää myös script-aloitustagia. Tässä haittapuolena on se, että PHP:n sisällä tulostettava </script> saattaa aiheuttaa virheellisesti toimivaa koodia.
  4. ASP:n aloitustagi on niin ikään hyväksyttyjen aloitustagien listalla. Tällöin ASP:n ja PHP:n yhteiskäyttö ei ole kuitenkaan mahdollista.


Esimerkkejä erilaisista koodilohkon merkintätavoista:

<!-- Pitkä aloitustagi, suositeltu tapa -->
<?php echo '<p>Tässä on PHP-tulkin tuottama teksti.</p>'; ?>

<!-- Lyhyt aloitustagi, saattaa aiheuttaa ongelmia etenkin XHTML-sivujen kanssa -->
<? echo '<p>Tässä on PHP-tulkin tuottama teksti.</p>'; ?>

<!-- script-aloitustagi, niin ikään ongelmainen etenkin tulostettaessa script-lohkoja PHP:n sisällä -->
<script language="php">
echo '<p>Tässä on PHP-tulkin tuottama teksti.</p>';
</script>

<!-- ASP-tyylinen aloitustagi, estää ASP:n ja PHP:n yhteiskäytön -->
<% echo '<p>Tässä on PHP-tulkin tuottama teksti.</p>'; %>

Lausekkeiden erottelu

PHP:ssa, samoin kuin C:ssa tai Perlissa, lauseet erotetaan toisistaan puolipisteen (;) avulla. Käytännössä tämä useimmiten tarkoittaa, että koodin rivit on päätettävä puolipisteeseen. Koodilohkon viimeistä riviä ei kuitenkaan välttämättä tarvitse sulkea, vaan PHP luo automaattisesti ennen lopetustagia puolipisteen.

Esimerkkejä tavoista sulkea lauseke

<?php
echo "Hei, maailma!";
?>

<?php echo "Hei, maailma!"; ?>

<?php
echo "Hei, maailma!"
?>

<?php echo "Hei, maailma!" ?>

PHP-tulkki jättää kommenttien lisäksi huomioimatta puolipisteellä suljetut tyhjät (ei mitään tai vain tulostumattomia merkkejä sisältävät) rivit.

Kommentointi

PHP tukee useita erilaisia kommentointityyppejä, niin yksirivisiä kuin monirivisiäkin.

Esimerkkejä erilaisista kommentointityyleistä

<?php

// Tämä on tavanomaisin tapa kommentoida yksirivisenä kommenttina
echo "Hei "; // Myös lausekkeen lopussa

# Myös shell-tyylinen kommentointi on mahdollista
echo "maailma!"; # Myös lausekkeen lopussa

/* Tämä on
   monirivinen
   \\\/// kommentti
   joka ***
   päättyy vasta
   lopetusmerkkiin */

?>

Kommenttien käyttötarkoituksina on:

  1. Pitkien koodien avaaminen ja selkeyttäminen kertomalla mitä koodi kulloinkin "tekee"
  2. Eri osa-alueiden erottelu visuaalisesti
  3. Koodilohkojen ja yksittäisten lausekkeiden käytöstä poisto
  4. Skriptin kehittelijöiden mainitseminen skriptin alussa

Tulkattaessa PHP:tä tulkki jättää huomioimatta kommentit, eikä kommentointi juuri lainkaan hidasta suoritusta.

Muuttujatyypit

Suomenkielinen nimi * Englanninkielinen nimi Tyyppimuunnos ** Esimerkki
Skaalautuvat muuttujatyypit
totuusarvo boolean bool, boolean
TRUE, FALSE
kokonaisluku integer int, integer
123, +123, -123, 0123, 0x1A, 2147483647
liukuluku float, double float, double, real
1.23, +1.23, -1.23, 1.2e3, 7E-10
merkkijono *** string string
'Hei, maailma!', "Hei, maailma!"
Yhdistelmämuuttujatyypit
taulukko array array
array ("yksi", "kaksi", "kolme", 1, 1.23)
objekti object object
-
Erikoismuuttujatyypit
resurssi resource -
-
tyhjä NULL -
-
Pseudomuuttujatyypit
- mixed -
-
numeraali number -
-
- callback -
-

* vain suomen kielessä vakiintuneet termit
** lyhenteet joita käytetään tyyppimuunnoksissa
*** katso myös heredoc-syntaksi

Muuttujat

Muuttujia käytetään tallentamaan tietoa, joka saadaan joko itse koodista, tietokannasta, käyttäjältä tai vaikkapa palvelimelta. Muuttujien käyttö ja hallinta on PHP:ssä moniin muihin ohjelmointikieliin verrattuna yksinkertaista siksi, että niiden tyyppiä ei tarvitse itse määrittää vaan se päätellään automaattisesti muuttujalle annetusta arvosta. Muuttujalle pitää kuitenkin antaa arvo ennen kuin sitä voidaan käyttää muualla koodissa.

Muuttuja merkitään dollarimerkillä $ ja tunnisteella, jossa sallittuja merkkejä ovat ovat kirjaimet A–Z sekä ASCII-merkistön merkit 127 – 255 (sisältäen skandinaaviset sekä yleisimmät eurooppalaiset merkit), alaviiva _ ja numerot 0–9. Muuttujan nimi (dollarin $ jälkeinen osa) ei kuitenkaan voi alkaa numerolla. Muuttujat ovat myös kirjainkokoriippuvaisia, jolloin muuttuja $heimaailma on eri muuttuja kuin $HeiMaailma. Järkevintä on luonnollisesti valita muuttujan tunnisteeksi sen tehtävää kuvaava nimi.

Muuttujien lisääminen merkkijonoon

Seuraavassa esimerkissä tehdään sama toimenpide kuin kahdessa aikaisemmassa koodissa, mutta nyt käytetään hyväksi muuttujia:

<?php
$tervehdys = 'Hei, maailma!'; // Tallennetaan teksti muuttujaan
echo $tervehdys; // Käytetään äskettäin luotua muuttujaa ja tulostetaan sen sisältämä teksti
?>

Jos muuttuja halutaan sijoittaa suoraan toisen merkkijonon sisään, voidaan menetellä kahdella tavalla.

Ensimmäisessä esimerkissä muuttuja lisätään ketjutusoperaattorilla, joka liittää merkkijonot yhteen. Ketjutusoperaattoria voi käyttää sekä lainausmerkkien, että heittomerkkien kanssa:

<?php
$käyntikerrat = 3; // Tallennetaan luku muuttujaan. Huomaa, että ääkkösien käyttö on sallittu php:ssa
echo "Hei, olet käynyt täällä" . $käyntikerrat . "kertaa."; // Hei, olet käynyt täällä 3 kertaa.
echo 'Hei, olet käynyt täällä' . $käyntikerrat . 'kertaa.'; // Hei, olet käynyt täällä 3 kertaa.
?>

Muuttujan voi liittää lainausmerkkejä käytettäessä myös suoraan merkkijonoon:

<?php
$käyntikerrat = 3; // Tallennetaan luku muuttujaan. Huomaa, että ääkkösien käyttö on sallittu php:ssa
echo "Hei, olet käynyt täällä {$käyntikerrat} kertaa."; // Hei, olet käynyt täällä 3 kertaa.
echo "Hei, olet käynyt täällä ${käyntikerrat} kertaa."; // Hei, olet käynyt täällä 3 kertaa.
echo "Hei, olet käynyt täällä $käyntikerrat kertaa."; // Hei, olet käynyt täällä 3 kertaa.
?>

Kun käytetään heittomerkkejä, ei merkkijonon sisällä voi käyttää muuttujia:

<?php
$käyntikerrat = 3; // Tallennetaan luku muuttujaan. Huomaa, että ääkkösien käyttö on sallittu muuttujien nimessä
echo 'Hei, olet käynyt täällä {$käyntikerrat} kertaa.'; // Hei, olet käynyt täällä {$käyntikerrat} kertaa.
?>

Operaattorit

Operaattori Suomenkielinen nimi Englanninkielinen nimi Esimerkki
Matemaattiset operaattorit
+ yhteenlasku addition
$a = 5 + 3;
- vähennyslasku subtraction
$a = 5 - 3;
* kertolasku multiplication
$a = 5 * 3;
/ jakolasku division
$a = 5 / 3;
% jakojäännös modulus
$a = 5 % 3;
Sijoitusoperaattorit
= sijoita assign
$a = 5;
+= lisää ja sijoita add and assign
$a += 5; /* vastaa */ $a = $a + 5;
-= vähennä ja sijoita subtract and assign
$a -= 5; /* vastaa */ $a = $a - 5;
*= kerro ja sijoita multiple and assign
$a *= 5; /* vastaa */ $a = $a * 5;
/= jaa ja sijoita divine and assign
$a /= 5; /* vastaa */ $a = $a / 5;
%= jakojäännös sijoitettavasta modulus from assign
$a %= 5; /* vastaa */ $a = $a % 5;
Vertailuoperaattorit
== löyhä vertailu loose comparison
$a == 5
=== tiukka vertailu strict comparison
$a === 5
> suurempi kuin greater than
$a > 5
< pienempi kuin less than
$a < 5
>= suurempi tai yhtä suuri kuin greater or equal to
$a >= 5 /* vastaa */ $a > 5 || $a == 5
<= pienempi tai yhtä suuri kuin less or equal to
$a <= 5 /* vastaa */ $a < 5 || $a == 5
<>, != erisuuri kuin different than
$a <> 5 /* vastaa */ $a < 5 || $a > 5
!== erisuuri tai eri tyyppiä kuin different or different type than
$a !== 5
? : vertaileva sijoitus ternary
$a = $a < 5 ? 0 : 10;
Loogiset operaattorit
AND, && ja and
$a == 5 && $a != 10
OR, || tai or
$a == 5 || $a != 10
XOR poissulkeva tai xor
$a == 5 XOR $a != 10

Muuta huomioitavaa

  1. PHP on heikosti tyypitetty kieli. Tämä tarkoittaa sitä, että muuttujia ei tarvitse esitellä ennen käyttöä (vaikka tämä aiheuttaakin PHP:n virheenhallintajärjestelmässä huomautuksen (E_NOTICE), ja on hyvin epäsuositeltavaa), ja muuttuja voi vaihtaa tyyppiä kesken skriptin suorituksen.
  2. Muuttujatyyppiä ei tarvitse eikä saa erikseen määritellä. PHP valitsee itse muuttujatyypin, joka sopii muuttujaan sijoitettavaan arvoon. Tarvittaessa PHP automaattisesti muuttaa muuttujatyypin (esim. lisättäessä kokonaislukuun liukuluku). Tarvittaessa muuttujille voidaan kuitenkin suorittaa tyyppimuunnos, joka tekee muuttujasta valitun tyyppisen.
  3. Kielen perusominaisuuksiin kuuluu heterogeeninen taulukko. Tällöin taulukko voi sisältää useita erityyppisiä muuttujia alkioissaan.

Esimerkkejä muista huomioista:

<?php

$luku = "Luku on: "; // muuttuja $luku on nyt merkkijono (string)
echo $luku;

$luku = 256;         // muuttuja $luku vaihtuu kokonaisluvuksi
echo $luku;

// Lopputulos olisi: "Luku on: 256"

// Heterogeeninen taulukko
$taulukko = array (
    1,                                  // Kokonaisluku
    2.22,                               // Liukuluku
    "1 ja 2.22 ovat taulukon alkioita", // Merkkijono
);

?>

PHP:n käyttö

PHP rakentuu hyvin pitkälle valmiin luokkakirjaston käyttöön. Luokkakirjasto tukee useita eri alueita kuten HTTP-protokollaa, useiden eri luettelo tiedostopäätteistä|tiedostotyyppien]] muokkausta, tietokannan hallintaa sekä paljon muuta. Kappaleen lopussa löytyvistä tietoturvavinkeistä saat hyödyllisiä vihjeitä turvallisten asetusten sekä koodauskäytäntöjen osalta.

PHP:hen kuuluvat luokkakirjastot

PHP sisältää itsessään suuren joukon valmiita luokkakirjastoja muun muassa tiedostojen, tietokantayhteyksien sekä erilaisten merkkijono- ja päivämäärätoimintojen suorittamiseksi. PHP on versiosta 3 lähtien tukenut kolmansien osapuolien ohjelmointirajapintoja, ja tämän ansiosta PHP:n luokkakirjastot ovatkin määrällisesti lisääntyneet kymmenistä luokkakirjastoista satoihin luokkakirjastoihin.

Tietokannan käyttö

PHP on tukenut versiosta neljä lähtien kolmansien osapuolien ohjelmointirajapintoja. Tämä on mahdollistanut laajan tuen eri tietokannoille ja niiden tehokkaalle hyödyntämiselle.

Tietokantakohtaiset luokkakirjastot

Tietokantakohtaiset luokkakirjastot tarjoavat laajan tuen tietokannan käyttämiseksi. Tuettuina tietokantoina ovat muun muassa MySQL, PostgreSQL, SQLite ja Oracle.

ODBC

Monikäyttöinen ODBC-luokkakirjasto tarjoaa yhtenäisen rajapinnan muun muassa Adabas D, IBM DB2, iODBC, Solid, ja Sybase SQL Anywhere tietokantoihin. Kun tarvitaan joustavuutta ja mahdollisuutta siirtyä tietokannasta toiseen, on ODBC:n käyttö suositeltavaa.

Olio-ohjelmointi

Ennen versiota kolme PHP ei sisältänyt mahdollisuutta olio-ohjelmointiin. PHP 3 sisälsi hyvin minimaalisen tuen olio-ohjelmoinnille, ja sama semantiikka tuli käyttöön myös PHP 4:ssä.

Kuitenkin PHP 5:stä lähtien olio-ohjelmointi on ollut lähestulkoon täydellisesti tuettuna. Ominaisuudet, jotka tulivat PHP:hen mukaan vitosversiossa, ovat seuraavat:

  • Uusi oliomalli
    • Uudessa oliomallissa PHP käsittelee oliota resursseista tutuilla viittauksilla, kun aikaisemmin käsittelytapa oli enemmänkin primitiivimuuttujan (kuten kokonaisluvun tai merkkijonon) tyylinen. Etuna tässä on se, että nykyisin koko oliota ei tarvitse kopioida lähetettäessä sitä muuttujalle tai metodille, ja olion eri osa-alueiden käsittely nopeutuu sekä helpottuu.
  • Yksityinen- ja suojattu-määritykset muuttujille ja metodeille
    • Aikaisemmin PHP ei ole tukenut kuin julkisen luokan määrityksiä.
  • Abstraktit luokat ja metodit
    • PHP 5 sisältää myös tuen abstrakteille luokille ja metodeille. Mikäli olio sisältää abstrakteja metodeja, tulee sen olla myös abstrakti luokka.
  • Käyttöliittymät
    • Luokkaan voidaan sisällyttää omavaltainen luettelo käyttöliittymistä.
  • Olion monistaminen (kloonaus)
    • Kun luodaan kopiota oliosta avainsanalla clone, suoritetaan olion __clone() mikäli sellainen löytyy.
  • Yhdenmukaistettu muodostin sekä tuhoamismenetelmä
    • Aikaisemmissa PHP:n versioissa muodostin (constructor) on toteutettu luokan nimen metodilla. Uusi, yhdenmukaistettu tapa on __construct().
    • PHP ei ole ennen versiota viisi tukenut luokan tuhoamista (destructor)-metodin avulla. PHP 5 käynnistää __destructor() -metodin mikäli viimeinen viittaus olioon tuhotaan. Luokan tuhoaminen vapauttaa muistin ja suorittaa muut metodille määritellyt tehtävät.
  • Poikkeuskäsittelijät
    • PHP 5 sisältää poikkeuskäsittelijät (exception handling) olioille.

Tietoturvavinkkejä

Tämä kappale käsittelee PHP:n tietoturvaa, 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 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 FALSEn (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

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