Quick tip: waarden controlen met preg_match() in PHP
Nadat Stefan Esser vorige maand er maar liefst 44 security advisories voor PHP uitgegooid heeft tijdens de Month of PHP Bugs, komt hij vandaag op zijn weblog met een goede tip wat betreft het controleren van waarden door middel van preg_match(): gebruik de D modifier wanneer je ook de start (^) en end ($) anchors gebruikt, anders kunnen bepaalde waarden erdoorheen komen (anchors? modifiers? geen idee waar ik het over heb? Lees onze regular expressions tutorial):
Wanneer je deze code uitvoert zul je, waarschijnlijk onverwacht, de volgende uitvoer krijgen:
-
Dit is een nummer
Stefan stelt dat iedereen die code hierboven wel eens heeft geschreven de PHP PCRE handleiding niet goed heeft gelezen (ik ben alvast guilty as charged) en dat we bij dit soort controles de 'D' modifier moeten gebruiken. En verdomd, het klopt, want als je even bij de Pattern Modifiers sectie (en dat doen we toch allemaal vrij regelmatig? :-) ) van de PHP PCRE handleiding kijkt zie je het volgende:
D (PCRE_DOLLAR_ENDONLY)
If this modifier is set, a dollar metacharacter in the pattern matches only at the end of the subject string. Without this modifier, a dollar also matches immediately before the final character if it is a newline (but not before any other newlines). This modifier is ignored if m modifier is set. There is no equivalent to this modifier in Perl.
Oftewel, zonder de D modifier wordt het laatste karakter (maar alleen als dat een newline is) ook meegenomen in de match voor het end-anchor ($). In veel gevallen zal een meekomende newline niet veel problemen kunnen veroorzaken, maar in enkele gevallen kunnen er toch wat ongewenste dingen plaats vinden. Zo zou een emailadres met een extra newline, bij het versturen van een email naar meerdere mensen door middel van de BCC-headers, er voor kunnen zorgen dat de rest van de headers niet wordt geinterpreteerd als headers maar als content. Op die manier zou je zo maar per ongeluk klant-emailadressen kunnen lekken. Zie ook ons artikel: Voorkom email-header injection.
Kortom, de juiste manier om een complete match af te dwingen is dus gebruik te maken van de D modifier:
Misschien is het, aangezien preg_match() veel voor validatie doeleinden gebruikt wordt, een idee om dit specifieke voorbeeld maar op te nemen bij de documentatie voor preg_match().
Volg Scriptorama via RSS!
Reageer ook!
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>