Avatar billede dotcom1 Nybegynder
25. marts 2005 - 22:22 Der er 17 kommentarer og
1 løsning

Upload kun visse filtyper

I har sikkert set dette upload-script fra webcafe.dk. Det virker jo fint nok, men jeg kunne godt tænke mig at man kunne bestemme hvilke filtyper, der må uploades. Har oplevet at folk  uploader .dll, .exe og .bat-filer til serveren, og det vil jeg helst gerne undgå. Kunne man lave et array med de filtyper, der ikke må uploades?

<?php

/**
* Simpelt script der tager imod et filupload og lister
* filer i upload-biblioteket.
*
* Scriptet er et eksempel til en artikel paa WebCafe.dk:
*
* http://www.webcafe.dk/artikler/php/upload/
*/

/**
* Hvor skal filerne uploades til?
* Husk, at webserveren skal kunne skrive til dette bibliotek
*/
$konfiguration["upload_bibliotek"] = "./upload";

/* Hvor mange kilobytes maa filerne fylde per styk? */
$konfiguration["max_stoerrelse"] = "100";

/**
* Checker PHP-version
*/
list($major, $minor, $rev) = explode(".", phpversion());
if($major < 4) {
  die("Jeg kan kun arbejde med PHP 4.0.0 eller derover");
}

/**
* Udligner forskellene mellem 4.1.x og 4.0.x
* Bemaerk, at disse ikke er "superglobals"
*/
if($minor < 1) {
  $_FILES = $HTTP_POST_FILES;
  $_POST = $HTTP_POST_VARS;
  $_SERVER = $HTTP_SERVER_VARS;
}

if($_FILES["upfil"]["size"] > 0) {

  /**
  * Hvis der er en fil, saa uploader vi den.
  *
  * Foerst slaar vi lige fast, hvor filen skal flyttes fra og til.
  */

  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES["upfil"]["name"];

  /**
  *  Checker lige om filen er for stor til at vi vil acceptere den.
  *  Vi bruger ceil() i stedet for round(), saa vi ikke faar den skoere
  *  situation, at fejlmeldingen siger, at filen er for stor, men angiver
  *  samme stoerrelse for filen og den oevre graense.
  */
  $fil_stoerrelse = filesize($fra)/1024;
  if($fil_stoerrelse > $konfiguration["max_stoerrelse"]) {
      die("Desv&aelig;rre - filen er for stor. Jeg accepterer kun " .
          $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
          ceil($fil_stoerrelse) . "kb");
  }
  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }

  header("Location: " . $_SERVER["PHP_SELF"]);
  exit;

} else {

  /**
  * Intet tegn paa upload, saa vi viser bare listen over filer
  * og HTML-formularen til nye uploads.
  */
  $indhold = listFiler($konfiguration["upload_bibliotek"]);
  $indhold .= bygFormular($_SERVER["PHP_SELF"]);
  $output = bygSide("hej", $indhold);

}


/**
* Skriver ud til browseren
*/
echo $output;
exit;


/**************************************************\
**              Hjaelpefunktioner              **
\**************************************************/

function bygSide($titel, $indhold) {

  /**
  * Pakker indholdet ind i lidt formalia
  */
  return '<html>
            <head><title>' . $titel . '</title></head>
            <body bgcolor="#ffffff">
              <div align="right"><a href="./">Tilbage til artiklen</a></div>
              ' . $indhold . '</body>
          </html>
        ';

}

function bygFormular($action) {

  $formular = '<form action="' . $action . '" method="post" enctype="multipart/form-data">
                <table border="1" cellpadding="5" cellspacing="0">
                  <tr>
                    <td align="right" bgcolor="#999999"><b>Fil til upload:</b></td>
                    <td bgcolor="#cccccc"><input type="file" name="upfil" /></td>
                  </tr>
                  <tr>
                    <td colspan="2" align="middle" bgcolor="#dddddd"><input type="submit" value="upload" /></td>
                  </tr>
                </table>
              </form>
              ';

  return "<h2>Upload fil:</h2>" . $formular;

}

function listFiler($bibliotek) {

  if($bib = @opendir($bibliotek)) {
    /**
    * Denne syntaks er forklaret i PHP-manualen:
    * http://www.php.net/manual/en/function.readdir.php
    */
    while (false !== ($fil = readdir($bib))) {
      if($fil != "." && $fil != ".." && !ereg("^\..+", $fil)) {
          $fil_liste[] = "<a href=\"$bibliotek/$fil\">$fil</a>";
      }
    }
    closedir($bib);

    if(is_array($fil_liste)) {
      $liste = "<li>" . join("</li><li>", $fil_liste) . "</li>";
    } else {
      $liste = "<li>Ingen filer p&aring; lager</li>";
    }
    return "<h2>Filer p&aring; lager:</h2><ul>" . $liste . "</ul>";
  } else {
    die("Kunne ikke &aring;bne biblioteket: " . $bibliotek);
  }

}

?>

Mvh. :)
Avatar billede dotcom1 Nybegynder
25. marts 2005 - 22:54 #1
Har ændret lidt i scriptet, så det nu ser sådan ud (viser indholdet sorteret, mv.), men leder stadig efter en måde til at definere bestemte filtyper på.
<?php
$konfiguration["upload_bibliotek"] = "../uploads";

/* Hvor mange kilobytes maa filerne fylde per styk? */
$konfiguration["max_stoerrelse"] = "300";

/**
* Checker PHP-version
*/
list($major, $minor, $rev) = explode(".", phpversion());
if($major < 4) {
  die("Jeg kan kun arbejde med PHP 4.0.0 eller derover");
}
/**
* Udligner forskellene mellem 4.1.x og 4.0.x
* Bemaerk, at disse ikke er "superglobals"
*/
if($minor < 1) {
  $_FILES = $HTTP_POST_FILES;
  $_POST = $HTTP_POST_VARS;
  $_SERVER = $HTTP_SERVER_VARS;
}

if($_FILES["upfil"]["size"] > 0) {

  /**
  * Hvis der er en fil, saa uploader vi den.
  * Foerst slaar vi lige fast, hvor filen skal flyttes fra og til.
  */

  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES["upfil"]["name"];

  /**
  *  Checker lige om filen er for stor til at vi vil acceptere den.
  */
  $fil_stoerrelse = filesize($fra)/1024;
  if($fil_stoerrelse > $konfiguration["max_stoerrelse"]) {
      die("Desv&aelig;rre - filen er for stor. Jeg accepterer kun " .
          $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
          ceil($fil_stoerrelse) . "kb");
  }
  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }
  header("Location: " . $_SERVER["PHP_SELF"]);
  exit;

} else {
  /**
  * Intet tegn paa upload, saa vi viser bare listen over filer
  * og HTML-formularen til nye uploads.
  */
  $indhold = listFiler($konfiguration["upload_bibliotek"]);
  $indhold .= bygFormular($_SERVER["PHP_SELF"]);
  $output = bygSide("List filer", $indhold);
}
function bygSide($titel, $indhold) {
  /**
  * Pakker indholdet ind i lidt formalia
  */
  return '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <html>
        <head>
        <style type="text/css">
        body {height:100%; margin:10px; font-family:arial, verdana, helvetica, sans-serif; font-size:11px;}
        li {margin-left:10px;}
        a:link{color: #666; text-decoration: none;}a:visited{color: #666; text-decoration: none;}
        a:hover{color:#000; text-decoration: underline;}a:active{color: #666666; text-decoration: none;}
        .subtitle {font-size:11px;} .title {font-size:14px; font-weight:bold;}
        :link:focus, :visited:focus {-moz-outline: none;}
        </style>
          <script language="JavaScript" type="text/javascript" src="popup_window.js"></script>
        <title>' . $titel . '</title></head>
        <body bgcolor="#ffffff">
        ' . $indhold . '</body>
        </html>
        ';
    }
/**
* Skriver ud til browseren
*/
echo $output;
exit;

function bygFormular($action) {
  $formular = '<form action="' . $action . '" method="post" enctype="multipart/form-data">
                <table border="0" cellpadding="5" cellspacing="0" style="border:1px solid #000;">
                  <tr>
                    <td align="right" bgcolor="#999"><b>Fil til upload:</b></td>
                    <td bgcolor="#cccccc"><input type="file" name="upfil" /></td>
                  </tr>
                  <tr>
                    <td colspan="2" align="center" bgcolor="#dddddd"><input type="submit" value="upload" /></td>
                  </tr>
                </table>
              </form>
              ';
  return "<br /><b>Upload fil:</b>" . $formular;
}
function listFiler($bibliotek) {

  if($bib = @opendir($bibliotek)) {
    $filnavne = array();
    while (false !== ($fil = readdir($bib))) {  // hent alle filnavne
      if($fil != "." && $fil != ".." && !ereg("^\..+", $fil)) {
        $filnavne[] = $fil;
      }
    }
    sort( $filnavne );        // her sorteres arrayet alfabetisk efter filnavn
    foreach( $filnavne as $fil ) {            // udskriv udaf arrayet
        list($w, $h, $x, $x) = getimagesize( "$bibliotek/$fil" );
        $fil_liste[] = "<a href=\"java script:popit('$bibliotek/$fil', $w, $h)\"><img src=\"$bibliotek/$fil\" width=\"100px\" height=\"100px\" border=\"0\" alt=\"$fil\" title=\"$fil\" style=\"border:1px solid #333;\"></a>";
    }
    closedir($bib);

    if(is_array($fil_liste)) {
      $liste = join(" ", $fil_liste);
    } else {
      $liste = "Ingen filer p&aring; lager...";
    }
    return "<span class=\"title\">Filer p&aring; lager:</span><br />\n"
    . "<br />\n"
    . "<span class=\"subtitle\">Klik på et billede for at se det i original st&oslash;rrelse.</span><br />\n"
    . "<br />\n"
    . "$liste";
  } else {
    die("Kunne ikke &aring;bne mappen: " . $bibliotek);
  }
}
# Angiv mappen hvis indhold skal vises som thumbnails.
echo listFiler("../uploads");

?>
Avatar billede bromer Nybegynder
25. marts 2005 - 22:57 #2
Når formen er blevet submittet kan du benytte funktionen mime_content_type [1] for at finde filtypen.

Der er så to typer validering du kan foretage. Du kan have et array med gyldige typer såsom "text/plain", "image/gif" og så videre eller du kan have en liste med filtyper du ikke vil have med. Denne kunne indeholde "application/x-bzip2" eller hvad du nu vil have. Du kan lave et array ud fra en liste af mime typer [2]. Et eller andet sted kunne du så have:

<?
$valid_types = array("text/plain","image/gif");
if (!in_array(mime_content_type($filepath),$valid_types))
die("Ikke gyldig type");
?>

[1] http://dk.php.net/manual/en/function.mime-content-type.php
[2] http://www.asahi-net.or.jp/en/guide/cgi/mimetype.html
Avatar billede dotcom1 Nybegynder
25. marts 2005 - 23:16 #3
Tak for svaret. Hvordan skriver jeg en mime_content_type funktion? Har kigget i php-manualen, men der er ikke rigtig nogen eksempler at gå ud fra.
Avatar billede bromer Nybegynder
25. marts 2005 - 23:20 #4
Hvad mener du? Du skal jo ikke skrive funktionen men derimod bruge den. Du kan vel bruge den kode jeg skrev og sætte den ind før filen rent faktisk bliver flyttet. Denne kode du har her:

if($_FILES["upfil"]["size"] > 0) {

  /**
  * Hvis der er en fil, saa uploader vi den.
  * Foerst slaar vi lige fast, hvor filen skal flyttes fra og til.
  */

  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES["upfil"]["name"];

  /**
  *  Checker lige om filen er for stor til at vi vil acceptere den.
  */
  $fil_stoerrelse = filesize($fra)/1024;
  if($fil_stoerrelse > $konfiguration["max_stoerrelse"]) {
      die("Desv&aelig;rre - filen er for stor. Jeg accepterer kun " .
          $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
          ceil($fil_stoerrelse) . "kb");
  }
  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }
  header("Location: " . $_SERVER["PHP_SELF"]);
  exit;

kan du tilføje det i:

if($_FILES["upfil"]["size"] > 0) {

  /**
  * Hvis der er en fil, saa uploader vi den.
  * Foerst slaar vi lige fast, hvor filen skal flyttes fra og til.
  */

  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES["upfil"]["name"];

  /**
  *  Checker lige om filen er for stor til at vi vil acceptere den.
  */
  $fil_stoerrelse = filesize($fra)/1024;
  if($fil_stoerrelse > $konfiguration["max_stoerrelse"]) {
      die("Desv&aelig;rre - filen er for stor. Jeg accepterer kun " .
          $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
          ceil($fil_stoerrelse) . "kb");
  }

  $valid_types = array("text/plain","image/gif");
  if (!in_array(mime_content_type($fra),$valid_types))
  die("Ikke gyldig type");


  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }
  header("Location: " . $_SERVER["PHP_SELF"]);
  exit;
Avatar billede dotcom1 Nybegynder
25. marts 2005 - 23:29 #5
Okay, tak. Jeg får fejlen:
Call to undefined function: mime_content_type() i linie 53, som er:
if (!in_array(mime_content_type($fra),$valid_types))

- både når jeg prøver at uploade tilladte og ikke tilladte filtyper.
Avatar billede bromer Nybegynder
25. marts 2005 - 23:32 #6
hvilken PHP version benytter du? (du kan få det enten via phpinfo() [1] eller phpversion() [2]

[1] http://dk.php.net/phpinfo
[2] http://dk2.php.net/manual/en/function.phpversion.php
Avatar billede dotcom1 Nybegynder
25. marts 2005 - 23:34 #7
phpinfo(): PHP Version 4.1.2
Avatar billede bromer Nybegynder
25. marts 2005 - 23:40 #8
Yup, så er det derfor idet du skal bruge version 4.3.0 eller højere for at den funktion findes. Det du så kan gøre er at undersøge, hvilken extension filen har. Det bliver noget i stil med:

function get_ext($f) {
  $tmp = array_reverse(explode(".",basename($f)));
  return $tmp[0];
}

hvis du indsætte den i toppen kan du lave noget som:

if($_FILES["upfil"]["size"] > 0) {

  /**
  * Hvis der er en fil, saa uploader vi den.
  * Foerst slaar vi lige fast, hvor filen skal flyttes fra og til.
  */

  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] . "/" . $_FILES["upfil"]["name"];

  /**
  *  Checker lige om filen er for stor til at vi vil acceptere den.
  */
  $fil_stoerrelse = filesize($fra)/1024;
  if($fil_stoerrelse > $konfiguration["max_stoerrelse"]) {
      die("Desv&aelig;rre - filen er for stor. Jeg accepterer kun " .
          $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
          ceil($fil_stoerrelse) . "kb");
  }

  $valid_types = array(".txt",".gif");
  if (!in_array(get_ext($fra)),$valid_types))
  die("Ikke gyldig type");


  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }
  header("Location: " . $_SERVER["PHP_SELF"]);
  exit;
Avatar billede dotcom1 Nybegynder
25. marts 2005 - 23:46 #9
Okay, får parse error i denne linie: 
if (!in_array(get_ext($fra)),$valid_types))

Har sat funktionen ind øverst.
Avatar billede bromer Nybegynder
25. marts 2005 - 23:48 #10
ahh.. det er jo fordi der er en fejl.. jeg skriver svarene lidt hurtigt så der sniger sig nogle fejl ind:

if (!in_array(get_ext($fra)),$valid_types))

skal være

if (!in_array(get_ext($fra),$valid_types))
Avatar billede dotcom1 Nybegynder
25. marts 2005 - 23:53 #11
Helt i orden. :)
Nu melders der ingen fejl, men lige meget hvilken type fil, jeg prøver at uploade, både txt og gif-filer, så siger den at det ikke er en gyldig filtype...
Avatar billede bromer Nybegynder
25. marts 2005 - 23:59 #12
aha.. ja. det er fordi jeg har smidt et punktum i array'et. Hvis du ændrer:

$valid_types = array(".txt",".gif");

til

$valid_types = array("txt","gif");

så burde det virke
Avatar billede dotcom1 Nybegynder
26. marts 2005 - 00:04 #13
Den gør godt nok samme fejl stadigvæk...
Avatar billede bromer Nybegynder
26. marts 2005 - 00:06 #14
jamen det var da ikke så godt. Hvilket output får du hvis du laver:

print "Fil ext: " . get_ext($fra);
var_export($valid_types);
Avatar billede dotcom1 Nybegynder
26. marts 2005 - 00:11 #15
Hehe:
Fil ext: php0efdUo
Fatal error: Call to undefined function: var_export()

- hvis det altså er ligemeget hvor kodestumpen indsættes... Satte den ind under:
$valid_types = array("txt","gif");
  if (!in_array(get_ext($fra),$valid_types))
  die("Ikke gyldig filtype");
Avatar billede bromer Nybegynder
26. marts 2005 - 00:13 #16
nå.. det giver fint mening.. det er fordi filen bliver lagt i tmp og hedder noget hemmeligt. Nu prøver vi så igen:

Det skal være:
  if (!in_array(get_ext($til),$valid_types))
Avatar billede dotcom1 Nybegynder
26. marts 2005 - 00:16 #17
Yes! Så virker det! :) Utroligt at det gav mening det sidste. Jeg har meget at lære. Du skal have tusind tak for din hjælp. :)
Avatar billede bromer Nybegynder
26. marts 2005 - 00:19 #18
Det var så lidt
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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