Dosya doğrulama hakkında iş en iyi yöntem nedir?

5 Cevap php

Ben bir "Dilema" var ve en iyi uygulama iş ne olduğunu merak ediyorum.

Ben fotoğraf yüklemek için Uploadify kullanıyorum. Şimdi dosyayı kaydetmeden önce dosya doğrulamak gerekir.

Ben farklı çözümler baktım, ama iyi bir çözüm aşağı alınamıyor.

İşte benim kriterler şunlardır:

  • Dosya adı küçük harflerle bütün olmalıdır
  • Dosya adı, yalnızca charaters içerebilir [a-z0-9_-]
  • Ben dosyayı yeniden adlandırmak gerekir

Nasıl bir dosya olup olmadığını hakkında gitmek my.file(name).jpeg?

Ben dosya patlayabilir. ' ve uzantısı kaydedin, sonra tekrar dosya almak için patlar. Ama emin değilim iyi soltion eğer.

Ben biraz yardımcı aşağıdaki işlevlere sahiptir:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
}

UPDATE 1
I'm recieving the file through $_FILES. This gives me the following data:

  • $ _FILES ["File"] ["name"] - yüklenen dosyanın adı
  • $ _FILES ["File"] ["type"] - yüklenen dosya türü
  • $ _FILES ["File"] ["size"] - yüklenen dosyanın bayt olarak boyutu
  • $ _FILES ["File"] ["tmp_name"] - sunucuda saklanan dosyanın geçici bir kopyasını adı
  • $ _FILES ["File"] ["error"] - dosya yükleme kaynaklanan hata kodu

UPDATE 2
I just found something. I could use getimagesize which will return an array of 7 elements. One of these elements [2] is IMAGETYPE_XXX.

Yani bu kodu kullanmayı deneyin:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

Ama sadece 2 sayısını verir ...

(Ben de exif_imagetype kullanarak çalıştı, ancak yalnızca olsun PHP Error: Call to undefined function.)

5 Cevap

Regexp ile dosya adını denetleyin. Mime türünde hakkında bilgi kullanın. Md5 adı ile sunucuya dosya kaydedin. Db gerçek dosya saklayın.

pathinfo() size dosya adını ve uzantısını alabilirsiniz. Ancak, onun dosya incelenmesi yoluyla bir dosyanın uzantısı test dayanmaz ki sizi uyarır. Aslında bu bir dosyanın ikili içeriğini denetleyen bir işlevi kullanmak isteyeceksiniz. finfo_file() gerçekleştirebilirsiniz. Oh, ve bir yol geçişi saldırıyı önlemek için bir kullanıcı tarafından sağlanan dosya yolunda basename() kullanmak asla acıyor.

Ben indirmek dosya adları olarak daha sonra kullanmak için dosya adlarını doğrulayarak varsayarak yaşıyorum.

Onlar teknik açıdan kullanıcının uğruna, gibi dosya adları korumak için büyük olacağını ise, sizin yaklaşım ses geliyor.

Eğer URL'ler gibi ne umurumda ve gelecekte uluslararası bir kitleyi hedef olabilir, bunların baz karakter umlauts dönüştürmek ya da onları dönüştürmek için emin olun. Bir Alman kullanıcı (Sesli harfler Ä Ö Ü ß) dönüşüm beklediğiniz:

Ä = ae
Ö = oe
Ü = ue

İskandinavlar ile rahat gibi görünüyor ise

Ä => a
Ö => o
Ø => o

ve benzerleri.

Ardından çeşitli aksanlı karakterler é á ó vardır ...

Bu bırakarak tamamen bwsr adres br really bd ve lok strng bakmak URL'ler yol açar.

Bu istediğiniz her şeyi yapmalıdır:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

Eğer dosya adı tüm vurgulamalar yerine istiyorsanız Pekka açıkladığı gibi, sen şu işlevi kullanabilirsiniz:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

Ben bunu size istediğiniz formatta değilse dosya, sen sadece "düzeltmek" gerektiğini "doğrulamak" gerektiğini sanmıyorum. Birisi kendi dosyaları adlandırma de berbat, ya da orada bazı sıradışı karakterler var sırf Neden bir dosyayı reddetmek? Eğer görüntüleri ile çalışıyorsanız eğer aslında (bir görüntü değilse başarısız olmalı) yüklendiği bir görüntü olduğundan emin olmak için Ayrıca, belirtildiği gibi, sen getimagesize kullanabilirsiniz.