Oprettet fre. d. 25. marts 2005 kl. 22:22:00

dotcom1
dotcom1 (19.399 point. Point ude: 0)

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/ (...)
*/

/**
* 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/ (...)
    */
    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. :)

Skrevet fre. d. 25. marts 2005 kl. 22:54:37| #1

dotcom1
dotcom1 (19.399 point)
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/ (...)
        <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");

?>

Skrevet fre. d. 25. marts 2005 kl. 22:57:05| #2

bromer
bromer (37.497 point)
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/ (...)
[2] http://www.asahi-net.or.jp/ (...)

Skrevet fre. d. 25. marts 2005 kl. 23:16:37| #3

dotcom1
dotcom1 (19.399 point)
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.

Skrevet fre. d. 25. marts 2005 kl. 23:20:25| #4

bromer
bromer (37.497 point)
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;

Skrevet fre. d. 25. marts 2005 kl. 23:29:29| #5

dotcom1
dotcom1 (19.399 point)
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.

Skrevet fre. d. 25. marts 2005 kl. 23:32:25| #6

bromer
bromer (37.497 point)
hvilken PHP version benytter du? (du kan få det enten via phpinfo() [1] eller phpversion() [2]

[1] http://dk.php.net/ (...)
[2] http://dk2.php.net/ (...)

Skrevet fre. d. 25. marts 2005 kl. 23:34:52| #7

dotcom1
dotcom1 (19.399 point)
phpinfo(): PHP Version 4.1.2

Skrevet fre. d. 25. marts 2005 kl. 23:40:30| #8

bromer
bromer (37.497 point)
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;

Skrevet fre. d. 25. marts 2005 kl. 23:46:21| #9

dotcom1
dotcom1 (19.399 point)
Okay, får parse error i denne linie: 
if (!in_array(get_ext($fra)),$valid_types))

Har sat funktionen ind øverst.

Skrevet fre. d. 25. marts 2005 kl. 23:48:42| #10

bromer
bromer (37.497 point)
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))

Skrevet fre. d. 25. marts 2005 kl. 23:53:06| #11

dotcom1
dotcom1 (19.399 point)
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...

Skrevet fre. d. 25. marts 2005 kl. 23:59:52| #12

bromer
bromer (37.497 point)
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

Skrevet lør. d. 26. marts 2005 kl. 00:04:12| #13

dotcom1
dotcom1 (19.399 point)
Den gør godt nok samme fejl stadigvæk...

Skrevet lør. d. 26. marts 2005 kl. 00:06:21| #14

bromer
bromer (37.497 point)
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);

Skrevet lør. d. 26. marts 2005 kl. 00:11:44| #15

dotcom1
dotcom1 (19.399 point)
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");

Skrevet lør. d. 26. marts 2005 kl. 00:13:33| #16

bromer
bromer (37.497 point)
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))

Skrevet lør. d. 26. marts 2005 kl. 00:16:53| #17

dotcom1
dotcom1 (19.399 point)
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. :)

Skrevet lør. d. 26. marts 2005 kl. 00:19:05| #18

bromer
bromer (37.497 point)
Det var så lidt

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Brugerliste med link til profil

Oprettet den 26. maj 2012 kl. 14.29
sayn giver 30 point for svar | Giv et svar »

php curl driller

Oprettet den 26. maj 2012 kl. 08.31
PHPnQrd giver 200 point for svar | Giv et svar »

Array i array

Oprettet den 25. maj 2012 kl. 08.32
sebster giver 60 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger