Php ve Cloud Files ile kullanıcı dosyalarını saklama

Yaptığınız bir projede kullanıcı dosyalarının izinsiz görüntülenmesi

ni engellemek için yapmanız gereken şey tüm dosya isteklerini yazılım aracılığı ile karşılamak olacaktır. Ben de basitçe Rackspace Cloud Files kullanarak güvenli dosya saklama ve gösterme konusunu anlatmaya çalışacağım.

Öncelikle Rackspace OpenCloud kütüphanesini composer ile kurduğunuzu varsayıyorum. İlgili linkte nasıl yapılacağı anlatılmış zaten.

Örnek kodun çalıştığı örnek url şu olsun: sitem.com/resim.php?f=resim.jpg&uid=1

Bu url aracılığı ile 1 id’li kullanıcıya ait resim.jpg dosyasını almak istiyoruz. Tabi burda siz kullanıcı resimlerini ne şekilde tutacağınızı bilmeniz gerekiyor. CloudFiles container bazlı çalışan object storage olmasına rağmen hiyerarşik dizin yapısına izin veriyor. Fakat hangi kullanıcının ne kadar alan kapladığını filan sizi ilgilendiriyorsa kullanıcı bazlı container açmanızda fayda var. Örneği anlatırken kullanıcı bazlı container yapısı üzerinden gideceğim.

Örnek kodlar ve açıklamaları şu şekilde.

if($_SESSION['user_id']!=$_GET['uid']){
//basit bir session kontrolü
die;
}
$rs_conn = new OpenCloud\Rackspace(OpenCloud\Rackspace::US_IDENTITY_ENDPOINT, array(
'username' => USER_NAME,
'apiKey' => API_KEY
));
// cloudfiles apisi ve   
// (Blacksburg, VA, US) datacenter'ına bağlanıyoruz
$rs = $rs_conn('cloudFiles','IAD');
// Kullanıcı email'i ile container oluşturduğumuz için bu şekilde containerı çağırıyoruz
$container = $rs->getContainer($_SESSION['email']);
// urlden dosya adını alıyoruz
$object = $container->getObject($_GET['f']);
// Bu dosya genele kapalı olduğu için 1dk boyunca geçerli olacak //(bunu daha kısa süre yapabilirsiniz) geçici url adresini alıyoruz.
$imageUrl = $object->getTemporaryUrl(60, 'GET');
//header bilgisi için mime type alıyoruz. getimagesize fonksiyonu //resim hakkında boyut gibi bilgileride vermekte.
$imginfo = getimagesize($imageUrl);
// Son olarak header bilgisini ayarlayıp resmi ekrana basıyoruz.
header("Content-type: ".$imginfo["mime"]);
readfile($remoteImage);

Basit bir örnek olduğu için oturum yönetimini filan basit tuttum. Resim sadece kullanıcının kendisine açık olduğu için geçici url oluşturarak resmi kullanıcıya gösterebiliyoruz.

Benzer mantığı veri tabanında yetki tablosu oluşturarak kullanıcının dosyayı/resmi belirlediği üyeler/email adresleri ile paylaşmasına imkan sağlayabiliriz. Geçici url süresini kullanıcıya seçtirerek istediği sürede ilgili dosyaya erişimi açabiliriz.

Cloudfiles dosya bazlı cdn hizmeti vermiyor malesef. Eğer kullanıcılara süresiz public yapma şansı vermek istiyorsanız yine dosya metadatasını tuttuğunuz tabloya genele açık olup olmadığını belirten bir alan koyup yetkilendirme yapabilirsiniz.