PHP 5.2.x: Sicheres url_include mit cURL
Geschrieben von: Michael Loth   
Mittwoch, den 25. März 2009 um 19:48 Uhr

Problem mit der noch bis PHP4 so gerne genutzten Funktion include "URL"; sind unter PHP5 die hierzu deutlich verbesserten
Sicherheitseinstellungen. Hier bietet sich jetzt die Möglichkeit allow_url_fopen und allow_url_include separat einzustellen.
Aber wir gehen hier natürlich besser auf Nummer sicher.

Grundsätzlich sollte daher in der systemweit benutzen php.ini folgendes gesetzt sein:

; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
allow_url_fopen = Off
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
allow_url_include = Off

Ein Überschreiben per .htaccess mit folgendem Inhalt wird selbstverständlich ebenfalls verhindert.
Folgendes sollte daher wirkungslos sein:

php_flag allow_url_include 1

Das hat natürlich zur Folge das der folgende Code der unter PHP4 noch so wunderbar (?) lief, unter PHP5 nun eine Fehlermeldung liefert:

include "http://www.domain.de/mig.php?pageType=$pageType&currDir=./$sid&sid=$sidℑ=$image";

Diese Fehlermeldung sieht ungefähr so aus:

PHP Warning:  include(): URL file-access is disabled in the server configuration in /srv/www/www.domain.de/htdocs/article.php on line 153, referer: http://www.domain.de/allarticles.php?menu=11

Ich habe daher einen einfachen Wrapper in die betreffende php-Datei integriert.
Zu allererst den nicht erlaubten Code:

include "http://www.domain.de/mig.php?pageType=$pageType&currDir=./$sid&sid=$sidℑ=$image";

durch diesen ungefährlichen ersetzen:

$include = url_include("http://www.domain.de/mig.php?pageType=$pageType&currDir=./$sid&sid=$sidℑ=$image");
print $include;

Und dann an passender Stelle im gleichen Script unsere einfache Wrapper-Funktion einfügen:

function url_include($url) {
  $ch = curl_init();
  $timeout = 1;
  curl_setopt ($ch, CURLOPT_URL, $url);
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}
Die Sicherheitshinweise zu allow_url_include sind hier nachzulesen:
http://phpsec.org/projects/phpsecinfo/tests/allow_url_include.html