v2.5.2
Giriş yap

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

azizdmrr
680 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.-

tayfunerbilen
1251 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ş';
}