Ero sivun ”PHP” versioiden välillä

Poistettu sisältö Lisätty sisältö
p kooditagit
kamaa Wikipedian artikkelista
Rivi 17:
* PHP 4.0 julkaistiin toukokuussa 2000
* PHP 5.0 julkaistiin 14.7.2004
 
 
 
 
 
 
== Rakenne ==
Rivi 42 ⟶ 47:
Oikeasti edellisen kaltainen kommentointi ei ole järkevää, mutta hieman vaativammissa sovelluksissa kommentteja kannattaa toki käyttää.
 
== Perustoimenpiteet ==
 
PHP:ssä on monia näppäriä toimenpiteitä merkkijonojen ja lukujen käsittelyä varten. Seuraava esimerkki esittelee niistä muutamia:
<?php
{{phpkomento2|echo}} "Hei, maailma!"; // Hei, maailma!
echo "Hei," . "maailma!"; // Hei, maailma! (Pisteen avulla voidaan yhdistää merkkijonoja yhteen)
echo 3 + 5; // 8 (Huomaa, että lukuja, joita ei ole tarkoitus käsitellä merkkijonoina, ei ympäröidä heitto- eikä lainausmerkeillä)
echo "3" . "5"; // 35
echo 5 - 3; // 2
echo 3 * 5; // 15 (Kertolasku)
echo 10 / 2; // 5 (Jakolasku)
echo 20 % 3; // 2 (Jakojäännös)
echo (3 + 5) * 10; // 80 (Termejä voi olla useampiakin. PHP osaa oikean laskujärjestyksen.)
?>
 
== Kielen perusominaisuudet ==
== Muuttujat ==
 
Jokaisella ohjelmointikielellä on omat perusominaisuutensa. Tämä kappale käsittelee PHP:n perusominaisuuksia kuten ''[[#Perussyntaksi|perussyntaksia]], [[#Muuttujatyypit|muuttujatyyppejä]], [[#Muuttujat|muuttujia]]'' ja ''[[#Operaattorit|operaattoreita]]''. Aivan lopusta löytyy vielä ''[[#Muuta huomioitavaa|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 ====
 
# Suositeltu <ref>{{Verkkoviite | Tekijä=PHP | Nimeke=PHP manuaali: perussyntaksi | Osoite=http://www.php.net/manual/en/language.basic-syntax.php | Julkaisija=PHP | Luettu=[[1. helmikuuta]] [[2007]] | Kieli={{en}} }}</ref> 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.
# 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ä.
# Tarvittaessa voidaan käyttää myös ''script''-aloitustagia. Tässä haittapuolena on se, että PHP:n sisällä tulostettava &lt;/script&gt; saattaa aiheuttaa virheellisesti toimivaa koodia.
# [[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.
 
<div style="width: 80%; clear: both">
'''Esimerkkejä erilaisista koodilohkon merkintätavoista''':
<pre><nowiki>
<!-- 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>'; %>
</nowiki></pre>
</div>
 
==== Lausekkeiden erottelu ====
PHP:ssa, samoin kuin [[C (ohjelmointikieli)|C]]:ssa tai [[Perl]]issa, 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.
 
<div style="width: 80%; clear: both">
'''Esimerkkejä tavoista sulkea lauseke'''
<pre><nowiki>
<?php
echo "Hei, maailma!";
?>
 
<?php echo "Hei, maailma!"; ?>
 
<?php
echo "Hei, maailma!"
?>
 
<?php echo "Hei, maailma!" ?>
</nowiki></pre>
</div>
 
PHP-tulkki jättää kommenttien lisäksi huomioimatta puolipisteellä suljetut tyhjät (ei mitään tai vain [[tulostumaton merkki|tulostumattomia merkkejä]] sisältävät) rivit.
 
==== Kommentointi ====
 
PHP tukee useita erilaisia kommentointityyppejä, niin yksirivisiä kuin monirivisiäkin.
 
<div style="width: 80%; clear: both">
'''Esimerkkejä erilaisista kommentointityyleistä'''
<pre><nowiki>
<?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 */
 
?>
</nowiki></pre>
</div>
 
Kommenttien käyttötarkoituksina on:
 
# Pitkien koodien avaaminen ja selkeyttäminen kertomalla mitä koodi kulloinkin "tekee"
# Eri osa-alueiden erottelu visuaalisesti
# Koodilohkojen ja yksittäisten lausekkeiden käytöstä poisto
# Skriptin kehittelijöiden mainitseminen skriptin alussa
 
Tulkattaessa PHP:tä tulkki jättää huomioimatta kommentit, eikä kommentointi juuri lainkaan hidasta suoritusta.
=== Muuttujatyypit ===
 
 
{| width="80%" border="0" cellspacing="0" cellpadding="3" style="border: solid 1px #000000"
|-
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''[[Suomen kieli|Suomenkielinen nimi]] *'''
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''[[Englannin kieli|Englanninkielinen nimi]]'''
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''Tyyppimuunnos **'''
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''Esimerkki'''
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc;" | '''Skaalautuvat muuttujatyypit'''
|-
| '''[[totuusarvo]]'''
| boolean
| bool, boolean
| <pre>TRUE, FALSE</pre>
|-
| '''[[kokonaisluku]]'''
| integer
| int, integer
| <pre>123, +123, -123, 0123, 0x1A, 2147483647</pre>
|-
| '''[[liukuluku]]'''
| float, double
| float, double, real
| <pre>1.23, +1.23, -1.23, 1.2e3, 7E-10</pre>
|-
| '''[[merkkijono]] ***'''
| string
| string
| <pre>'Hei, maailma!', "Hei, maailma!"</pre>
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc; border-top: solid 2px #cccccc" | '''Yhdistelmämuuttujatyypit'''
|-
| '''[[taulukko (ohjelmointi)|taulukko]]'''
| array
| array
| <pre>array ("yksi", "kaksi", "kolme", 1, 1.23)</pre>
|-
| '''[[objekti (ohjelmointi)|objekti]]'''
| object
| object
| <pre>-</pre>
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc; border-top: solid 2px #cccccc" | '''Erikoismuuttujatyypit'''
|-
| '''[[resurssi (ohjelmointi)|resurssi]]'''
| resource
| -
| <pre>-</pre>
|-
| '''[[tyhjä (ohjelmointi)|tyhjä]]'''
| NULL
| -
| <pre>-</pre>
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc; border-top: solid 2px #cccccc" | '''Pseudomuuttujatyypit'''
|-
| -
| mixed
| -
| <pre>-</pre>
|-
| '''[[numeraali (ohjelmointi)|numeraali]]'''
| number
| -
| <pre>-</pre>
|-
| -
| callback
| -
| <pre>-</pre>
|}
 
<p style="font-size: 0.8em">'''*''' vain suomen kielessä vakiintuneet termit
<br />'''**''' lyhenteet joita käytetään [http://www.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting tyyppimuunnoksissa]
<br />'''***''' katso myös [http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc heredoc-syntaksi]</p>
 
=== Muuttujat ===
Muuttujia käytetään tallentamaan tietoa, joka saadaan joko itse koodista, tietokannasta, käyttäjältä tai vaikkapa palvelimelta. Niiden käyttö ja hallinta on näppärää moniin muihin ohjelmointikieliin verrattuna se, että niiden tyyppiä ei tarvitse itse määrittää vaan se päätellään automaattisesti sille annetusta arvosta. Muuttujalle pitää kuitenkin antaa arvo ennen kuin sitä voidaan käyttää muualla koodissa.
 
Rivi 79 ⟶ 239:
 
Huomaa, että muuttujien nimissä ei kannata käyttää ääkkösiä, ja kirjainkoolla on merkitystä.
 
=== Operaattorit ===
 
 
{| width="80%" border="0" cellspacing="0" cellpadding="3" style="border: solid 1px #000000"
|-
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''Operaattori'''
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''[[Suomen kieli|Suomenkielinen nimi]] '''
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''[[Englannin kieli|Englanninkielinen nimi]]'''
| style="background-color: #cccccc; border-bottom: solid 1px #000000; white-space: nowrap" | '''Esimerkki'''
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc;" | '''[[Matematiikka|Matemaattiset]] operaattorit'''
|-
| align="center" | '''+'''
| [[yhteenlasku]]
| addition
| <pre>$a = 5 + 3;</pre>
|-
| align="center" | '''-'''
| [[vähennyslasku]]
| subtraction
| <pre>$a = 5 - 3;</pre>
|-
| align="center" | '''*'''
| [[kertolasku]]
| multiplication
| <pre>$a = 5 * 3;</pre>
|-
| align="center" | '''/'''
| [[jakolasku]]
| division
| <pre>$a = 5 / 3;</pre>
|-
| align="center" | '''%'''
| [[jakojäännös]]
| modulus
| <pre>$a = 5 % 3;</pre>
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc; border-top: solid 2px #cccccc" | '''Sijoitusoperaattorit'''
|-
| align="center" | '''='''
| sijoita
| assign
| <pre>$a = 5;</pre>
|-
| align="center" | '''+='''
| lisää ja sijoita
| add and assign
| <pre>$a += 5; /* vastaa */ $a = $a + 5;</pre>
|-
| align="center" | '''-='''
| vähennä ja sijoita
| subtract and assign
| <pre>$a -= 5; /* vastaa */ $a = $a - 5;</pre>
|-
| align="center" | '''*='''
| kerro ja sijoita
| multiple and assign
| <pre>$a *= 5; /* vastaa */ $a = $a * 5;</pre>
|-
| align="center" | '''/='''
| jaa ja sijoita
| divine and assign
| <pre>$a /= 5; /* vastaa */ $a = $a / 5;</pre>
|-
| align="center" | '''%='''
| jakojäännös sijoitettavasta
| modulus from assign
| <pre>$a %= 5; /* vastaa */ $a = $a % 5;</pre>
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc; border-top: solid 2px #cccccc" | '''Vertailuoperaattorit'''
|-
| align="center" | '''=='''
| löyhä vertailu
| loose comparison
| <pre>$a == 5</pre>
|-
| align="center" | '''==='''
| tiukka vertailu
| strict comparison
| <pre>$a === 5</pre>
|-
| align="center" | '''&gt;'''
| suurempi kuin
| greater than
| <pre>$a &gt; 5</pre>
|-
| align="center" | '''&lt;'''
| pienempi kuin
| less than
| <pre>$a &lt; 5</pre>
|-
| align="center" | '''&gt;='''
| suurempi tai yhtä suuri kuin
| greater or equal to
| <pre>$a &gt;= 5 /* vastaa */ $a &gt; 5 &#124;&#124; $a == 5</pre>
|-
| align="center" | '''&lt;='''
| pienempi tai yhtä suuri kuin
| less or equal to
| <pre>$a &lt;= 5 /* vastaa */ $a &lt; 5 &#124;&#124; $a == 5</pre>
|-
| align="center" | '''<>, !='''
| erisuuri kuin
| different than
| <pre>$a &lt;&gt; 5 /* vastaa */ $a &lt; 5 &#124;&#124; $a &gt; 5</pre>
|-
| align="center" | '''!=='''
| erisuuri tai eri tyyppiä kuin
| different or different type than
| <pre>$a !== 5</pre>
|-
| align="center" | '''? :'''
| vertaileva sijoitus
| ternary
| <pre>$a = $a < 5 ? 0 : 10;</pre>
|-
| colspan="4" style="background: #efefef; border-bottom: solid 2px #cccccc; border-top: solid 2px #cccccc" | '''Loogiset operaattorit'''
|-
| align="center" | '''AND, &amp;&amp;'''
| ja
| and
| <pre>$a == 5 &amp;&amp; $a != 10</pre>
|-
| align="center" | '''OR, &#124;&#124;'''
| tai
| or
| <pre>$a == 5 &#124;&#124; $a != 10</pre>
|-
| align="center" | '''XOR'''
| poissulkeva tai
| xor
| <pre>$a == 5 XOR $a != 10</pre>
|}
 
=== Muuta huomioitavaa ===
 
# PHP on heikosti tyypitetty kieli <ref>{{Verkkoviite | Tekijä=PHP | Nimeke=PHP manuaali: tyyppimuunnos | Osoite=http://www.php.net/manual/en/language.types.type-juggling.php | Julkaisija=PHP | Luettu=[[1. helmikuuta]] [[2007]] | Kieli={{en}} }}</ref>. Tämä tarkoittaa sitä, että muuttujia ei tarvitse [[muuttujan esittely|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.
# 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 [[Muuttujan tyyppimuunnos|tyyppimuunnos]] joka tekee muuttujasta valitun tyyppisen.
# Kielen perusominaisuuksiin kuuluu heterogeeninen taulukko. Tällöin taulukko voi sisältää useita erityyppisiä muuttujia alkioissaan.
 
'''Esimerkkejä muista huomioista:
<div style="width: 80%; clear: both">
<pre><nowiki>
<?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
);
 
?>
</nowiki></pre>
</div>
 
== PHP:n käyttö ==
 
PHP rakentuu hyvin pitkälle valmiin [[PHP:n luokkakirjastot|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 ===
{{pääartikkeli|[[PHP:n luokkakirjastot]]}}
 
PHP sisältää itsessään suuren joukon valmiita luokkakirjastoja muun muassa [[tiedosto]]jen, [[tietokanta]]yhteyksien sekä erilaisten [[merkkijono]]- ja [[päivämäärä]]toimintojen suorittamiseksi. PHP on versiosta 3 lähtien tukenut kolmansien osapuolien [[ohjelmointirajapinta|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 [[ohjelmointirajapinta|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-ohjelmointi]]in. 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 [[resurssi (ohjelmointi)|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.
 
Lisätietoja PHP 5:n olioista löytyy PHP:n manuaalin luvusta 19. [http://php.net/manual/en/language.oop5.php Classes and Objects (PHP 5)]
 
== Tietoturvavinkkejä ==
 
Tämä kappale käsittelee PHP:n [[tietoturva]]a, ja etenkin sitä, kuinka pystyt tekemään tietoturvallisempaa koodia <ref>{{Verkkoviite | Tekijä=PHP | Nimeke=PHP manuaali: tietoturva | Osoite=http://www.php.net/manual/en/security.php | Julkaisija=PHP | Luettu=[[1. helmikuuta]] [[2007]] | Kieli={{en}} }}</ref>.
 
==== 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 ==
Rivi 109 ⟶ 514:
* [http://www.ohjelmointiputka.net/ Ohjelmointiputka] - Sivusto, jossa on paljon koodivinkkejä ja oppaita aloittelijoille.
* [http://www.mureakuha.com/ Mureakuha] - Toinen ohjelmointia käsittelevä sivusto, mutta se on tarkoitettu hieman edistyneemmille ohjelmoijille.
 
== Viitteet ==
<references />
 
[[Luokka:PHP]]
Noudettu kohteesta ”https://fi.wikibooks.org/wiki/PHP