Scriptorama.nl

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

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?

Reageer ook!

Het lijkt mij een nuttige functie voor op de test server. Het kan altijd gebeuren dat je net zoiets ergens mist en als er dan een fout wordt weergegeven kan je het op tijd oplossen.
Op productieservers zou ik dit uitschakelen. Daar heeft niemand behoefte aan dit soort meldingen behalve potentiële hackers.

De gevorderde scripters zullen het niet nodig hebben omdat die 'veilig' scripten. Het is dus iets voor beginnelingen. En deze zullen 9 van de 10 keer een error_reporting(0) hebben ingesteld omdat ze de meldingen maar irritant vinden in plaats van ze te verhelpen.

Ik zie het zeker zitten, vooral als het optioneel is. Ik zou dan bijvoorbeeld op mijn devmachine kunnen zien of iets vergeet, ergens in mijn applicatie. Op mijn devmachine is performance echt van ondergeschikt belang, daar is de productieserver voor.

De productieserver heeft dan taint mode uitstaan (= geen performance overhead), maar ik weet wel zeker dat mijn code een stukje veiliger is.

Voor de veiligheid zou het een duidelijke winst zijn. Zeker de beginnende PHP programmeurs leren zo om netter te programmeren, en worden zich meer bewust van veiligheid. Een kleine performance hit heb ik daar wel voor over.

Dit lijkt mij zeker handig. Beginners leren dan goed te scripten, en voor mijn devmachine is het ook handig, het kan altijd gebeuren dat je zoiets een keer vergeet, waardoor je wel een lek in je script hebt. Dit kan dit voorkomen. Op de productieserver moeten errors in principe altijd uit staan, wat mark al zei, hebben alleen hackers hier wat aan.

Vind het zeker ook een goed idee.

Idem hier onderscheid tussen dev en productie.

Misschien is dit een zoveelste stap in het ontkrachten van het eeuwige cliché dat PHP in se onveilig is (recent cf. Facebook.com crash enz).

@Marten:
> De gevorderde scripters zullen het niet
> nodig hebben omdat die 'veilig' scripten.

Jij vergeet _nooit_ je output te escapen? Neem dan even contact met me op; zo'n programmeur zoek ik nog ;)

Ben helaas al gecontracteerd Berry ;) En ja ik let er heel veel op om mijn userinput te controleren.

Ik let ook erg goed op, maar je hebt altijd kans dat er iets tussen door glipt. Vergeet niet, deze patch controleert in feite op alle fronten op de data in die bepaalde context gebruikt mag wordt, niet alleen maar of je niet wat userinput weer echoed.

Ik zie het in elk geval als een nuttige feature, zeker voor grotere projecten.

Werkt dit niet in de hand dat er nog meer slechte programmeurs komen, die niet weten waar ze mee bezig zijn?
"Oh, foutmelding, nou dan voeg ik dat wel toe of copy paste ik wel iets anders bij elkaar".

Dat heb je nu, en dat zal je dan ws. ook wel houden. Dit zijn de mensen die het ontwikkelen verder niet interesseert. Degene die wel geinteresseerd zijn in het zichzelf verbeteren vinden bij deze meldingen een helpende hand en direct een introductie tot de gevaren die op de loer liggen :)

> Degene die wel geinteresseerd zijn in het
> zichzelf verbeteren vinden bij deze
> meldingen een helpende hand en direct een
> introductie tot de gevaren die op de loer
> liggen :)

Dat, plus een steuntje in de rug voor de gevorderde programmeurs op een maandagochtend. Tuurlijk let ik op veiligheid, maar ik vergeet ook wel eens iets. Als ik daarop gewezen kan worden, dan graag.

Ik zou het best wel een handige feature vinden. Maar ik denk dat de Taint mode niet automatisch aan moet staan. Dit vooral omdat er ISP's zijn die niet eens naar php.ini kijken en gewoon alles op standaard laten staan. En dat gaat dan zeker heel veel code breken.

> Dit vooral omdat er ISP's zijn die niet eens naar php.ini kijken en gewoon alles
> op standaard laten staan. En dat gaat dan zeker heel veel code breken.

Waar baseer je dat op? Ik kan mezelf echt niet voorstellen dat er hosts (ISP's) zijn die er niet naar kijken.

Leave a comment
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>