Depolama ve public_htm yukarıda görüntüleri okuma

6 Cevap php

Ben PHP Resim yükleme komut dosyası ve ben kullanıcıların doğrudan görüntüleri excecute olamaz öyle yapıyor atlamak zorunda son engel sabitlemek için çalışıyorum, ancak sunucu hala web sayfalarında onlara hizmet edebilir. Ben boşuna mülkiyet ve klasörlerin izinlerini değiştirerek denedim, bu yüzden public_htm yukarıda görüntüleri depolamak ve public_htm saklanır sayfalarında onları görüntülemek için çalışıyorum.

Benim Dosya Yapısı:

 - userimages
   image.jpg
   image2.jpg

 - public_html
   filetoserveimage.html

Ben böyle userimages klasöründeki bir görüntü bağlama çalıştı:

<img src="../userimages/image.jpg">

Ama çalışmıyor. Ben burada eksik bir şey var mı? Eğer daha iyi bir öneriniz varsa lütfen bana bildirin. Ben onlar yükledi olabilir tehlikeli dosyaları yürütülürken kamu kullanıcılara tutmak için çalışıyorum. Sadece ekstra bir güvenlik önlemi olarak. Teşekkürler!

6 Cevap

Bu temelde imkansız bir şey istiyorum.

Bir tarayıcı (bir çok temel anlamda) bir sayfayı yükler yolu şudur:

Step 1: Download the page. Step 2: Parse the page. Step 3: Download anything referenced in the content of the page (images, stylesheets, javascripts, etc)

Her bir "Download" olay atomik olduğunu.

Sadece sadece bu görüntüleri başvuran bir sayfa indirdiğiniz insanlara görüntüleri hizmet etmek ister gibi görünüyor.

PHP Jedi gösterildiği gibi, PHP ile dosyaları geçebilir. Onun kodu genişletmek, ve insanlar "sadece" görüntü kapma emin olmak için istek üzerine HTTP_REFERER kontrol edebilir.

Şimdi, bir PHP Geçiş komut dosyası aracılığıyla her imajına hizmet verimli değildir, ama işe yarayabilir.

Insanlar sunucu üzerinde görüntüyü başvuran diğer sitelerde görüntü etiketleri oluşturduğunuzda - insanlar bunu yapmak istiyorum en yaygın nedeni "olurlar" kaçınmaktır. Onlar bunu yaparken, başkasının sayfada yer almak isteklerini işleme kaynaklarını tüketmek.

Bu gerçekten önlemek için çalışıyoruz buysa, sen referer kontrol etmek için mod_rewrite kullanabilirsiniz.

Hotlinking bir iyi görünümlü tartışma / anti-hotlinking bulunabilir here

Bir görüntü röle komut dosyası kullan!

Eğer bir php komut dosyası bunu yapmak zorunda public_html klasörü dışında bir imagefile hizmet etmek. Örneğin kamu html dışında görüntü okuyan bir görüntü relay.php yapmak ...

<?php
header('Content-Type: image/jpeg');
$_file = 'myimage.jpg'; // or $_GET['img']
echo file_get_contents('/myimages/'.$_file);
?>

Şimdi, $ _dosya bir $ _GET parametre olabilir, ama onun absolutley önemli girdi parametre doğrulamak için ...

şimdi / myimage / flower.jpg bulunan bir flower.jpg görüntüyü erişmek için <img src="image-relay.php?img=flower.jpg"> yapabilir ...

public_html dizini kullanıcılar için sunucunun root ise, Apache bu dorectory altındaki / içindeki değil bir şey hizmet edemez.

Doğrudan Apache tarafından hizmet için bir dosya istiyorsanız, / altına koymak gerekecek public_html.

Ben bir <img> etiketi bir resim eklerseniz, tarayıcınız çalışırsanız webserver gönderilecektir ki, onu almak için web sunucusu için aynı isteği göndermek olacak ki yanlış anlama aslında düşünüyorum doğrudan tarayıcınızda görüntünün src url açmak için.

Bu nedenle, hem işler, ya da ne ya.

Kesmek kullanıcı gideni, döner bir proxy arkasında ise görüntüyü istedi bir IP de çalışmaz son birkaç saniye içinde html sayfası (istedi emin olmak için (php veya diğer) komut dosyası içeren, etrafında vardır IP) veya kullanıcı devre dışı referer ise HTTPS ile çalışmak ve zamanda değil değil referer () kontrol ederek.

Eğer sadece bazı kullanıcılar (<img> etiketi aracılığıyla ve doğrudan hem de) görüntüyü görebilirsiniz emin olmak istiyorsanız, public_html dışında resim koymak ve kullanıcının kimlik bilgilerini doğrular bir (php veya başka) komut olabilir Görüntüyü hizmet öncesi.

Apache kullanıyorsanız veya lighttpd iseniz (size mod_xsendfile yapılandırmasını değişmedi) web kök olmayan dosyaları göndermek için X-SendFile başlığını kullanabilirsiniz.

X-Çekirdeğin dosya hakkında daha fazla bilgi edinmek için bu bkz site.

PHP dosya göndermek değil Bu çözüm size mümkün olan en iyi performansı veren ancak sunucu yapar ve dosyaları servis edilirken bu nedenle PHP çıkılabilir.

Umut olur.

Eh, bir web tarayıcısı, sadece public_html içinde dosya ve klasörlere erişmek mümkün olacak.