veiliger PHP6 door minder verwarrende beveiliging
vrijdag, april 2nd, 2010PHP6 is nu flink in ontwikkeling en het is waarschijnlijk niet lang meer voordat we de eerste php6 release gaan zien. Een ding waar ik blij mee ben is dat in PHP6 magic quotes extensie nu niet meer werkt.
Het probleem met magic quote’s was dat vele PHP programmeur dachten dat ze hun PHP script veilig konden overzetten op een andere hosting terwijl dat niet het geval was. Wat magic qoutes extensie voor PHP scripts namelijk doet is voor elke input via POST en GET variabele de aanhalingstekens en enkele aanhalingsteken escapen.
Dan is het niet mogelijk dat een bezoeker, een string variabel in je script probeert te verlaten en PHP code kan uitvoeren.
Echter gebeurt dit alleen als magic quote op je hosting aanstaat.
Het is dus ook belangrijk dat in de test omgeving en productie omgeving dezelfde instellingen voor magic quotes gebruikt want anders dan is dat vragen om beveiligingsproblemen. Zonder magic quote moet de programmeur zelf ervoor zorgen dat string variabel veilig wordt.
Dan is er ook nog het probleem met magic quote’s dat het de beveiling die de php programmeur wel gemaakt heeft kan opheffen.
Dit gebeurt als Magic Quotes een slash met aanhalingsteken gaat escape en er dan een dubbele slash staat wat in feit betekent dat de slash ge-escaped wordt en niet het aanhalingsteken meer.
PHP magic quote heeft dus voor veel verwarring en dus beveiligingsproblemen gezorgd terwijl het juist een beveiligingsprobleem automatisch moest oplossen.
Een overzicht van wanneer een php script dus veilig is ziet er dan zo uit:
Een oplossing om een script toch onder zowel hosting met magic quotes aan en magic quote uit veilig te maken was door eerst te controleren of magic quotes aanstond.
Dit kan door de functie get_magic_quotes_gpc() te gebruiken. Echter moet je dan dus wel een aantal dingen dubbel schrijven, een routine waarbij het script niet escaped als magic quote aanstaan en een andere stuk code waarbij de script wel escaped als magic quotes uitstaat. Een slimmer manier om niet overal get_magic_quotes_gpc() te hoeven aanroepen is om een functie te schrijven die je steeds aanroept wanneer je ergens mogelijk moet escapen en in die functie te controleren of magic quotes aanstaat.
Indergeval, in de toekomstige php6 versie zal magic quotes standaard er niet meer zijn en zal de php programmeur dus altijd moeten escapen. Dat maakt het wel een stuk duidelijker.