PHP:llä osaan ehkä jotain koodata kyllä mutta käyttö on ollut lähinnä omiin pieniin projekteihin yms eikä koskaan ole tarvinnut tehdä mitään niin että tietoturvaa olisi pitänyt erikseen sen enempää murehtia. Nyt kuitenkin pitäisi pieni projektin poikanen pyöräyttää niin että toivoisi sen olevan edes kohtuullisesti suojassa. Kyseessä ei ole mitään valtionsalaisuuksia joten aivan älyttömiin ei mielestäni tarvitse mennä, mutta jos tietoturvan puolesta päästäisiin edes kohtuullisen paremmalle puolelle :)
Ajatushan on se että tietokannassa on taulukko jota tulostetaan esille eri muodoissa, tietoja pääsee muuttamaan, poistamaaan ja lisäämään. Mitä tässä nyt pitäisi konkreettisesti ottaa huomioon?
Perusajatus oli että koko kansion suojaisi .htaccesilla jonka kautta poimittaisiin myös kirjautuneen nimi ja tätä kautta määriteltäisiin "käyttöoikeudet". Lähinnä siis henkilökohtaiset määritykset yms. Onko tämä toimiva tapa toteuttaa kirjautuminen vai pitäisikö siihen rakentaa joku oma systeemi esimerkiksi putkan oppaita hyväksikäyttäen? Onko siihen tarvetta? Hyötyjä haittoja? Se siis kirjautumisesta..
Koodin puolesta nyt sen verran ainakin ymmärrän että myslin kirjautumistiedot www:n ulkopuolelle ja käyttöön includella ja että kaikkeen käyttäjän lähettämään dataan tulee suhtautua varauksella ja tarkistaa se ennen hyväksyntää.
Ollaanko tässä nyt oikeilla linjoilla? Lähinnä nyt perusajatusta ajatellen.. Tiedän että kuulostan tyhmältä, mutta kun ei ole kokemusta ja joka tapauksessa homma täytyy opetella, niin mielellään opettelisi heti kerrasta "oikean" ja tietoturvallisen tavan tehdä koodia..
Hyviä ja kohtuullisen yksinkertaisia linkkejä aiheeseen? Putkankin haku varmasti löytää monta threadia jos vain tietäisi oikeat taikasanat :)
Riemullinen jokaisesta vastauksesta,
Juha
Edit: Nyt siis saa tyhmää lyödä ja lujaa! Kuhan sen vain tekee niin että kertoo kolhimisen perustelut ;)
Nyrkkisääntöjä:
* Käytä kyselyihin PDO:ta, kuten MySQL-oppaan 2. osassa neuvotaan, niin vältät heti kättelyssä perinteiset SQL-injektiot.
* Pyöräytä kaikki tulostettava data htmlspecialchars-funktion läpi (echo htmlspecialchars($teksti)), niin HTML-merkinnät muuttuvat tekstiksi ja vältät XSS-injektiot.
* Jos käsiteltävä data ei ole julkista, älä koskaan tee SQL-kyselyä käyttäjän syötteen perusteella vaan tarkista ensin, että käyttäjällä on oikeus kyseiseen dataan; kuka tahansa voi kirjoittaa otsikkoriville poista.php?id=123.
* Ota palvelimelta register_globals ja magic_quotes pois päältä, jos ne jostain syystä ovat vielä päällä; molemmista on vain harmia.
Metabolix kirjoitti:
* Jos data ei ole julkista, älä koskaan tee SQL-kyselyä käyttäjän syötteen perusteella vaan tarkista ensin, että käyttäjällä on oikeus kyseiseen dataan; kuka tahansa voi kirjoittaa otsikkoriville poista.php?id=123.
Miten tämä tulisi käytännössä toteuttaa vai olenko ymmärtänyt jotain väärin? Jos koko hakemisto on htaccesilla, niin eikös silloin koko hakemistolistaus ./ ole tunnuksien takana? Tällöin ./index.php & "poista.php":n hakeminen pyytää tunnusta ja salasanaa. Tällöin myöskään poista.php?id=123 ajaminen ei onnistu. Vai mentiinkö jossain metsään?
Vai riittääkö että tarkistetaan {$_SERVER['PHP_AUTH_USER'] että käyttätunnus on oikea ja olemassa ja sitten määritellään tarvittaessa "käyttäjäoikeusryhmä"? Ja jos tunnusta ei heti tiedoston alkuun palauteta, niin mitään ei tehdä?
Toki htaccess hoitaa sen yleisen tarkistuksen, ettei sinne kuka tahansa pääse, mutta jos käyttäjiä on monta, niin eihän silti käyttäjä A saa poistaa käyttäjän B tietoja. Käytännössä tarkistuksen voi tehdä PHP:n puolella tai (tietokannasta riippuen) SQL-kyselyssä:
DELETE FROM tiedot WHERE id = 123 AND omistaja_id = 7
Kyselyyn laitettava omistajan id selviää tietysti tavalla tai toisella siitä kirjautumistunnuksesta. Kannattaa minusta joka tapauksessa pyöritellä id-lukuja eikä epämääräisiä tekstejä.
Poistaminen on vain triviaali esimerkki. Yhtä hyvin voisi olla kyse lahjakorttien myynnistä: onko oikein, että henkilö A ottaa rahat ja myy lahjakortin, jolla saa ilmaiseksi B:ltä tuotteita?
Yksi listasta unohtunut asia on tietokannan normalisointi. Termin selityksiä voi vilkuilla vaikka Wikipediasta. Kannattaa käyttää myös InnoDB-tauluja ja FOREIGN KEYtä, näistä taitaa olla maininta Putkan oppaassa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.