PHP 5.4.33 Released

Zugriff auf entfernte Dateien

Wenn allow_url_fopen in der php.ini aktiviert ist, können HTTP- und FTP-URLs bei den meisten Funktionen verwendet werden, die einen Dateinamen als Parameter benötigen. Darüber hinaus können URLs in include-, include_once-, require- und require_once-Anweisungen verwendet werden (ab PHP 5.2.0 muss dafür allow_url_include aktiviert sein). Weitere Informationen zu den Protokollen, die von PHP unterstützt werden, finden Sie im Abschnitt Unterstützte Protokolle and Wrappers.

Hinweis:

Bis einschließlich PHP 4.0.3 muss PHP mit der Option --enable-url-fopen-wrapper konfiguriert worden sein, damit die URL-Wrapper verwendet werden können.

Hinweis:

Vor PHP 4.3 war mit folgenden Funktionen der Windows-Versionen von PHP kein Zugriff auf entfernte Dateien möglich: include, include_once, require, require_once und die imagecreatefromXXX-Funktionen der GD- und Image-Funktionen-Erweiterung.

Beispielsweise kann damit eine Datei auf einem anderen Webserver geöffnet und nach benötigten Daten analysiert werden. Diese Daten können zur Abfrage einer Datenbank benutzt werden oder passend zum Rest der eigenen Website ausgegeben werden.

Beispiel #1 Den Titel einer entfernten Seite auslesen

<?php
$datei 
fopen ("http://www.example.com/""r");
if (!
$datei) {
    echo 
"<p>Datei konnte nicht geöffnet werden.\n";
    exit;
}
while (!
feof ($datei)) {
    
$zeile fgets ($datei1024);
    
/* Funktioniert nur, wenn Titel und title-Tags in einer Zeile stehen */
    
if (preg_match ("@\<title\>(.*)\</title\>@i"$zeile$treffer)) {
        
$title $treffer[1];
        break;
    }
}
fclose($datei);
?>

Auch eine Datei auf einem FTP-Server kann geschrieben werden, vorausgesetzt man ist als Benutzer mit entsprechenden Zugriffsrechten angemeldet. Auf diesem Weg können nur neue Dateien angelegt werden. Falls Sie versuchen eine schon existierende Datei zu überschreiben, wird der fopen()-Aufruf fehlschlagen.

Um sich statt als 'anonymous' als anderer Benutzer anzumelden, muss ein Benutzername (und möglicherweise ein Passwort) innerhalb der URL angegeben werden, wie z.B. 'ftp://benutzer:passwort@ftp.example.com/pfad/zur/datei'. Die selbe Syntax kann verwendet werden, um auf Dateien via HTTP zuzugreifen, wenn diese eine Basic-Authentifizierung benötigen.

Beispiel #2 Daten auf einen entfernten Server speichern

<?php
$datei 
fopen ("ftp://ftp.example.com/incoming/outputfile""w");
if (!
$datei) {
    echo 
"<p>Datei konnte nicht zum schreiben geöffnet werden.\n";
    exit;
}
/* Schreibe die Daten hier hin. */
fputs ($datei$_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($datei);
?>

Hinweis:

Obiges Beispiel könnte dazu verleiten, dieses Verfahren zu benutzen, um in eine entfernte Log-Datei zu schreiben. Das würde aber leider nicht funktionieren, weil der fopen()-Aufruf fehlschlagen würde, wenn die entfernte Datei bereits existiert. Für eine dezentralisierte Protokollierung sollten Sie sich die Funktion syslog() anschauen.

add a note add a note

User Contributed Notes 2 notes

up
4
slva dot web dot sit at gmail dot com
9 months ago
If  allow_url_fopen is disabled in php.ini you can use CURL function for check file exist:

<?php
$ch
= curl_init("http://www.example.com/favicon.ico");

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode >= 400 -> not found, $retcode = 200, found.
curl_close($ch);
?>
up
-13
heck at fas dot harvard dot edu
10 years ago
The previous post is part right, part wrong. It's part right because it's true that the php script will run on the remote server, if it's capable of interpreting php scripts. You can see this by creating this script on a remote machine:
<?php
echo system("hostname");
?>
Then include that in a php file on your local machine. When you view it in a browser, you'll see the hostname of the remote machine.

However, that does not mean there are no security worries here. Just try replacing the previous script with this one:
<?php
echo "<?php system(\"hostname\"); ?>";
?>
I'm guessing you can figure out what that's gonna do.

So yes, remote includes can be a major security problem.
To Top