31 mai 2009

Au-delà du Framework PHP en 1 Tweet !

C'est le bon vieux Tweeto, mais je souhaite pousser la réflexion plus loin...
<?php
require __DIR__.'/c.php';
if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Salut !'; }))
throw new Exception('Error');
$c();
[PasteBin]
Bon c'est du PHP5.3, mais OMG ! Mais ça fait quoi ?

Détaillons ce script:

require __DIR__.'/c.php';
D'abord un "require" qui simplement importe le fichier demandé, en l'occurrence le fichier "c.php" qui se trouve dans le même répertoire. à noter la présence de "__DIR__" qui et une nouveauté qui, comme on peut s'en douter, est une constante renvoyant le répertoire d'exécution du script.


if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Salut !'; }))
En meta code compréhensible: si la variable $_GET['c'] n'est pas une fonction appelable, on continue, sinon on affiche "Salut !" grâce à la fonction anonyme (nouveauté aussi, existait en Java).


throw new Exception('Error');
Si on a continué, c'est à dire que $_GET['c'] n'est pas une fonction, on renvoi une erreur "Error".


$c();
Si on est là c'est que nous n'avons pas envoyé d'erreur, donc on execute la fonction qui se nomme du contenu de $_GET['c']

Oui, c'est génial, mais non IL NE FAUT PAS L'UTILISER car il n'est pas du tout secure !
C'est juste un "proof of concept" en bonne et due forme.

Perso j'aurai écris:
<?php
require 'c.php';
$a = $_GET['a'];
ob_start();
if(!is_callable($a))
header('Location:404.html');
@$a();
ob_end_flush();
[PasteBin]
Ça fait 16 caractères de moins et ça marche sous php 5+.

Et vous, vous avez des p'tit morceaux de code tout mimi comme ça ?

0 commentaires:

Enregistrer un commentaire