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>');
}
?>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"];
}Päivitetty, lisätty tuki tiedoistoille, joissa on välilyönti.
(Muuttaa tyhjät alaviivoiksi.)
Aihe on jo aika vanha, joten et voi enää vastata siihen.