Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

Scriptorama.nl updates

Scriptorama.nl is verhuisd naar TransIP en met deze verhuizing is het forum voorlopig niet meer beschikbaar aangezien daar voornamelijk spambots op afkwamen ;-).

Scriptorama’s XdebugClient

Al een behoorlijke tijd ben ik bezig geweest met een simpele frontend voor de populaire PHP debugger: XDebug. Vandaag heb ik dan eindelijk besloten om een eerste test versie beschikbaar te stellen: xdebugclient 1.0-beta1.

xdc 1.0-beta1

Features

  • Small / lightweight - no install required
  • Line-based breakpoints
  • Property inspector
  • Call stack overview at breakpoints
  • Should would fairly well with remote scripts when combined with, say, Samba.
  • Run, Step In, Step Out, Step Over

Beschikbaarheid

Xdebugclient is beschikbaar onder de LGPL en vereist het .NET 2.0 Framework (gratis te downloaden) en is dus alleen beschikbaar voor MS Windows.

Suggesties en bugmeldingen zijn zeer welkom.

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):

PHP:
  1. if ( preg_match ( '~^[0-9]+$~', "1234\n" ) )
  2. {
  3.     echo "Dit is een nummer";
  4. } else {
  5.     echo "Dit is geen juist nummer.";
  6. }

Wanneer je deze code uitvoert zul je, waarschijnlijk onverwacht, de volgende uitvoer krijgen:

CODE:
  1. 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:

PHP:
  1. if ( preg_match ( '~^[0-9]+$~D', "1234\n" ) )
  2. {
  3.     echo "Dit is een nummer";
  4. } else {
  5.     echo "Dit is geen juist nummer.";
  6. }

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().