Bu dosya yükleme yöntem PHP ile güvenli mi?

3 Cevap

Ben dosya yükleme için PHP dil kullanmak ve kullanmak aşağıdaki yöntemi güvenli olup bilmek istiyorum?

I am using simple method for file uploading, I check the file name from $_FILES['userfile']['type'] and then if it's having an allowed file extension, I upload the file with some random number. Like if it is abc.zip it may become 8w43x9d.zip.

Lütfen söyle: bu dosya yükleme için gerçekten kötü bir yöntemdir?

3 Cevap

Rasgele oluşturulan güvenli dosya adları kesinlikle iyi bir şey vardır. Ancak yine uzantısı gibi sunucu üzerinde herhangi bir sorun neden olmaz bir şey olduğundan emin olmak gerekir webroot aracılığıyla dosya uzantısını sağlayan ise .php (Tamam, PHP işleme olmalı yükleme dizinleri için web sunucusu devre dışı, ama yine de). Eğer noktalar ve sondaki boşlukları dosya sistemi karıştırmayın bir Windows sunucu üzerinde iseniz sorunları da vardır; Eğer birkaç 'bilinen iyi değerlerine uzantısı kilitlemek emin olun.

Ne yazık ki ['type'] özellik tüm dayanıyordu olamaz. Bazı tarayıcılar kendi işletim sistemleri, bazı iradesini, (bir infamously yararsızdır bir varsayılan Windows üzerinde IE image/pjpeg JPEG çağırır yani) kötü kurmak çünkü başkalarının yanlış türünü koyacağız, bir içerik türü doldurmak değil, Her zaman application/octet-stream hatta text/plain söylüyorlar.

Hatta ['name'] mülkiyet güvenilmez; ayrı bir değer ya da yalan obfuscating tarayıcılardan gelen, belirli bir tür söz konusu makinenin beklenmedik bir dosya uzantısı olacak şans her zaman var. Ya da, Mac ve Linux istemcileri için, bir yüklenen dosya hiç bir uzantıya sahip olmayacak (hatta işletim sistemi olarak görüyor türü için yanlış uzantısı olabilir) tamamen mümkündür.

Yani evet, bu bir karmaşa tüm bir parçasıdır. Content-Type sunulması veya dosya adı türü için koklama ederken uzantısı bir dosya ne olması gerektiği varsayılan tür tahmin etmek için yararlı olabilir, bu tamamen güvenilmez, bu yüzden ek bir dosya türünü seçmek için manuel bir yöntem sağlamak için iyi bir şey. Eğer ek olarak yüklenen dosyaları hizmet vermekteyiz Alternatif olarak, (ayar bir PHP komut dosyası aracılığıyla örneğin Content-Disposition: attachment), genellikle sadece her şeyi application/octet-stream çağıran ve bu tür kullanıcı izin kurtulabiliriz dışarı onlar zaman kaydetmek.

Bir eklenti olarak hizmet değilseniz, bir güvenlik sorunu olabilir. IE mutlu size <html> etiketleri için hizmet ve onlar başka bir şey olduğunu söylemek bile HTML gibi bu dosyaları tedavi birçok dosya türlerini koklayacaktır. Sonra tarayıcıda satır içi onları görüntülemek ve onları güvenlik bağlamında komut dosyası eklemesine olanak olabilir. Eğer kullanıcı hesapları ve kurabiye gibi güvenlik bağlamında önemli bir şey varsa, bu çapraz site betik güvenlik delik. (Tipik olarak, bir alt etki alanı kullanılır) Bunun için geçici çözümler eki ve / veya ana sitenin güvenlik bağlamında değil farklı bir hostname hizmet olarak hizmet vermekteyiz.

Tamamen ortaya çıkıyor sunucuya dosya yüklemek için güvenmediğiniz kullanıcıların aslında PHP öğreticiler önemsiz örnek kod çok daha zor bir görev olarak izin inanmak size yol açacak. :-(

Kimden PHP Manual:

$ _FILES [''] ['Type']

Dosyanın MIME türü, tarayıcı bu bilgiyi sağlaması durumunda. Bir örnek "image / gif" olacaktır. Bu MIME türü PHP tarafında denetlenmez ve hafife bu nedenle değerini yapmayız.

Ben kullanıcı veya kullanıcının tarayıcı bana gönderir şey güven olmaz.

Öğrenmek için çalışıyorsanız, ben böyle ARMUT dan HTTP_Upload gibi mevcut güvenli kaynaklardan bakmak istiyorum. Hatta Beta sürümünü kullanmayı düşünebilirsiniz.

Yukarıda yazılan eklenmesi, biz güvenmek FileInfo veya SplFileInfo, şimdiye kadar bizim ihtiyaçlarımız için en iyi seçenek olduğu kanıtlanmıştır.