Hi,
vielen Dank für Eure Antworten.
Es wird augenscheinlich getimagesize () und includes/functions_upload.php zur Prüfung herangezogen.
Über file_get_contents () bin ich bei meiner Suche auch gestolpert und damit wird es wirklich sehr viel magerer.
Um die Dateien vor dem Upload zu prüfen, müsste man dabei die Post-Daten einem zweiten Script übergeben und dort weiter verarbeiten.
Im Netz habe ich nach einigem Suchen ein wirklich sicheres Script gefunden, welches die Bilder mittels php imagecreate neu erzeugt und dann speichert.
Das bietet dann wirkliche Sicherheit und hat den Vorteil, dass alles anhand eines einzigen Scriptes erledigt werden kann.
Falls jemand interesse hat, habe ich das komplette Script mal ins PasteBin geschmissen:
https://www.phpbb.de/support/pastebin.p ... iew&s=1245
Damit es nicht verloren geht, hier nochmal direkt:
Code: Alles auswählen
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>:: Bild von externer URL auf lokalem Server erzeugen :: Remote-Upload ::</title>
</head>
<body>
<?php
/*
* thanx to the author: Swashata <swashata@intechgrity.com>
* original script rights: do what ever you wish (lizenzfrei zur freien verfuegung / keine auflagen)
* script and support: http://www.intechgrity.com/?p=808
* kommentare uebersetzt, hilfe hinzugefuegt und formular ergaenzt: hirni
*
* hilfe:
* variable $store_dir in zeile function gibt den ordner an, in dem die bilder erzeugt werden
* der ordner muss nicht vorhanden sein, wird bei bedarf automatisch erzeugt und erhaelt dabei saemtliche dateiberechtigungen (unix chmod 755)
* das formular verweist auf sich selbst und uebergibt dabei die url an die funktion
* wenn eine unerlaubte url abgesendet wird, die z.b. malware oder fiese scripte enthalten, wird das formular automatisch leer neu geladen
* im erfolgsfall wird die url zum neu erzeugten bild auf dem lokalen server ausgegeben - verlinkt mit dem neuen bild
* die dateinamen der neu erzeugten bilder werden dem original entnommen und bei bereits vorhandener bezeichnung aufsteigend nummeriert
* der linktext zum bild kann im letzten echo angepasst werden (momentan erfolgt die ausgabe des relativen pfades)
* der dateiname dieses dokumentes muss gleichlautend mit dem action="..." attribut des formulars sein, damit es an sich selbst gesendet wird
*/
function itg_fetch_image($img_url, $store_dir = 'remoted', $store_dir_type = 'absolute', $overwrite = false, $pref = false, $debug = false)
{
//erzeugt bild-name ohne pfad
$i_name = explode('.', basename($img_url));
$i_name = $i_name[0];
//finde bild-typ anhand der url
//abfrage, ob die dateiendung erlaubt ist
//ergibt hackerschutz
if(preg_match('/https?:\/\/.*\.png$/i', $img_url)) {
$img_type = 'png';
}
else if(preg_match('/https?:\/\/.*\.(jpg|jpeg)$/i', $img_url)) {
$img_type = 'jpg';
}
else if(preg_match('/https?:\/\/.*\.gif$/i', $img_url)) {
$img_type = 'gif';
}
else {
if(true == $debug)
echo 'URL falsch oder unlesbar.';
return '';
}
$dir_name = (($store_dir_type == 'relative')? './' : '') . rtrim($store_dir, '/') . '/';
//erzeugt ordner, wenn nicht vorhanden - name des ordners ./remoted/ mit allen datei-rechten
if(!file_exists($dir_name))
mkdir($dir_name, 0777, true);
//erzeugt pfad zum bild
$i_dest = $dir_name . $i_name . (($pref === false)? '' : '_' . $pref) . '.' . $img_type;
//abfrage, ob pfad bereits vorhanden
if(file_exists($i_dest)) {
$pref = (int) $pref;
//erzeugt bei bedarf neuen dateinamen, falls bereits vorhanden
if(false == $overwrite)
return itg_fetch_image($img_url, $store_dir, $store_dir_type, $overwrite, ++$pref, $debug);
//wird das selbe bild erneut hochgeladen, wird das duplikat automatisch entfernt
else
unlink ($i_dest);
}
//abfrage, ob sich hinter der uebergenbenen url wirklich um ein bild handelt
$img_info = @getimagesize($img_url);
//abfrage, ob der bild-typ erlaubt ist mit eingrenzung auf jpg, gif und png
if(false == $img_info || !isset($img_info[2]) || !($img_info[2] == IMAGETYPE_JPEG || $img_info[2] == IMAGETYPE_PNG || $img_info[2] == IMAGETYPE_JPEG2000 || $img_info[2] == IMAGETYPE_GIF))
{
if(true == $debug)
echo 'Problem mit dem Datei-Inhalt entdeckt. Bild-URL erneut eingeben.<br />Es sind nur Bilder in den Formaten jpg, gif und png erlaubt.';
return ''; //leere variable, wenn bild nicht erlaubt
}
//erzeugt neues bild aus dem alten, damit es keinesfalls zum upload von anderen dateien kommen kann
if($img_type == 'jpg') {
$m_img = @imagecreatefromjpeg($img_url);
} else if($img_type == 'png') {
$m_img = @imagecreatefrompng($img_url);
@imagealphablending($m_img, false);
@imagesavealpha($m_img, true);
} else if($img_type == 'gif') {
$m_img = @imagecreatefromgif($img_url);
} else {
$m_img = FALSE;
}
//abfrage, ob neues bild erfolgreich erzeugt werden konnte
if(FALSE === $m_img) {
if(true == $debug)
echo 'Bild kopieren fehlgeschlagen.';
return '';
}
//schreibt neues bild in den pfad auf dem lokalen server
if($img_type == 'jpg') {
if(imagejpeg($m_img, $i_dest, 100))
return $i_dest;
else
return '';
} else if($img_type == 'png') {
if(imagepng($m_img, $i_dest, 0))
return $i_dest;
else
return '';
} else if($img_type == 'gif') {
if(imagegif($m_img, $i_dest))
return $i_dest;
else
return '';
}
return '';
}
$new_img = $_POST["remote_url"];
$new_img_path = itg_fetch_image ($new_img);
//erzeugt html-formular, wenn keine gueltige bild-url uebergeben wurde oder gibt das ergebnis aus, wenn das script erfolgreich war
if ($new_img_path !== '')
{
echo "Bild erfolgreich erstellt:<br /><a href=\"$new_img_path\">$new_img_path</a>";
}
else
{
?>
<form action="remote_image.php" method="post"><span>Nur <strong>JPG</strong>, <strong>GIF</strong> oder <strong>PNG</strong>. Bild-<strong>URL</strong> einfügen:</span>
<br /><input type="text" name="remote_url" value=""> <input type="submit" name="submit" value="Bild übertragen">
</form>
<?php
}
?>
</body>
</html>
Einziger Nachteil ist, dass animierte GIFs durch das Erzeugen eines neuen Bildes natürlich nicht mehr animiert sind.
Wenn jemand eine Änderung alla "if gif = animated gif {copy directly from remote-url}" weiß: Immer her damit...
Da meine php-Kenntnisse noch im Bereich Dummies angesiedelt sind, bitte ich um Nachsicht, wenn dumme Fragen kommen.
LG