formulier met variabele
Deze heeft de naam $Std_jaar
Deze wil ik als standaard in een invul formulier, maar ik krijg de naam van de variabele maar niet de inhoud van de variabele.
Wat moet dit zijn?
Oh natuurlijk ik zit in html en moet variabele in php formaat. Bedankt.
Nu is een jaartal nou niet bepaald zo spannend, maar wat als er andere invoer zit, bijvoorbeeld:
Of
Of een JavaScript snippet die je cookies steelt.
Ook wil je waarschijnlijk niet elk individueel geval gaan inspecteren en op grond daarvan bepalen of er wel of geen escaping nodig is, want dat plaatst je ook voor een andere dilemma: als escaping niet aanwezig was, betekent dit dan dat het niet nodig was of was dit per ongeluk vergeten? Je zult je dat dan ook elke keer dat je iets met die code/HTML doet moeten afvragen en dat lijkt mij niet de bedoeling.
Het makkelijkste is dus om gewoon alles (alle DATA die uit een externe bron komt) te escapen.
Alle tekst (code, HTML etc.) heeft een character encoding, dat wil zeggen heeft een specifiek formaat (in het geheugen) van nullen en enen die groepsgewijs om worden gezet in de daarbij behorende grafische iconen (de karakters die je nu leest).
Om DATA fatsoenlijk te kunnen escapen, en dus in wezen om te kunnen detecteren welke context-specifieke speciale karakters onschadelijk gemaakt dienen te worden, moet je:
- overal consequent dezelfde character encoding in je applicatie toepassen
- de escaping-functionaliteit laten werken met deze zelfde character encoding, anders is niet gegarandeerd dat deze detectie-en-conversie goed verloopt, waarmee het dus ook niet gegarandeerd is dat de escaping goed verloopt, met alle mogelijke (veilgheids)implicaties van dien
In PHP kun je DATA die op een veilige manier in HTML moet worden weergegeven het beste escapen met de functie htmlspecialchars(). Deze functie heeft naast een parameter voor de invoer ook andere parameters, waaronder één voor de character encoding (waarvan de default waarde tussen PHP-versies is veranderd, dus wellicht is het verstandig om deze altijd expliciet in te stellen).
Omdat dit elke keer nogal een riedel is om in te typen loont het wellicht de moeite om hier een aparte functie omheen te schrijven. Een ander voordeel van zo'n hulpfunctie is dat je de escaping indirect regelt (hiermee voorkom je dus tevens hard coding), dus mocht je ooit besluiten om escaping anders te regelen, dan hoef je enkel de functie aan te passen, en hoef je niet alle hard coded instanties in al je code aan te passen.
Aangenomen dat je de UTF-8 character encoding gebruikt, zou dit bijvoorbeeld een zinnige default zijn:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
function escape($in) { // of eventueel escapeHTML, om specifieker te zijn over de context
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
?>
function escape($in) { // of eventueel escapeHTML, om specifieker te zijn over de context
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
?>
En dit kun je dan toepassen op jouw code-snippet, waarbij het wellicht ook handig/verstandig is uit overweging van compatibiliteit om geen short tags te gebruiken:
Als je dit overal consequent toepast (escape output) dan ben je al een flinke stap in de goede richting op weg naar veiligere applicaties.
Het kan natuurlijk altijd zijn dat je de DATA niet wilt escapen, bijvoorbeeld omdat dit HTML is. In het formulier waarin je deze DATA dan beheert zul je nog altijd moeten escapen (want anders breekt dit mogelijk je formulier / het document) en op de plek waar je deze dan (als HTML) gebruikt doe je er verstandig aan om expliciet in code(commentaar) te documenteren dat het inderdaad niet de bedoeling is dat deze ge-escaped wordt. Maar dit is dan dus een gedocumenteerde uitzondering. Op die manier is er altijd duidelijkheid over wat nu precies de bedoeling is.
Gewijzigd op 07/07/2018 14:28:26 door Thomas van den Heuvel