php-cli und die hochkommas [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

php-cli und die hochkommas [gelöst]

Beitrag von Pischti » 20.09.2005 11:01:59

hi,
folgende sachlage: für eine eigene doku hab ich mir das wiki installiert. dort sind allerdings
keine tags zum ausführen von php-code vorgesehen. (is auch irgendwo verständlich).
ich hätte das aber gern.
dazu hab ich mir die php-stelle im wiki rausgesucht, wo der eigentliche inhalt ausgegeben wird und da zapfe ich an.
der string wird zerlegt, bis ich die eigentliche zeile der code-ausführung habe, z.b.
$code = ' echo "hallo";';

diese stück code jage ich jetzt durch den php-cli (nicht mit eval, damit der wiki-php-code nicht "gestört" wird) zeile 22

Code: Alles auswählen

      1 <?php
      2 function wikiPhpBlock($str) {
      3     $phpStartTag = '[PHP]';
      4     $phpEndTag   = '[/PHP]';
      5     $lenStart    = strlen($phpStartTag);
      6     $lenEnd      = strlen($phpEndTag);
      7
      8     $found = true;
      9     $current = 0;
     10     $out = '';
     11     while($found){
     12         $found = false;
     13         $posStartTag = strpos($str, $phpStartTag, $current);
     14         if($posStartTag !== false){
     15             $posEndTag = strpos($str, $phpEndTag, $posStartTag+$lenStart);
     16             if($posEndTag !== false){
     17                 if($posStartTag>$current){
     18                     $out.= substr($str,$current, $posStartTag-$current);
     19                 }
     20                 $code = substr($str, $posStartTag+$lenStart, $posEndTag-$posStartTag-$lenStart );
     21                 $code = addslashes(html_entity_decode($code));
     22                 $out.= shell_exec('php -r "'.$code.'"')."\n";
     23                 $found = true;
     24                 $current = $posEndTag + $lenEnd;
     25             }
     26             else{
     27                 $out.= substr($str, $current);
     28             }
     29         }
     30         else{
     31             $out.= substr($str, $current);
     32         }
     33     }
     34     return $out;
     35 }
     36 ?>
das klappt auch alles sehr hübsch, aber: wenn irgedwo ein ' (einfaches hochkomma) in meiner code (denn ich per wiki geschreiben hab) drin vorkommt, dann knallt das ganze.

ich hoffe mal, ich habs nachvollziehbar erläutert :-)
irgend jemand eine idee?
Zuletzt geändert von Pischti am 21.09.2005 10:11:10, insgesamt 1-mal geändert.
gruss pischti
debian stable

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 20.09.2005 12:50:39

Wie genau knallts denn?
Bringt es eventuell was, den Code vor der Uebergabe an php-cli durch quotemeta zu jagen?

Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

Beitrag von Pischti » 20.09.2005 14:49:10

das kann ich gar nicht so genau sagen, weil ich da an die info's zum debuggen schlecht rankomme ...
beim aufruf php -r $code muss ich das ganze in hochkommas nehmen, sonst meckert die shell. wenn ich es mache und innerhalb von $code wiederum ein hochkomme drin ist knallts.
wenn ich die hochkommas innerhalb von $code vorher entwerte, ala

Code: Alles auswählen

$code = str_replace("'","\'", $code);
dann meckert wieder php, weil die entwertet sind ... ein teufelskreis Smile
hab auch schon probiert mit

Code: Alles auswählen

cat << END\n$code\nEND | php
hat aber auch nicht funktioniert ...

vielleicht hat ja jemand noch nen anderen ansatz ...

ahso: quotemeta bringt nichts, da wird zuviel entwertet ...
gruss pischti
debian stable

acid
Beiträge: 2
Registriert: 20.09.2005 15:29:24
Kontaktdaten:

Beitrag von acid » 20.09.2005 15:33:25

wenn dieser fall (ausführen von php code) nicht häufig auftritt könnte man das ja auch in ein file auslagern.

also code in ein tmp-file schreiben
mit php ausführen
file löschen

p.s. der uwe hat den pfeifer gegrüßt

Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

Beitrag von Pischti » 20.09.2005 15:43:05

@haileiter
mit nem tmp-file wäre die not-variante, die ich in erwägung ziehen würde .. der ram soll rammeln, nicht die festplatte :-)
gruss pischti
debian stable

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 20.09.2005 15:54:07

Hm, eventuell geht anstatt ner File auch ne Pipe, falls php-cli den PHP-Code von STDIN lesen kann ;)
Waere evtl auch ne Idee und du sparst dir das Anlegen und Loeschen von Dateien.

Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

Beitrag von Pischti » 20.09.2005 16:27:11

kann er, ein

Code: Alles auswählen

echo '<?php echo "hallo"; ?>' | php
funtioniert ja. aber mit einzelnen innerhalb des php-codes eben nich ..

Code: Alles auswählen

 echo '<?php echo "hall'o"; ?>' | php
bzw.

Code: Alles auswählen

 echo '<?php echo "hall\'o"; ?>' | php
geht eben nich
gruss pischti
debian stable

acid
Beiträge: 2
Registriert: 20.09.2005 15:29:24
Kontaktdaten:

Beitrag von acid » 21.09.2005 08:31:10

so:

vielleicht gelöst.

ich habe zum testen ein html-formular mit einer textarea namens code und der method POST.

die auswertung sieht folgendermaßen aus:

Code: Alles auswählen

if(isset($_POST['code']))
{
   $code = get_magic_quotes_gpc() ? stripslashes($_POST['code']) : $_POST['code'];
   eval($code);
}
das funzt dann sicherlich auch mit ner pipe nach php rein.

p.s. *aufdemstuhlrumhüpfundfroi

Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

Beitrag von Pischti » 21.09.2005 09:26:08

@acid
danke erstmal, hab ich so noch nicht ausprobiert, hab die lösung auf andere art gefunden:
(p.s. wollte kein eval())

für den consolenaufruf, man darf die ' nicht durch \' ersetzen , sondern besser mit dem ascii-code /047 (octal), dann funzt es ...

Code: Alles auswählen

$code = str_replace("'", '\047', $code);
$out.= shell_exec("echo -e '<?php ".$code." ?>' | php")."\n";
gruss pischti
debian stable

Antworten