3.3. Inkludering af uddata fra CGI-programmer og andre programmer

Uddata fra et CGI-program kan også inkluderes f.eks.

<!--#exec cgi="/cgi-bin/hoved.cgi" -->

Alt imellem <..> vil blive erstattet af de data som programmet hoved.cgi udskriver. Hvis CGI-programmet udskriver en omdirigering af formen

Location: URL\r\n\r\n
indsættes URL som et link istedet.

Det følgende eksempel bruger et CGI-program til at generere <body bgcolor="#farve">, hvor farven afhænger af tiden.

<!--#exec cgi="/cgi-bin/colorbody.cgi" --> 
 <h1>Test</h1>
</body>

Og koden til colorbody.cgi er et lille Perl-program

#!/usr/bin/perl

#find RRGGBB farve på basis af tiden
my $color=sprintf("%x", ( time*25 % 0x1000000 ));

print "Content-Type: text/html\r\n\r\n";

#udskriver <body ..> tag
print "<body bgcolor=\"#$color\">\n";

Programmet fungerer ved at time er antallet af sekunder siden 1 jan. 1970. Dette ganges med 25 der er 'hastigheden' hvormed farven ændres og modulus 0x1000000 tages, det giver et resultat mellem 0x000000 og 0xffffff, dvs. alle mulige farver. Intensiteten af den blå komponent cykler med en periode på 10 sekunder, den grønne komponent med en periode på 43 minutter og den røde komponent varierer med en periode på omkring en uge.

Browseren modtager HTML-kode som:

<body bgcolor="#ff1adc78">
 <h1>Test</h1>
</body>

Reloades siden så vil baggrundfarven ændre sig fra gang til gang. NB. dette kunne gøres smartere med Javascript, men det kræver at browseren kan køre Javascript-programmer og at brugeren ikke har slået det fra.

Det er også muligt at udføre programmer direkte og inkludere deres output f.eks.

<!--#exec cmd="who" -->

Apache vil starte en shell og udføre who-programmet, der lister alle, der er logged ind på serveren.

Et mere avanceret eksempel er følgende:

<pre>
De sidste 50 sider du hentede på denne server var:
<!--#exec cmd="cat /var/log/httpd/access_log | grep ${REMOTE_ADDR} | tail -n50" -->
</pre>

Først udskrives Apache's log af alle filer den har afsendt. Dette filteres af grep der udskriver alle linjer der matcher IP addressen på den server der ønsker denne side, og tail -n50 udskriver de sidste 50 linjer. Dvs. de sidst 50 filer som den server hentede. Er access_log filen stor tager det dog en del tid at udføre.

Der er nogle sikkerhedaspekter i at give alle og enhver bruger på serveren lov til at bruge webserver-processerne til at udføre arbitrære kommandoer med arbitrære inddata. Med Options IncludesNOEXEC vil ovenstående #exec kommandoer ikke kunne udføres.