Avatar billede michaelb.dk Nybegynder
25. juli 2007 - 17:26 Der er 10 kommentarer

Upload script - thumbnails og tegn-tjek

Jeg har dette uploadscript som er fundet i en anden tråd herinde. Jeg kunne bare godt tænke mig at scriptet kunne generere en thumbnail i mappenavn/thumbs/ - samt at scriptet kunne sørge for at man kun kan bruge a-z, 0-9, - og _ i filnavnet.
------------------------------------------------------------


<?php

/* Funktion der uploader en fil af tilladt filtype (MIME) med en maximal størrelse til et bibliotek */
/* Funktionen skal fodres med $_FILES['navn'] */
/* String upload_fil(Array fil [, Integer max_stoerrelse [, String bibliotek [, Array filtyper_tilladt]]])  */


function upload_fil($fil, $max_stoerrelse = 100, $bibliotek = 'default', $filtyper_tilladt = 'default')
{
    if ($bibliotek == 'default') {
        $bibliotek = '/galleri';
    }

    if ($filtyper_tilladt == 'default') {
        $filtyper_tilladt = array('image/bmp', 'image/jpeg', 'image/pjpeg', 'image/gif');
    }

    if ($fil['size'] > 0) {
        $filnavn = strtolower(ereg_replace(' ', '_', $fil['name']));
        $fil_sti = $bibliotek . '/' . $filnavn;
        $fra = $fil['tmp_name'];
        $fil_stoerrelse = filesize($fra)/1024;
        $filtype = $fil['type'];
        $fejl = 0;

        if (!in_array($filtype, $filtyper_tilladt)) {
            echo "<p>Filtypen <b>'$filtype'</b> er ikke tilladt. De tilladte filtyper er <b>'" . implode("', '", $filtyper_tilladt) . "'</b>. Filen <b>'$filnavn'</b> kan derfor ikke uploades!<br><br><a href=\"java script:history.go(-1)\">Gå tilbage</a></p>";
            $fejl = 1;
        }

        if ($fil_stoerrelse > $max_stoerrelse) {
            echo "<p>Filen <b>'$filnavn'</b> er for stor og kan ikke uploades. Den fylder <b>" . ceil($fil_stoerrelse) . " kb</b> og der kan maximalt uploades <b>$max_stoerrelse kb</b>!<br><br><a href=\"java script:history.go(-1)\">Gå tilbage</a></p>";
            $fejl = 1;
        }

        if ($fejl == 0) {
            if (file_exists($_SERVER['DOCUMENT_ROOT'] . $fil_sti)) {
                $pos = strrpos($filnavn, '.');
                $foerpos = substr($filnavn, 0, $pos);
                $efterpos = substr($filnavn, $pos + 1, strlen($filnavn) - ($pos + 1));
                $i = 2;

                echo "<p>Filen <b>'$filnavn'</b> eksisterer allerede i <b>'$bibliotek'</b> og filen omdøbes derfor til <b>";

                while (file_exists($_SERVER['DOCUMENT_ROOT'] . $fil_sti)) {
                    $filnavn = $foerpos . '(' . $i . ').' . $efterpos;
                    $fil_sti = $bibliotek . '/' . $filnavn;
                    $i++;
                }

                echo "'$filnavn'</b></p>";
            }

            $til = $_SERVER['DOCUMENT_ROOT'] . $fil_sti;

            if (move_uploaded_file($fra, $til)) {
                echo "<p>Filen <b>'$filnavn'</b> blev uploadet!<br><br><a href=\"java script:window.close()\">Luk vindue</a></p>";
                return $fil_sti;
            } else {
                echo "<p>Desværre, filen <b>'$filnavn'</b> kunne ikke uploades!<br><br><a href=\"java script:history.go(-1)\">Gå tilbage</a></p>";
                return false;
            }
        }
    } else {
        echo '<p>Der er ikke vedhæftet nogen fil!<br><br><a href=\"java script:history.go(-1)\">Gå tilbage</a></p>';
    }
}


if (isset($_POST['send']))
{
$userfile = $_FILES['userfile'];
$bibliotek = $_POST['bibliotek'];
upload_fil($userfile, 200, $bibliotek);
}
else
{
?>

<form enctype="multipart/form-data" action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
Vælg fil<br />
<input type="file" name="userfile"><br />
Vælg mappe:<br />
<select name="bibliotek">
    <option>--- Vælg en kategori ---</option>
    <option value ="/Fanfotos">Fanfotos</option>
    <option value ="/Gruppebilleder">Gruppebilleder</option>

</select><br />
<input type="submit" name="send" value="Upload Fil">
</form>

<?php
}
?>
Avatar billede jakobdo Ekspert
26. juli 2007 - 08:17 #1
Jeg synes evt. du skulle starte med at prøve at bygge en løsning op på koden i denne artikel: http://www.eksperten.dk/artikler/1098

Din kode er nemlig ikke sikker nok.

Det kræver selvfølgelig en del tilretning, for at komme til den kode du har i dag, men du vil få en noget mere sikker kode.
Avatar billede michaelb.dk Nybegynder
26. juli 2007 - 14:44 #2
Hej mange tak for svar.
Hvordan er det usikkert? Der kan vel ikke trænge andre filer end de tilladte igennem? Jeg tvivler på at jeg har evner til at bygge den anden kode op med samme funktioner som denne kode, jeg har lige forsøgt :)
Avatar billede jakobdo Ekspert
26. juli 2007 - 15:12 #3
Det kan snydes så en server tror den får en filtype, men filen rent faktisk er en php fil f.eks.
Og hvis nu en bruger kan snyde dit system til at uploade php filer, kan han få fuld kontrol over dit system.
Avatar billede michaelb.dk Nybegynder
26. juli 2007 - 16:10 #4
Ok uha det er jeg jo ikke interesseret i :) kan du hjælpe mig med at gøre den sikker eller ska den simpelthen bygges fra ny?
Avatar billede jakobdo Ekspert
26. juli 2007 - 17:39 #5
Jeg har prøvet at tilrette min artikel ganske hurtigt.
Virker dette for dig?

<?php
$uploadDirs = array(1 => '/Fanfotos', 2 => '/Gruppebilleder'); //Bibliotekerne hvor filer uploades til - husk chmod 777
$allowedFileTypes = array('jpg','gif','png','bmp'); //Hvilke filer vil vi acceptere bliver uploadet?

//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
  //Har vi en fil?
  if(is_uploaded_file($_FILES['myFile']['tmp_name']))
  {
    //Filendelse
    $extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));
   
    //Er filen en af de filer vi gerne vil have?
    if(in_array($extension,$allowedFileTypes))
    {
        //Hvilket dir er valgt?
        if(isset($_POST['bibliotek']) && is_numeric($_POST['bibliotek']) && $_POST['bibliotek'] > 0)
        {
            $dir = intval($_POST['bibliotek']);
            $uploadDir = $uploadDirs[$dir];
        }
        else
        {
            //Default uploadDir valg...
            $uploadDir = $uploadDirs[1];
        }
   
        if(file_exists($uploadDir . basename($_FILES['myFile']['name'])))
        {
            echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') already exists</h3>';
        }
        else
        {
            //Vi flytter filen fra tmp til vores UPLOADDIR
          if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))
          {
            echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully</h3>';
          }
          else
          {
            echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
          }
        }
    }
    else
    {
      echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
    }
  }
  else
  {
    echo '<h3 style="color:red;">No file selected<h3>';
  }
}

//Vores form
echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
echo 'Vælg fil<br /><input type="file" name="myFile"><br />';
echo 'Vælg mappe:<br /><select name="bibliotek"><option value="0">--- Vælg en kategori ---</option><option value="1">Fanfotos</option><option value="2">Gruppebilleder</option></select><br />';
echo '<input type="submit" name="myUpload" value="Upload fil">';
echo '</form>';

?>

PS: Der er ikke din rename funktion med.
Jeg plejer altid bare at md5 filnavnet og dermed næsten sikre unikke navne hver gang.
Avatar billede jakobdo Ekspert
26. juli 2007 - 17:39 #6
Eller bruge denne til at lave unikke navne:

<?php
// no prefix
// works only in PHP 5 and later versions
$token = md5(uniqid());

// better, difficult to guess
$better_token = md5(uniqid(rand(), true));
?>
Avatar billede michaelb.dk Nybegynder
27. juli 2007 - 16:50 #7
Jeg får denne fejl: Warning: move_uploaded_file() [function.move-uploaded-file]: SAFE MODE Restriction in effect. The script whose uid/gid is 1014/1014 is not allowed to access / owned by uid/gid 0/0 in /var/www/upload/upload.php on line 36
Avatar billede jakobdo Ekspert
27. juli 2007 - 18:10 #8
Så skal den have den fulde sti.
Prøv i det script du har, at udskriv: echo getcwd();
Avatar billede michaelb.dk Nybegynder
28. juli 2007 - 12:25 #9
/var/www/www.andfan.dk/www/upl
Avatar billede jakobdo Ekspert
29. juli 2007 - 11:11 #10
Prøv at bruge det sammen med stierne.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester