Olen parhaillaan tekemässä sivuja uusiksi ja törmäsin heti pieneen ongelmaan.
Haluaisin varmistaa sen että käyttäjän pyytämä sivu on nimeltään oikeanlainen.
Tässä tapauksessa vaikkapa nimeltään ohjelmointi.
haluaisin varmistaa sen ettei käyttäjä pysty syöttämään sivun nimeksi vaikkapa /etc/passwd nimeä.
Pitäisi siis saada kaivettua puhdas stringi ilman viivoja mihnkään suuntaan, ilman pisteitä/tuplapisteitä, jne...
Joskos joku osaisi osoittaa oikeaan suuntaan.
Tosiaan unohtui mainita. Get metodilla olisi tarkokoitus tuota nimeä välittää. :) Helpottaa linkkien tekemistä.
Mitenköhän se käyttäjä sitä sivua pyytää? GETillä?
Kokeilen parhaillaan tuollaisella:
if (preg_match("/^([a-z]|[0-9])*/",$Sivu,$Temp)) { print "Match: $Temp[0]"; } else { print "No match"; }
Mutta tuntuu että tuo antaa Matchejä melkein joka asiasta mukaan lukien ../jotakin
Kaikkein turvallsin vaihtoehto lienee lukea ensin kaikki sallitut sivut vaikka glob:ia apuna käyttäen arrayhin, josta sitten haetaan käyttäjän valitsemaa sivua.
Toimiva tuokin taulukkoratkaisu, kallistunen siihen suuntaan jollen keksi parempaa preg_matcia kuin seuraava:
if (preg_match("/([a-zA-Z0-9]+)/",$Sivu,$Temp)) { print "Match: $Temp[0]"; } else { print "No match"; }
Tuo ainakin kaivaa annetun merkkiehtojen mukaisesti nimen syöttestä jättäen huomiotta pisteet, vinoviivat.
Yritän tässä samalla oppia vääntämään noita ehtoja tuolle preg_matchille. :) Ajatuksena kun on oppia tuota sen verran että käyttäjiltä saadun syötteen oppisi suodattamaan siten että halutun muotoinen tieto tulee oikeasti perille.
Edit:
Tulipas mieleen että tällaista sanitointia tarvitsee vaikka siinä että otetaan käyttäjältä syötettä vieraskirjaan, tuoteluetteloon päivitystä, yms...
Minusta helpointa olisi ihan vain poistaa /-merkit tiedoston nimestä.
$sivu = str_replace("/", "", $sivu);
Silloin muihin hakemistoihin tai toiselle palvelimelle siirtyminen ei ole mitenkään mahdollista.
Pitääpäs kokeilla tuota. Voisi olla melkoisesti nopeampi vain poistaa tosiaan ne viivat ja pistete tuolla kuin ajaa aina preg_match tuosta läpi. :)
Kiitos vinkistä.
Oikea tapa tehdä asia: Laita pyyntöjen nimet (ja sitä vastaava todellinen sivu) taulukkoon. Jos pyydetty löytyy taulukosta niin ok, muuten näytetään virheilmoitus.
Aihe on jo aika vanha, joten et voi enää vastata siihen.