... qualcuno mi ha già dato del "pazzo" ... ma vorrei sapere voi, che non seguite il mio blog
, cosa ne pensate
Premessa
In una recente discussione è riapparso il famigerato eval.
Questa funzione è sempre vista male e, per quel che mi riguarda, non ha motivo di esistere se non dove è irreplicabile.
Per irreplicabile intendo quelle situazioni dove altri linguaggi possono compilare sorgenti, mentre il PHP, che non è un linguaggio "compilabile", non può
L'idea mi è venuta dopo aver letto la storia dello <script type="text/ruby"> ... e che diamine, lo fanno i rubynetti e non possiamo farlo noi? Ed ecco la mia proposta.
Risultato finale
Codice PHP:
<?php require 'PHPScriptHandler.php'; ?>
<html>
<head>
<title>Hello PHP World</title>
<script type="text/php" author="andr3a">
$hello = ucwords('hello php world');
$o = new stdClass;
$o->test = 'hello again';
</script>
<script type="text/javascript">
onload = function(){
alert($hello); // Hello Php World
alert($o.test); // hello again
};
</script>
</head>
<body>
</body>
</html>
Concept
Tramite un semplice handler output, si crea uno strato intermedio tra il server ed il client.
Questo strato di fatto è in tutto e per tutto PHP, ovvero ci si può schiaffare praticamente qualunque cosa ma non avrebbe senso, nello strato intermedio, utilizzare funzioni di echo, print, o qualunque altra mandi a sua volta in output qualcosa.
Risultato
Il risultato finale è quello di avere qualunque tipo di variabile compatibile con JSON, per l'occasione riscritta all'interno di un tag script type="text/javascript" e quindi disponibile per gli script JavaScript a seguire, come è facile evincere dall'esempio mostrato.
Per ottenere il tutto avevo inizialmente usato, quasi per gioco, una preg_replace_callback, ma poi mi sono reso conto che nel codice PHP stesso potrebbero esserci chiusure di tag </script> o altro.
Questo non è possibile nemmeno col JavaScript, nel senso che se si apre uno script non si può mettere al suo interno un </script>, poichè il parser del browser darebbe errore.
Essendo però in PHP, non vedo perchè simulare anche questo comportamento invece di sfruttare banalmente le funzioni di DOM disponibili in PHP5, l'unico che ha ragione di esistere oggi.
Questo è un altro esempio di cosa si intende per strato intermedio tra server e client:
Codice PHP:
<?php require 'PHPScriptHandler.php'; ?>
<html>
<head>
<title>Hello PHP World</title>
<script type="text/php" author="andr3a">
// qui siamo nel mezzo tra server e output, ergo il client
$hello = ucwords('hello php world');
// facciamo finta di voler passare anche
// la variabile definita altrove nella parte server
global $something;
// possiamo anche includere scripts o altro ... ma non in questo esempio
</script>
<script type="text/javascript">
onload = function(){
// qui siamo sul client, a body caricato
alert($hello);
alert($something);
};
</script>
</head>
<body>
<?php
// qui siamo sul server
$something = '<div>Hello Body</div>';
echo $something;
?>
</body>
</html>
Allora, cosa ne pensate? 
[edit]
ooops .. la classe 
e per concludere, questo sistema non rischia javascript o code injection per il semplice motivo che il tutto è fatto sul server, e niente è possibile da client.