Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Helppo Upload

Quirzo [27.12.2006 11:34:17]

#

Ajattelin tehdä kunnollisen, yksinkertaisen ja pienen uploadin, joka kuitenkin toimii kunnolla ja ei sisällä tietoturva -aukkoja. Jos kuitenkin löydätte niitä, kertokaa ja korjaan heti.

Päivitykset
----------
28.12.2006 -> Tiedostot, joissa välilyöntejä, toimivat.

<?php
####################################################
#                Quirzon Upload -skripti           #
#                Versionumero:1.0                  #
####################################################
#                Päivitykset                       #
#    -23.12.2006 Aloitettu skriptin tekeminen      #
#    -27.12.2006 Julkaistu ohjelmointiputkassa     #
####################################################


    //Asetukset

        $sallitut = array("jpg","png","bmp","gif","jpeg");  //Sallitut tiedostomuodot
        $kohde    = "upload/";                              //Kansio, johon tiedostot tallennetaan
        $url      = "http://www.sivuni.com/upload/";        //Kansion koko URL -osoite (MUISTA KAUTTAVIIVA LOPPUUN)
        $koko     = "1024";                                 //Koko kilotavuina (kt) [Yksi megatavu on 1024 kilotavua!]
        $tiednimi = "upload.php";                           //Tämän tiedoston nimi

    //Älä koske tähän koodiin, ellet osaa php -ohjelmointikieltä. (Alempanana on muokattavaa)
        $koko2 = $koko * 1024;

    if(isset($_POST['StartUpload'])){

        if($_FILES["file"]["name"] == ""){
            Error("Ei tiedostoa!");
        }
            //Tarkistetaan tiedoston koko
            if($_FILES["file"]["size"] > $koko2){
                $tiedkoko = round($_FILES["file"]["size"] / 1024,2);
                Error("Tiedosto on liian suuri!<br/>Suurin sallittu koko : $koko kt<br/>Tiedostosi koko : $tiedkoko kt");
            }

            //Tarkistetaan pääte
            $temp = explode(".",$_FILES["file"]["name"]);
            $maara = count($temp) - 1;

            if(!in_array(strtolower($temp[$maara]),$sallitut)){
                Error("Tiedoston pääte ei ole sallittu. Kokeile tallentaa tiedosto eri muotoon<br/><u>Päätteesi oli .$temp[$maara]");
            }

            //Kun kaikki on tarkistettu ja ei virheitä, tarkastetaan tiedoston olemassaolo
            $nimi = $_FILES["file"]["name"];
            while(file_exists($kohde.$nimi));
            {

                $nimi = rand(100,900).$_FILES["file"]["name"];

            }
                  //Poistetaan tyhjät
            $nimi = str_replace(" ","_",$nimi);
                  //Tarkistetaan kansio
            if(!is_dir($kohde)) exit("Kansiota $kohde ei ole olemassa, se pitää olla luotu.");

            //Siirretään tiedosto sijaintiin
             move_uploaded_file($_FILES['file']['tmp_name'], $kohde.$nimi);
             chmod($kohde.$nimi,0755);

             //Tässä on sivun koodi, joka näkyy kun on uploadattu
             //[MUOKKAA, JOS HALUAT]
             echo'

             <h3>Kuva on nyt siirretty!</h3><br/>
                            <form name="formi">
                            <b><u>Uploadatun tiedoston URL -osoite</u></b><br/>
                            <input type="text" size="60" width="60" value="'.$url.$nimi.'" name="url" onClick="javascript:document.formi.url.focus();document.formi.url.select();" readonly="true"\><br/>

                            </form>

                        <a href="'.$tiednimi.'"><--Takaisin</a>
            ';
    }
    else{
            //Tässä on sivun koodi, joka näkyy alussa.
            //[MUOKKAA, JOS HALUAT]
            echo'
                        <strong>Upload</strong><p>
                        <form enctype="multipart/form-data" name="formi" action="'.$tiednimi.'" method="post">
                            <input type="file" name="file">
                            <input type="hidden" name="MAX_FILE_SIZE" value="'.$koko2.'"> <br/>
                            <input type="submit" name="StartUpload" value="Siirrä">
                        </form>
                        <b>Sallitut tiedostopäätteet</b><br/>
                        ';
                //Luetellaan sallitut tiedostopäätteet
                foreach($sallitut as $arvo){
                    echo "$arvo, ";
                }


    }
                //virheilmoitus -funktio
                //[MUOKKAA, JOS HALUAT]
    function Error($msg){
        exit('<strong>Siirto keskeytyi virheen takia...</strong><br/>
              <u>Tietoa virheestä:</u><br/>
              '.$msg.'<p><small><i>'.$omistaja.'</small></i>');
    }
?>

Quirzo [27.12.2006 11:35:00]

#

Ja lisätään vielä, että tämä on ensimmäinen koodivinkkini, ja sisennykset yms. eivät välttämättä ole parhaita.
Otan vinkkejä vastaan.

Miten tämän saisi korjattua, että se muuttaisi nimeä VAIN jos tiedosto on olemassa?

//Kun kaikki on tarkistettu ja ei virheitä, tarkastetaan tiedoston olemassaolo
         $nimi = $_FILES["file"]["name"];
         while(file_exists($kohde.$nimi));
         {

             $nimi = rand(100,900).$_FILES["file"]["name"];

         }

Quirzo [28.12.2006 19:53:01]

#

Päivitetty, lisätty tuki tiedoistoille, joissa on välilyönti.
(Muuttaa tyhjät alaviivoiksi.)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta