• 21-04-2022, 20:26:45
    #1
    Daha öncede bu konuda bazı önerilerde bulunmuştum. finfo fonksiyonunun biraz daha güvenliği olduğunu öne sürmüştüm.

    Fakat bu fonksiyonunda manipuleye çok açık olduğunu farkettim.

    Şimdi bir resim upload işleminin güvenliğini sağlamak için yapacaklarımıza bakalım.

    <?php
    
    
    // file extension ( Dosya uzantı kontrolü - En Kötüsü )
    
    $mime = end(explode('.','test.gif')); // VALID GIF
    
    print_r($mime); // .gif
    
    // getimagesize ( Dosyanın resim çıktısını almak - Kötünün iyisi )
    
    $mime = getimagesize('test.gif')['mime']; // VALID GIF
    
    print_r($mime); // image/gif
    
    // FINFO ( Dosyanın mime yani dosya türünü almak - Biraz daha iyi )
    
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, 'test.gif'); // VALID GIF
    
    print_r($mime); // image/gif
    
    ?>
    Ama yukarıdaki seçeneklerin tamamı manipuleye açık.

    GIF89
    <?php
    Örnek bu dosyada image/gif olarak dönecektir.

    Peki bunu biraz daha zorlarsak ne yapabiliriz ? Dosyanın içeriği üzerinden ilgili dosya türüne göre bir resim oluşturmayı deneyebiliriz bellekte.

    <?php
    
    $im = @imagecreatefromgif(file_get_contents('test.gif'));
    
    if($im)
    {
    	echo 'Resim başarıyla oluşturuldu!';
    }
    else
    {
    	echo 'Resim oluşturma başarısız oldu!';
    }
    
    ?>

    Hadi resimleri bu şekilde hallettik ama diğer dosyalarda ne yapacağız ? PHP nin bu konuda doğrulama sisteminin oldukça zayıf olduğunu söylemeliyim. ( Araştırmalarım bunu gösteriyor )

    Bu konuda bir beyin fırtınası yapalım dedim önerisi olan arkadaşlar yazabilirmi ?
  • 21-04-2022, 20:31:05
    #3
    Stack overflow müdavimi olarak bunu biliyorum ve cevaplar hem eski hemde artık geçerli değil. Orada yazılanların tamamını konuda örnek olarak zaten belirttim
  • 21-04-2022, 20:35:34
    #4
    Riga adlı üyeden alıntı: mesajı görüntüle
    Stack overflow müdavimi olarak bunu biliyorum ve cevaplar hem eski hemde artık geçerli değil. Orada yazılanların tamamını konuda örnek olarak zaten belirttim
    Konuda yazılanlarda bırakın tamamını 1 tanesi bile yok orada paylaşılanların hocam;

    1) Fotoğrafları/Resimleri upload ettiğiniz klasörde .htaccess ile resim dışındaki tüm dosyaların çalışmasını engelleyin.
    2) Yalnızca .jpg , .jpeg, veya hangi uzantı lazımsa onun yüklenmesine izin verin.
    3) File Type Olarak Sadece Resim İsteyin.
    4) Yüklenen tüm resimleri GD ile düzenleyip düzenlemiş halini kaydedin.
    5) Yüklenen tüm resimlere random isim gönderin.
    6) Bunun gibi onlarca yol var, bunları uyguladıktan sonra güvenli bir kütüphane kullanabilirsiniz.
  • 21-04-2022, 20:37:00
    #5
    dosya yükleme dizinlerinde htaccess yada nginx ayarlarında php gibi scriptlerin çalışmasını engelle. her ihtimale karşı bi şekilde yüklemw yapılmış olsa dahi çalışmadıktan sonra amacına ulaşmasını engelleyebilirsin
  • 21-04-2022, 20:37:42
    #6
    Riga adlı üyeden alıntı: mesajı görüntüle
    Daha öncede bu konuda bazı önerilerde bulunmuştum. finfo fonksiyonunun biraz daha güvenliği olduğunu öne sürmüştüm.

    Fakat bu fonksiyonunda manipuleye çok açık olduğunu farkettim.

    Şimdi bir resim upload işleminin güvenliğini sağlamak için yapacaklarımıza bakalım.

    <?php
    
    
    // file extension ( Dosya uzantı kontrolü - En Kötüsü )
    
    $mime = end(explode('.','test.gif')); // VALID GIF
    
    print_r($mime); // .gif
    
    // getimagesize ( Dosyanın resim çıktısını almak - Kötünün iyisi )
    
    $mime = getimagesize('test.gif')['mime']; // VALID GIF
    
    print_r($mime); // image/gif
    
    // FINFO ( Dosyanın mime yani dosya türünü almak - Biraz daha iyi )
    
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, 'test.gif'); // VALID GIF
    
    print_r($mime); // image/gif
    
    ?>
    Ama yukarıdaki seçeneklerin tamamı manipuleye açık.

    GIF89
    <?php
    Örnek bu dosyada image/gif olarak dönecektir.

    Peki bunu biraz daha zorlarsak ne yapabiliriz ? Dosyanın içeriği üzerinden ilgili dosya türüne göre bir resim oluşturmayı deneyebiliriz bellekte.

    <?php
    
    $im = @imagecreatefromgif(file_get_contents('test.gif'));
    
    if($im)
    {
        echo 'Resim başarıyla oluşturuldu!';
    }
    else
    {
        echo 'Resim oluşturma başarısız oldu!';
    }
    
    ?>
    Hadi resimleri bu şekilde hallettik ama diğer dosyalarda ne yapacağız ? PHP nin bu konuda doğrulama sisteminin oldukça zayıf olduğunu söylemeliyim. ( Araştırmalarım bunu gösteriyor )

    Bu konuda bir beyin fırtınası yapalım dedim önerisi olan arkadaşlar yazabilirmi ?
    En güvenli yaklaşım, resim dosyası içinde MZ veya PHP veya ELF-SH taglerini araştırmak.
    MZ - .exe için
    PHP - .php için
    ELF - Linux executable
    SH - *nix executable

    Bir resim günümüzde eğer tarayıcı sandboxu dışına çıkamıyorsa sunucuyu hedefleyecektir(çoğu zaman, %99.99 oranında) ve en yaygın olarak dosyanın içine php kodu yerleştirip sunucunun açıklarından faydalanmak isteyecektir.
    Yazılımları güncel tutmak kadar bu tip önlemleri de dosyayı yüklerken kontrol ettirmek çözüm olabilir ama tamamen projeye bağlı.
  • 21-04-2022, 20:39:23
    #7
    Teom4n adlı üyeden alıntı: mesajı görüntüle
    Konuda yazılanlarda bırakın tamamını 1 tanesi bile yok orada paylaşılanların hocam;

    1) Fotoğrafları/Resimleri upload ettiğiniz klasörde .htaccess ile resim dışındaki tüm dosyaların çalışmasını engelleyin.
    2) Yalnızca .jpg , .jpeg, veya hangi uzantı lazımsa onun yüklenmesine izin verin.
    3) File Type Olarak Sadece Resim İsteyin.
    4) Yüklenen tüm resimleri GD ile düzenleyip düzenlemiş halini kaydedin.
    5) Yüklenen tüm resimlere random isim gönderin.
    6) Bunun gibi onlarca yol var, bunları uyguladıktan sonra güvenli bir kütüphane kullanabilirsiniz.
    O soru en az cevabı içeren bir soru stack overflow tarafında. Diğer sorularda örneklerin tamamını görebilirsiniz öneri olarak.

    Evet en son noktada gd kullanabiliriz sadece bellektede bunu yapabiliriz dosyayı kaydetmek farklı bir seçenek.

    Ama amacımız sadece resim değil bunu unutmamak gerekli. Örnek olarak bir çok adobe dosyasını algılamaz veya diğer çok fazla kullanılmayan dosya tiplerini tanımaz ( örnek verilen fonksiyonlar ).

    Ben buraya biraz daha dikkat çekmek istedim.
  • 21-04-2022, 20:42:13
    #8
    Riga adlı üyeden alıntı: mesajı görüntüle
    O soru en az cevabı içeren bir soru stack overflow tarafında. Diğer sorularda örneklerin tamamını görebilirsiniz öneri olarak.

    Evet en son noktada gd kullanabiliriz sadece bellektede bunu yapabiliriz dosyayı kaydetmek farklı bir seçenek.

    Ama amacımız sadece resim değil bunu unutmamak gerekli. Örnek olarak bir çok adobe dosyasını algılamaz veya diğer çok fazla kullanılmayan dosya tiplerini tanımaz ( örnek verilen fonksiyonlar ).

    Ben buraya biraz daha dikkat çekmek istedim.
    Dosyalar sunucu ve client taraflı çalışmayacaksa işlemler hiç fark etmiyor
  • 21-04-2022, 20:51:34
    #9
    Teom4n adlı üyeden alıntı: mesajı görüntüle
    Dosyalar sunucu ve client taraflı çalışmayacaksa işlemler hiç fark etmiyor
    Evet ama dediğim gibi sadece resim upload işlemi yaptırmıyoruz ki Bugün excel, word v.b dosya tipleride çoğu zaman kullanıcıdan alınır.


    Yani en basitinden bir upload sitesi yazdığınızı düşünün. Burada amacımız ilgili dosyanın gerçekten beklenen ve istenen dosya türüne sahip olduğunu doğrulamak ve bu konuyu geliştirmek. Yukarıda sayılan manipulasyonları yaparak sunucudaki disk boyutu gereksiz bir şekilde kullanılabilir.

    Özellikle php bu konuda oldukça geri kalıyor bilmiyorum belkide bu konuda yeni geliştirmeler yapılıyor olabilir.