Scriptorama.nl

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

PHP-next: wat zit er aan te komen?

Het is alweer een tijdje geleden dat PHP 5.3 uit kwam. De verwachting was dat hierna PHP 6.0 met de langverwachte unicode ondersteuning afgemaakt zou worden. Echter lijkt het er op dat we daar nog even op zullen moeten wachten. De ontwikkelaars hebben zich in eerste instantie gefocussed op het ontwikkelen van andere interessante features, waarbij een PHP 5.4 op de korte termijn waarschijnlijker is dan PHP 6.0. In deze post vind je een paar features die inmiddels zijn toegevoegd aan PHP.

(more...)

PHP voorstel: Closures & Lambda functies

Sinds de PHP group het wiki gebruikt om o.a. voorstellen tot uitbreidingen van de PHP taal te verzamelen lijkt het wel voorstellen te regenen ook. Eerder hadden we al voorstellen voor Taint mode (waar het akelig stil over blijft, overigens) en Traits. Gister kwam daar een derde bij namelijk een voorstel voor closures & lambda's door Christian Seiler.

(more...)

Traits in PHP?

Het regent voorstellen voor PHP de afgelopen paar maanden, na taint mode, closures/betere anonymous functions kwam Stefan Marr gister met een voorstel voor Traits. Traits zijn een soort niet te instantieren class (denk interface / abstract class) welke gebruikt kunnen worden om een class definitie verder uit te breiden.

PHP:
  1. trait A {
  2.   function helloWorld()
  3.   {
  4.   }
  5. }
  6.  
  7. class MijnClass
  8. {
  9.    use A;
  10. }
  11.  
  12. $x = new MijnClass();
  13. $x->helloWorld();

Wanneer een class een trait gebruikt worden de methods die gedefinieerd zijn in deze trait gekopieerd naar de klasse in kwestie. Het voordeel hiervan is dat je geen gigantische inheritance boom creeƫrt of hoeft te copy pasten wanneer je 2 verschillende classes definieert die gelijke methodes hebben

Je kunt met dit voorstel meerdere traits gebruiken en daarbij kiezen hoe er omgegaan moet worden met dubbele methodes. Een methode die in meerdere traits bestaat kun je namelijk aliasen of gewoon niet toevoegen aan de class definitie:

PHP:
  1. trait A {
  2.   function helloWorld()
  3.   {
  4.   }
  5.  
  6.   function doX()
  7.   {
  8.   }
  9. }
  10.  
  11. trait B {
  12.   function helloWorld()
  13.   {
  14.   }
  15. }
  16.  
  17. class MijnClass {
  18.   use a { doX => doY }
  19.   use b { !helloWorld }
  20. }
  21.  
  22. $x = new MijnClass;
  23. $x->myHelloWorld();
  24. $x->doY();

Het voorstel is aardig positief ontvangen, ook door hoe Stefan Marr zijn voorstel heeft gebracht, al is nog niet iedereen overtuigd van het nut van Traits. Ook is men nog niet helemaal gecharmeerd van de syntax die Stefan Marr heeft voorgesteld.

Je kunt nu al Traits proberen door de patch van Stefan Marr toe te passen op een recente versie van de PHP 5.2 branch.

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.

Taint mode voor PHP ?

Wietse Venema, werkzaam bij IBM en bekend van onder andere Postfix, heeft de PHP internals mailing list een update gestuurd van zijn project om een 'runtime taint support', zoals bijvoorbeeld Perl dat heeft, te implementeren binnen PHP om zo potentiele cross site scripting , shell commando injectie en SQL injectie problemen te voorkomen.

The general idea is to mark certain external inputs as tainted (ex:
network, file), and to disallow the use of tainted data with certain
operations that change PHP's own state (ex: include, eval), or that
access or modify external state (ex: create/open/remove file; connect
to server; generate HTML; execute shell command; execute database
command).

In zijn update beschrijft Wietse hoe zijn eerste implementatie van taint mode werkt, hoe hij tot deze implementatie kwam en wat voor impact dat heeft op performance.

PHP:
  1. <?php
  2.     $username = $_GET['username'];
  3.     echo "Welcome back, $username\n";
  4. ?>

With default .ini settings, this program does exactly what the
programmer wrote: it echos the contents of the username request
attribute, including all the malicious HTML code that an attacker
may have supplied along with it.

When I change one .ini setting:

CODE:
  1. taint_error_level = E_WARNING

the program produces the same output, but it also produces a warning:

CODE:
  1. Warning: echo(): Argument contains data that is not converted
  2.     with htmlspecialchars() or htmlentities() in /path/to/script
  3.     on line 3

Een eerste patch zou binnen enkele dagen beschikbaar moeten zijn. Maar gezien de vorige reacties van de PHP ontwikkelaars op Wietse's voorstel is het nog maar de vraag of het ooit officieel wordt toegevoegd aan PHP.

Wat denk jij? Zou een 'taint mode' implementatie nuttig zijn voor PHP of vind je het voornamelijk verspilde performance?