Scriptorama.nl

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

4 tips om PHP6 compatible code te schrijven

Iedereen die een beetje met PHP werkt weet hopelijk nu wel dat PHP4 vanaf het eind van dit jaar niet meer ondersteund zal worden door de ontwikkelaars. Dat is natuurlijk vervelend voor de mensen die nu nog gebruik maken van PHP4 maar het wordt nu dus toch echt tijd om te gaan upgraden.

Vervolgens staat PHP6 ook al in de planning, dus als je inderdaad vanaf PHP4 af komt is het verstandig om nu alvast rekening te gaan houden met PHP6. In dit artikel leer je hoe nu voor PHP 5.2 al code kunt schrijven die compatibel blijft met PHP6.

(more...)

Namespaces in PHP: nu met Use in plaats van Import

Toen ik "Namespaces in PHP 6 en PHP 5.3" schreef waren de ontwikkelaars er nog niet helemaal uit of het keyword import of een ander keyword gebruikt moest worden om aan te geven dat een bepaalde namespace geimporteerd moet worden.

Het probleem met het import keyword was namelijk dat er al veel scripts waren de bijvoorbeeld een functie of methode import() hadden. Deze scripts zouden stuk gaan wanneer deze op PHP 5.3 of PHP 6 gedraaid zouden worden.

Toen PHP 5.0 ontwikkeld werd was een namespaces al een van de geplande features. Maar aangezien dit veel onvoorziene problemen gaf is toen besloten om namespaces uit PHP 5.0 te houden om maar verder te kunnen. De ontwikkelaars hebben toen alleen niet de keywords die toen gebruikt zijn uit de parser (of eigenlijk de lexer) gehaald. Het gaat hier om de keywords use (T_USE) en namespace (T_NAMESPACE).

Parse error: syntax error, unexpected T_USE, expecting T_STRING in /Users/mathieu/use-test.php on line 3

Aangezien PHP 5 deze keywords al vanaf het begin claimed en je deze namen dus niet hebt kunnen gebruiken als klasse of functie naam is er dus eigenlijk geen probleem met scripts die zouden stuk gaan bij het upgraden naar PHP 5.3 of PHP 6. Daarom hebben de ontwikkelaars ook besloten om nu in plaats van het keyword import het keyword use te gebruiken.

Deze wijziging is inmiddels compleet en ik heb mijn artikel "Namespaces in PHP 6 en PHP 5.3" daarom ook herzien.

Overigens zijn sinds het schrijven van dat artikel ook snapshot builds van PHP 5.3 beschikbaar gekomen. Je kunt de volledige source code downloaden, maar ook binaries voor Microsoft Windows. Deze snapshot builds zijn te downloaden vanaf snaps.php.net.

Wietse Venema toont testversie taint support in PHP

Wietse Venema, die bezig is met het implementeren van taint ondersteuning in PHP, heeft van het weekend een eerste testversie van zijn werk beschikbaar gesteld:

This is a preliminary implementation of support for tainted variables
in PHP. The goal is to help PHP application programmers find and
eliminate opportunities for HTML script injection, SQL or shell
code injection, or PHP control hijacking, before other people can
exploit them.

Het idee van taint mode in PHP is simpel. Gegevens die "van buiten" komen worden aangemerkt als onveilig. Om deze gegevens te kunnen gebruiken zul je eerst een passende zogenaamde "untaint" functie moeten loslaten op deze gegevens. Zo zul je, voordat je een veld uit een formulier kunt gebruiken in een database query eerst een functie als mysql_real_escape_string() moeten aanroepen om deze gegevens te "untainten" (veilig te maken), en zul je voordat je een veld uit de database kunt weergeven op een pagina eerst de functie htmlspecialchars() or htmlentities() moeten gebruiken.

Aangezien allerlei functies zich bewust moeten worden van het feit dat een variabele veilig of niet veilig kan zijn, zijn nog niet alle functies in PHP in staat om om te gaan met de taint mode die Venema heeft geimplementeerd.

However, the implementation is incomplete, so please don't be
surprised when something is still missing. For example, I have not
yet implemented taint support for object-specific operations, and
taint checks assume that output has a Content-Type: of text/html.

In de README die Venema meelevert beschrijft hij welke functies hij al wel heeft aangepakt.

Venema is nu veelal op zoek naar feedback, zowel op functioneel vlak als performance vlak. Dus als je het gaat testen en je komt iets speciaals tegen, of je hebt een suggestie. Laat het hem vooral weten. Zijn emailadres kun je vinden via de posting op news.php.net.

De taint implementatie loopt iets achter op PHP zelf en is gebaseerd op PHP 5.2.3. Je kunt of een Diff of een volledig gepatchte tarball van de PHP source code downloaden. Windows gebruikers hebben, tenzij ze zelf een Windows versie kunnen bakken, nog even pech.