[PHP] Problem mit einem Fileupload Script

04/14/2010 01:45 xXFunyXx#1
Hallo Community

Ich kämpfe hier grad etwas mit einem PHP Fileupload Script rum. ^^
Hab von PHP nicht so viel Ahnung.

Also das Script überprüft nach dem abschicken der Datei das Format (zb .txt) und schickt das an die upload.php:


PHP Code:
<form ENCTYPE="multipart/form-data" method="post" name="form1" action="uploadgerman.php">
                <INPUT NAME="attached" TYPE="file"  size="50"><br>
                Erlaubte Dateiformate: <b><?=implode("</b>, <b>",explode("|",$att_filetypes))?></b><br>
                Maximale Dateigröße: <b><?=$att_max_size?>KB</b>
                <br><br>
                <input type="submit" name="submit" value="Datei hochladen">
            </form>
Upload.php:
PHP Code:
<?
    
include("include/common.php");
    include(
"include/headergerman.php");
    if(
$loggedin){
        include(
"include/accmenu.php");
    }
    if( 
$_POST['submit'] && $_FILES['attached']['name'] ){
        
$ok_filetypes explode("|",$att_filetypes);
        if (!
$_FILES['attached']['error'] && $_FILES['attached']['size'] > $att_max_size*1024){
            
errform('<CENTER>Ihre Datei ist zu groß. Die Datei darf maximal $att_max_siz groß sein. </CENTER><BR><BR>'); // #err
            
$step 1;
        }
        
$filename = (!$_FILES['attached']['error'] ? substrbasename($_FILES['attached']['name']), -30 ) : '');
        
$x strtolowersubstr($_FILES['attached']['name'], -3));
        if(
$filename && !in_array($x$ok_filetypes) ){
            
errform('<CENTER>Dateiformat nicht verfügbar.</CENTER><BR><BR>');
            
$step 1;
        }
        if(!
$posterr){
            if(!isset(
$_GET["ipaddress"]) || ($_GET["ipaddress"] == "")) {
                
$ipaddress $_SERVER['REMOTE_ADDR'];
                
$local 1;
            } else {
                
$ipaddress $_GET["ipaddress"];
                
$local 0;
            }
            
$uniq substrmd5(uniqid (rand())), 010 );
            
$ext strtolowersubstr($_FILES['attached']['name'], -3));
            
move_uploaded_file($_FILES['attached']['tmp_name'], $att_path."/".$uniq.".".$ext );
            
$strQuery  "INSERT INTO images25 SET ";
            
$strQuery .= "filename='".$uniq.".".$ext."',";
            
$strQuery .= "ipaddress='{$ipaddress}',";
            
$strQuery .= "date='".time()."',";
            
$strQuery .= "pkey='{$uniq}',";
            if(
$myuid){
                
$strQuery .= "user='{$myuid}',";
            }
            
$strQuery .= "status='1'";
            
$result mysql_query($strQuery) or die( mysql_error() );
            
$aid mysql_insert_id();
            if(
$aid){
                
$filen $siteurl."/".str_replace('./'''$att_path)."/".$uniq.".".$ext;
                
$filen str_replace('http://','%%',$filen);
                
$filen str_replace('//','/',$filen);
                
$filen str_replace('%%','http://',$filen);

                
                
//ITS AN IMAGE
                
if($x=="jpg" or $x=="jpeg" or $x=="gif" or $x=="png" or $x=="jif" or $x=="jfif")
                {
                    
$filenx=$filen;
                }
                else
                {
                    include(
"include/const.inc.php");
                    
$filenx $siteurl."/icons/".$Icons[$ext];
                }


                
$step 2;
            }else{
                
$step 1;
            }
        }
    }else{
        
$step 1;
    }
    if(
$step == 1){
?>
        <table width="85%" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr>
            <td>
                <div align=center>
                <form ENCTYPE="multipart/form-data" method="post" name="form1">
                    <INPUT NAME="attached" TYPE="file"  size="50"><br>
                    Erlaubte Dateiformate: <b><?=implode("</b>, <b>",explode("|",$att_filetypes))?></b><br>
                    Maximale Dateigröße: <b><?=$att_max_size?>KB</b>
                    <br><br>
                    <input type="submit" name="submit" value="Datei hochladen">
                </form>
                </div>
            </td>
        </tr>
        </table>
<?
    
}else{    ?>
<div align="center"><b>Ihre Datei wurde hochgeladen.</b><br>
  <br>
</div>
<table width="85%" border="0" align="center" cellpadding="0" cellspacing="0">
        
        <tr>
            <td><div align="center"><br>
                Um Ihre Datei in einem Forum zu posten, kopieren Sie diesen Code:<br>
                <textarea name="textarea" cols="100" wrap="soft" rows="3">[url=<?=$siteurl?>][img]<?=$filen?>[/img][/url]</textarea>
            </div></td>
        </tr>
        <tr>
            <td><div align="center"><br>
                Um Ihre Datei Freunde und Familie zu senden, kopieren Sie diesen Code: <br>
        <textarea name="textarea2" cols="100" rows="4"><?=$filen?></textarea>
      </div></td>
        </tr>
        <tr>
            <td><div align="center"><br>
                Um Ihre Datei in einem HTML Code einzubinden, kopieren Sie diesen Code:<br>
                <textarea name="textarea3" cols="100" wrap="soft" rows="3"><a href="<?=$filen?>" target="_blank"><img alt="File Hosted by www.freefileupload.de" src="<?=$filenx?>" /></a></textarea>
            </div></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        </table>
<?    }    ?>
<?
    
include("include/footer.php");
?>
Jetzt zu meinem Problem:
Ich möchte nicht das er die Formate überprüft, weil ich möchte das man alle Formate uploaden kann. Könnte mir da jemand helfen bitte? :confused:
04/14/2010 03:45 Fratyr#2
Zeile 15 bis Zeile 18 wird doch überprüft welche Endung die hochgeladene Datei hat.
Dies wird aus dem Array $ok_filetypes filetyps geholt. Entweder du entfernst diese
3 Zeilen oder du schreibst einfach alle Dateitypen in das eben erwähnte Array. 49 - 57
wird noch überprüft ob es eine Image Datei ist und dan in den jeweiligen Ordner geladen.

Nun etwas zu deinem Problem. Erlaube niemals einen Upload der alle Dateitypen
erlaubt. Ganz einfach aus dem Grund, das man mit PHP Scripten die man dan auf
deinen Host läd eine Menge Unsinn treiben kann -> Shells können verwendet werden.
Und das führt dan dazu das dir entweder die Seite vom Root geklaut oder gelöscht wird.
Deswegen würde ich dir raten wenigstens zu überprüfen ob es ein PHP Dokument ist,
falls dein Webserver noch ASP.net bzw ASPX anbietet würde ich diese ebenfalls
rauswerfen.

Nebenbei, Dateiendungen kann man auch viel Einfacher als mit strpos holen.
$extension = end(explode(".", $_FILE['attached']['tmp_name']));
Gegebenenfalls solltest du dich nach einem anderen Script umschauen, deines
erfüllt zwar seinen Zweck, aber es ist sehr umständlich gescriptet. Das ganze hätte
man auch einfacher haben können.
04/14/2010 13:13 xXFunyXx#3
Quote:
Originally Posted by Fratyr View Post
Zeile 15 bis Zeile 18 wird doch überprüft welche Endung die hochgeladene Datei hat.
Dies wird aus dem Array $ok_filetypes filetyps geholt. Entweder du entfernst diese
3 Zeilen oder du schreibst einfach alle Dateitypen in das eben erwähnte Array.
Habs jetzt auskommentiert. Funktioniert, hab immer die beiden zeilen drüber auch mit auskommentiert. :facepalm:

Quote:
Nun etwas zu deinem Problem. Erlaube niemals einen Upload der alle Dateitypen
erlaubt. Ganz einfach aus dem Grund, das man mit PHP Scripten die man dan auf
deinen Host läd eine Menge Unsinn treiben kann -> Shells können verwendet werden.
Und das führt dan dazu das dir entweder die Seite vom Root geklaut oder gelöscht wird.
Deswegen würde ich dir raten wenigstens zu überprüfen ob es ein PHP Dokument ist,
falls dein Webserver noch ASP.net bzw ASPX anbietet würde ich diese ebenfalls
rauswerfen.
Habs grad mal versucht auszuschließen. Das Chaos wollte ich euch nicht antun. Da klappen sich sicher eure Fußnägel hoch. :D
Könntest du mir da vielleicht noch helfen?
04/15/2010 03:58 Fratyr#4
Die Dateiextension wird ja in diesem Script schon aus dem Namen geholt. Jetzt
brauchst du eigentlich nurnoch eine kurze If Abfrage.

PHP Code:
// Nur nochmal zur Erinnerung, wo die Extension geholt wird...
// Diese ist aber eigentlich ziemlicher Mist, ein aspx dokument hat
// 4 stellen hinter dem Punkt, deswegen würde die dateiextension spx
// heißen. Deswegen machen wirs anderst...
#$ext = strtolower( substr($_FILES['attached']['name'], -3));

$ext strtolower(end(explode("."$_FILES['attached']['name'])));
if (
$ext == 'php' OR $ext == 'asp' OR $ext == 'aspx'
{
  echo 
'PHP, ASP oder ASPX Dokumente dürfen nicht hochgeladen werden';
}
else 
{
  
move_uploadet_file($_FILES['attached']['tmp_name'], $att_path."/".$uniq.".".$ext);