Avatar billede silmarillion Juniormester
20. september 2009 - 18:34 Der er 9 kommentarer og
1 løsning

Validering af filtype

Hej Eksperter,

Her er et script der virker som det er, men jeg vil gerne have det til kun at acceptere css filer, ikke billedfiler.

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 200000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>





Jeg har forsøgt at ændre

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 200000))

til:

if (($_FILES["file"]["type"] == "text/css")
&& ($_FILES["file"]["size"] < 200000))

Men får fejlbeskeden "Invalid file"

Er der nogen der kan sige hvad jeg gør galt?
Avatar billede olebole Juniormester
20. september 2009 - 19:34 #1
<ole>

$a = explode(".", $_FILES["file"]["name"]);
if (end($a)=="css") {
    // CSS-fil
}

/mvh
</bole>
Avatar billede cot Nybegynder
20. september 2009 - 19:39 #2
hejsa :)

det virker helt fint for mig, hvis jeg bare ændrer det til text/css:

<form name="form1" enctype="multipart/form-data" method="post" action="">
    <input type="file" name="file" id="upload">
<br/>
    <input type="submit" name="button" id="button" value="Upload!">
</form>

<?php
if(isset($_POST['button'])){
if ((($_FILES["file"]["type"] == "text/css"))
&& ($_FILES["file"]["size"] < 200000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
  }
?>


Ved upload kommer denne melding:
Upload: pollmaker.css
Type: text/css
Size: 1.0322265625 Kb
Temp file: /var/www/tmp/php7BNNdm
Stored in: upload/pollmaker.css
Avatar billede olebole Juniormester
20. september 2009 - 20:03 #3
Ja, men så udsætter du dig for seriøs ballade! Jeg kan uploade en eksekverbar fil med faked MIME-typen - men en fil, der ender på .css kan aldrig eksekveres  ;o)
Avatar billede olebole Juniormester
20. september 2009 - 20:04 #4
- og det betyder, at hvis du tester på MIME-typen, kan jeg slette alt på din server  ;o)
Avatar billede cot Nybegynder
20. september 2009 - 20:15 #5
Hehe ok :)
Kan det samme så ikke gøres for mime-typen image/gif f.eks.?
Avatar billede silmarillion Juniormester
20. september 2009 - 20:20 #6
@ cot, mærkligt det ikke virker hos mig.

@ olebole, sikkerheden skal naturligvis være i orden, udover at uploade filen, skal der også gemmes en titel i en mysql database, så jeg er gået over til et script der ser ud som følger:

$path_to_directory = 'CSS_upload/';

if(isset($_FILES['fil'])) { 
     
    if(preg_match('/[.](css)$/', $_FILES['fil']['name'])) { 
         
        $filename = $_FILES['fil']['name']; 
        $source = $_FILES['fil']['tmp_name'];     
        $target = $path_to_directory . $filename; 
         
        move_uploaded_file($source, $target); 
         
    } 


if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "css_uploader")) {
  $insertSQL = sprintf("INSERT INTO styles (navn, filnavn) VALUES (%s, %s)",
                      GetSQLValueString($_POST['navn'], "text"),
                      GetSQLValueString($_FILES['fil']['name'], "text"));


Hvordan vil du vurdere sikkerheden her?
Hvis der kun skal skrives data i databasen, hvis det er en css fil, hvordan ville du skrive det?

Som det er nu uploader den kun, hvis det er en css fil, men den skriver filnavnet og titlen i databasen, selv hvis man forsøger at uploade en fil af en anden type.
Avatar billede olebole Juniormester
20. september 2009 - 23:31 #7
Du skal bare have din database indsættelse ind under betingelsen:

if(preg_match('/[.](css)$/', $_FILES['fil']['name'])) {

Så ville jeg nok kikke på mysqli, som sammen med prepared statements er langt sikrere i forhold til SQL-injection:
    http://dk2.php.net/manual/en/book.mysqli.php
    http://dk2.php.net/manual/en/mysqli-stmt.prepare.php
Avatar billede silmarillion Juniormester
21. september 2009 - 23:29 #8
Det virker fint nu, tak for hjælpen olebole, smid  et svar, så får du point.
Avatar billede olebole Juniormester
21. september 2009 - 23:57 #9
Selvtak  =)
Avatar billede olebole Juniormester
22. september 2009 - 22:29 #10
- og tak for points  =)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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