v2.5.2
Giriş yap

PHP base64 biçiminde png resim için güvenlik

azizdmrr
577 defa görüntülendi

Çalışma sistemim tam olarak şu şekilde;

HTML kısmında <img type="file" name="resim"> şeklinde bir adet resim yükleme kısmım var.
Ardından bunu jquery'nin "croppie" eklentisi ve bootstrap'ın da yardımlarıyla base64'e çevirip bunu php'de parçalayarak almak istiyorum

Örnek bir kullanımı burada mevcut.

<?php

if(isset($_POST["resim"])){

header ('Content-type: image/png');
 $data = $_POST["resim"];
 $image_array_1 = explode(";", $data);
 $image_array_2 = explode(",", $image_array_1[1]);
 $data = base64_decode($image_array_2[1]);
 $imageName =  md5(time().rand(0,99999).rand(0,9999)) . '.png';

 file_put_contents($imageName, $data);

 print_r($imageName);
}

Biliyorum ki bu şekilde paylaşırsam saldırı altında olacağım. En basit yöntemle header("") fonksiyonu veya .htaccess ile kurtulabilir miyim? Yoksa çok ekstra bir koruma yapmazsam shell atağı yer miyim diye endişelendiğim için yardım almak istedim. Sizin önerileriniz nelerdir?

-Şimdiden teşekkür ediyorum.-

Cevap yaz
Cevaplar (2)
tayfunerbilen
1064 gün önce

İlk kontrolün gönderilen base64'ün geçerli bir base64 olup olmadığı olabilir. Bunun içinde base64_decode() fonksiyonunda 2. parametreye true verip tekrar base64_encode() ile base64'e çevirip gönderilenle eşleşip eşleşmediğine bakacaksın. Yani;

Not: base64 başındaki data:image/(png|jpg|jpeg|webp);base64, değerlerini replace etmeyi unutma bu arada.

$base64_string = 'gönderilen base64 değer';

$base64_check = base64_encode(base64_decode($base64_string, true));
if ($base64_check === $base64_string) {
    // geçerli bir base64 gönderilmiş
} else {
    // hatalı bir base64 gönderilmiş
}

Bir diğer bakacağın ise, bu base64'den imagecreatefromstring() ile görseli oluşturup oluşturamadığına bakmak olabilir.

$base64_string = 'gönderilen base64 değer';

$image = imagecreatefromstring(base64_decode($base64_string));
if (!$image){
    // gönderilen bir resim değil
} else {
    // gönderilen resim
}

yani kısaca şöyle bir fonksiyon işini çözecektir;

function isValidImage($base64_string)
{

    $base64_check = base64_encode(base64_decode($base64_string, true));

    if ($base64_check !== $base64_string){
        return false;
    }

    $image = imagecreatefromstring(base64_decode($base64_string));
    if (!$image){
        return false;
    }

    return true;

}

$base64_string = 'gönderilen base64 değer';

if (isValidImage($base64_string)) {
    echo 'base64 formatında geçerli bir resim gönderilmiş';
}
kargasa1982
1064 gün önce

Konu ile alakalı değil ama, güvenlik için söylüyorum;

bir sitede (4-12. sınıf) öğrenciler profil resmi ekleyip güncelleyebiliyordu ve güvenlik kısmını atlamıştım. Gerçekten resim dosyasımı değil mi diye bakmıyor sadece uzantıya göre dosyaları klasöre upload ediyordum. Sonra bir gün bir baktım ki uyanığın biri shell yapmış ve resim gibi yüklemiş sonra tabiki çalıştırınca sunucuda gelsin mining gitsin mining. Aslında bazen asıl konuya odaklanınca, çok küçük şeylerden nasıl bir güvenlik zaafiyeti doğacağını unutuyoruz. Bu site işlerinde çok evhamlı olmakta fayda var.