dosya için dize dezenfektanı

11 Cevap php

Ben bir dize dezenfekte ve bir dosya adı kullanmak için hazır hale getirecek bir php fonksiyonu arıyorum. Herkes kullanışlı bir birini biliyor musun?

(Ben bir tane yazabilirim, ama ben bir karakteri göz ardı edeceğiz endişeleniyorum!)

Düzenleme: Windows NTFS dosya sisteminde dosyaları kaydetmek için.

11 Cevap

Bunun yerine karakterleri bakan endişesi - nasıl bir karakter beyaz liste kullanılmasıyla ilgili kullanılacak mutlu musun? Örneğin, sadece iyi ol 'a-z, 0-9, _ izin verebilir ve bir dönem tek bir örneği (.) . Tabii ki en dosyasistemlerinden daha sınırlayıcı fazla, ama güvenli tutmak gerekir.

Dominic Rodger tarafından fark sorunu çözmek için Tor Valamo çözümü için küçük bir ayar yapma, sen could kullanın:

preg_replace("([^\w\s\d\-_~,;:\[\]\(\].]|[\.]{2,})", '', $file)
preg_replace("[^\w\s\d\.\-_~,;:\[\]\(\]]", '', $file)

Ekle / sistem için izin ne bağlı olarak daha fazla geçerli karakterleri kaldırın.

Alternatif dosyası oluşturmak için deneyin ve o zaman kötü eğer bir hata döndürebilir.

Aşağıdaki ifade, güzel, temiz ve kullanışlı dize oluşturur:

/[^a-z0-9\._-]+/gi

today's financial: billing dönüşüyor today-s-financial-billing

Peki, tempnam () sizin için yapacak.

http://us2.php.net/manual/en/function.tempnam.php

ama bu tamamen yeni bir adı oluşturur.

Varolan bir dize sterilize etmek için sadece kullanıcının girebileceği ne kısıtlamak ve harfler, sayılar, dönem, tire yapmak ve basit bir regex ile sterilize sonra altını çiziyor.

$sanitized = preg_replace('/[^a-zA-Z0-9-_\.]/','', $filename);

/ ve .. kullanıcı sağlanan dosya adı zararlı olabilir. Böylece gibi bir şey bu kurtulmak gerekir:

$fname = str_replace('..', '', $fname);
$fname = str_replace('/',  '', $fname);

What about using rawurlencode() ? http://www.php.net/manual/en/function.rawurlencode.php

İşte hatta Çin karakterl sterilize bir fonksiyonudur:

public static function normalizeString ($str = '')
{
    $str = strip_tags($str); 
    $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
    $str = preg_replace('/[\"\*\/\:\<\>\?\'\|]+/', ' ', $str);
    $str = strtolower($str);
    $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
    $str = htmlentities($str, ENT_QUOTES, "utf-8");
    $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
    $str = str_replace(' ', '-', $str);
    $str = rawurlencode($str);
    $str = str_replace('%', '-', $str);
    return $str;
}

İşte açıklamamlar olduğunu

  1. Strip HTML Etiketler
  2. Kaldır Break / Sekmeler / Return Taşıma
  3. Klasör ve dosya için Yasadışı karakterl kaldır
  4. Alt durumda dize koymak
  5. Html varlıklar haline dönüştürmek böyle EAU gibi yabancı aksan kaldırmak ve daha sonra kodunu kaldırmak ve mektubu saklayınız.
  6. Tire ile Spaces değiştirin
  7. Önceki adımları geçmek ve sunucu üzerinde çatışma dosya içinde girebilir özel karakter Encode. ex. "中文 百强 网"
  8. Inci dosyayı sorgularken dosyanın bağlantı tarayıcı tarafından yeniden yazılamaz olmayacak emin olmak için tire ile "%" değiştirin.

Tamam, bazı dosya releavant olmayacak ama çoğu durumda işe yarayacaktır.

ex. Original Name: "საბეჭდი-და-ტიპოგრაფიული.jpg"

Çıkış Adı: "-E1-83-A1-E1-83-90-E1-83-91-E1-83-94-E1-83-AD-E1-83-93-E1-83-98--E1-83-93-E1-83-90--E1-83-A2-E1-83-98-E1-83-9E-E1-83-9D-E1-83-92-E1-83-A0-E1-83-90-E1-83-A4-E1-83-98-E1-83-A3-E1-83-9A-E1-83-98.jpg"

Bu bir 404 hata daha böyle iyi.

Bu yardımcı oldu umuyoruz.

Carl.

tek yön

$bad='/[\/:*?"<>|]/';
$string = 'fi?le*';

function sanitize($str,$pat)
{
    return preg_replace($pat,"",$str);

}
echo sanitize($string,$bad);

Tek nokta için izin Sean Vieira çözümü için küçük bir ayar yapma, sen kullanabilirsiniz:

preg_replace("([^\w\s\d\.\-_~,;:\[\]\(\]]|[\.]{2,})", '', $file)

Her zaman explorer bir dosya adlandırma ve benzeri bir mesajla açılır geçersiz bir karakter basarak izin verilmeyen dosya adlarında hangi karakterleri bulabiliriz "Bir dosya adı aşağıdaki karakterlerden herhangi birini içeremez: ..."

$ Fname = str_replace ('/','', $ fname);

Kullanıcılar iki kelime ayırmak için eğik çizgi kullanabilirsiniz beri yerine null bir çizgi ile değiştirmek için daha iyi olurdu