31 Ağustos 2016 Çarşamba

[PHP] Dosya Yolunu Vermeden Dosya Paylaşımı

Merhaba, bu yazımda size dosyalarınızın kaynak yolunu vermeden dosyaları indirme yöntemini göstereceğim. Bu şekilde yapılan indirmelerde dosyayı indirme yolu olarak sizin PHP dosyanızın yolu verilecektir. Basit ama çok etkili bir yöntemdir ve bu sayede müzik / film / resim ve daha aklıma bile gelmeyen bir sürü dosya paylaşım veya satış sitelerinde online olarak indirmelerde dosyalarınızı korur, sadece o kişinin o dosyayı indirebilmesini sağlarsınız.

Bu günkü yazımda hem en sade halini, hem de Session ile güvenlikli bir indirmenin yolunu anlayacağız. Session sistemimizde kullanıcının bizim dosyayı indirmesini istediğimiz kullanıcı olup olmadığı ve  belirli bir indirme limiti aşıp aşmadığını test edeceğiz. İlk olarak en basit yolu gösteriyoruz. Burada değerini değiştirmeniz gereken iki değişken vardır. Zaten kodların açıklamalarında neden ve nasıl olduğu gayet net bir şekilde açıklanmıştır.

Sade Versiyon (Kodlar)
?
1
2
3
4
5
6
7
<?php
$DLPath = "Downloads/Secure/";
$DLFile = "File.zip";
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'. $DLFile .'"');
readfile($DLPath. $DLFile .);
?>
Sade Versiyon (Açıklamalar)
Kodların açıklamalarını aşağıda vereceğim.  Bu sayede daha iyi ve anlaşılır olacaklar.

$DLPath Bu kod ile dosyamızın gerçek yolunu belirtiyoruz. Burada dikkat etmeniz gereken şey dosyamızın adı ve uzantısı bu yolda geçmeyecek. Örnek kullanım: "Downloads/Secure/"

$DLFile Dosyamızın adı ve uzantısı. Dosya kullanıcının bilgisayarına inerken de bu isimle inecektir. (Fakat dosya yolu kullanıcıya gözükmeyecektir) Örnek Kullanım: "File.zip" Dosyanın Gerçek Yolu: "Downloads/Secure/File.zip"

header('Content-type: application/zip'); İndirilecek olan dosyanın formatı seçilir. Daha fazla format için tıklayın.

header('Content-Disposition: attachment; filename="'. $DLFile .'"'); Sayfamızın HTML değil de bir dosya olduğunu belirtir.

readfile($DLPath. $DLFile .); Dosyamızı indirmemizi sağlayan fonksiyondur. Burada $DLPath ile $DLFile'ı birleştiriyoruz. Bu sayede readfile fonksiyonuna girdiğimiz değer: Downloads/Secure/File.zip olmaktadır.

Bu sayede dosyamızı yolunu başka kimseyle paylaşmadan indirmiş olduk. Şimdi gelelim daha gelişmişine. Aslında burada yapmamız gereken tek şey altta vereceğim kodları buradaki kodların üstüne eklemek olacak çünkü kodlarımızı ona göre yazacağım.

Gelişmiş Versiyon (Kodlar)
Burada alacağınız tüm kodları Sade Versiyonun hemen üstüne ekleyerek kullanabilirsiniz. Bu sayede sisteminizden dosya indirmek isteyenlerin belirli bir Session'a sahip olması ve indirme limitini aşmamış olması gerekmektedir. Bu sefer açıklamaları kodların içinde vereceğim. Çünkü bu sefer sadece if else deyimleriyle işlem yapacağım. Burada önemli olan ve değerini değiştirmeniz gereken sadece bir adet değişken var. O da indirme limitimizdir 🙂

?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
//Sessionları başlatıyoruz. Eğer bu kod olmaz ise hiçbir session değerimiz çalışmaz.
session_start();
//İndirme limitimizi buradan belirliyoruz. İstediğiniz basamakta sayı girebilirsiniz. Yalnız değer sadece tamsayı olmalı !
$LIMIT = 5;
//Eğer kişinin dosyayı indirme yetkisini belirleyen session değeri boş ise hata yazdırıp exit(); fonksiyonu ile işlemi durduruyoruz.
if (empty($_SESSION['YETKI'])){
echo "Bu dosyayı indirmek için gerekli yetkiye sahip değilsiniz !";
exit();
}
//Eğer indirme adedimizi sayan session değeri boş ise onu 0'a eşitliyoruz ki sistemimiz işlemleri yaparken sorun yaşamasın.
if (empty($_SESSION['INDIRME'])){
$_SESSION['INDIRME'] = 0;
}
//İndirme adedimizi sayan session değeri belirlediğimiz limitten büyük veya o limiti aşıyor ise hata yazdırıp işlemi durduruyoruz.
if ($_SESSION['INDIRME'] >= $LIMIT){
echo "İndirme limitinizi aştınız. Bu dosyayı indiremezsiniz !";
exit();
}
//Tüm kontrollerden başarıyla geçildiyse indirme adedimizi bir arttırıyoruz ki kişinin dosyayı kaç kere indirdiğini sistem anlasın.
$_SESSION['INDIRME'] ++;
?>
Kişilere Yetki Vermek
Kişilerin dosya indirmesini sağlamak için onlara yetki vermelisiniz. Bunun için aşağıdaki kodu session_start(); kodundan sonraki bir yere eklemelisiniz. Bu sistemimizde Yetki sessionunun içindeki değerin ne olduğuna bakmadık, sadece boş ise hata verdik (ki session açılmadıysa o her zaman boş olacaktır.)

?
1
2
3
<?php
$_SESSION['YETKI'] = "kullanıcının yetkisi bulunmaktadır";
?>
Derli Toplu Kod
Evet, her şey bu kadardı, şimdi size kodların tümünü derli toplu bir vaziyette vereyim ki rahat bir şekilde kullanabilesiniz. Bu kodumuzda tüm kullanıcılara dosya indirebilmesi için gereken yetkiyi de otomatik olarak vereceğiz (yani üstteki kod aşağıdaki kodların arasında bulunmaktadır.).

?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre>
<?php
//Sessionları başlatıyoruz. Eğer bu kod olmaz ise hiçbir session değerimiz çalışmaz.
session_start();
//Kullanıcıya yetkisini veriyoruz.
$_SESSION['YETKI'] = "kullanıcının yetkisi bulunmaktadır";
//İndirme limitimizi buradan belirliyoruz. İstediğiniz basamakta sayı girebilirsiniz. Yalnız değer sadece tamsayı olmalı !
$LIMIT = 5;
//Eğer kişinin dosyayı indirme yetkisini belirleyen session değeri boş ise hata yazdırıp exit(); fonksiyonu ile işlemi durduruyoruz.
if (empty($_SESSION['YETKI'])){
echo "Bu dosyayı indirmek için gerekli yetkiye sahip değilsiniz !";
exit();
}
//Eğer indirme adedimizi sayan session değeri boş ise onu 0'a eşitliyoruz ki sistemimiz işlemleri yaparken sorun yaşamasın.
if (empty($_SESSION['INDIRME'])){
$_SESSION['INDIRME'] = 0;
}
//İndirme adedimizi sayan session değeri belirlediğimiz limitten büyük veya o limiti aşıyor ise hata yazdırıp işlemi durduruyoruz.
if ($_SESSION['INDIRME'] >= $LIMIT){
echo "İndirme limitinizi aştınız. Bu dosyayı indiremezsiniz !";
exit();
}
//Tüm kontrollerden başarıyla geçildiyse indirme adedimizi bir arttırıyoruz ki kişinin dosyayı kaç kere indirdiğini sistem anlasın.
$_SESSION['INDIRME'] ++;
?>
<?php
$DLPath = "Downloads/Secure/";
$DLFile = "File.zip";
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'. $DLFile .'"');
readfile($DLPath. $DLFile );
?>
<pre>
Bazı sunucular benim deyimimle titiz olduklarından hata verebilirler. Bunun olmaması için sayfanın en üstüne (< ?php tagından hemen sonra) ob_start(); kodunu sayfanın en altına (?> tagının hemen üstüne) ob_end_flush(); komutunu ekleyin. Ve ek olarak indirme işleminiz olan sayfada önceden hiçbir yazı vb. şeyin olmaması gerekmekte html kodları da dahil. Yani kaynak kodlarınız tamamiyle boş olmalıdır.

Ve Yazının Sonu
Evet, tüm kodlar bu kadardı. Kodların tamamını test etmedim ama çalışacağına eminim. Yine de bir sorun çıkarsa bana alttan yorum yolu ile veya iletişim bölümünden bildirirseniz hemen düzeltirim.

Umarım yararlı olmuştur. Eğer beğendiyseniz bu yazıyı üstteki butonlardan paylaşabilir veya bize Destek Ver'ebilirsiniz. Her türlü soru ve sorununuzda yorum atmayı unutmayın, sağlıcakla kalın …

Hiç yorum yok:

Yorum Gönder