Echo / güvenliği için, php ile jpg-görüntü yazdırmak?

3 Cevap php

Görüntüleri gösteren Çünkü güvenliği (kullanıcı giriş olup olmadığını kontrol edin), ben bir php-belge diyoruz.

<html>...
<img src="showImage.php?id=455" />
...</html>


showImage.php:
<?php...

if($_SESSION['user']){
    //Get the src to the image
    $_GET[$id] = mysql_real_escape_string($_GET['id']); 
    $result = mysql_query("
        SELECT src
        FROM Media 
        WHERE id = '".$_GET['id']."'
        ");
    $data = mysql_fetch_assoc($resultat);

    // Output the image
    header('Content-Type: image/jpeg');
    echo(file_get_contents("media/".$data['src']));
}

...?>

Bunu yaparken, ben kullanıcı görüntüye doğrudan url bilecek asla umut, ve bir resim göstermek için çalışırken, kullanıcı oturum gerekir

Ben bu iyi yol olduğundan emin değilim. Bunu yapmanın daha basit / daha iyi bir yolu var mı, ve bu güvenlidir. Komut dosyası yankılanan olduğunda, biraz yavaş.

  • Ben (sadece kullanıcı oturum açmış görüntüye erişimi olması gereken) görüntü güvende olmak istiyorum
  • Ben görüntü mümkün olduğunca hızlı gösterilmesini istiyorum

Tüm uzman ipuçları arıyorum.

3 Cevap

Her şeyden önce, yerine file_get_contents ve ancak o zaman, içeriğini yankılanan, sen readfile kullanabilirsiniz ile dosya okuma: o bir çağrıda hem de işlemleri yapacak - - ki muhtemelen hızlı ve daha az bellek daha kullanmak olacaktır:

  • file_get_only ile bellekte tam dosyayı yüklemek
  • ve ancak o zaman, outout bu içerik göndermek


Then, if you only want identified to have access to the images, you don't have much of a choice : if you indentification mecanism is based on PHP, you'll have to pass by PHP to restrict access on the file -- which, yes, will be a bit slower than if using Apache directly to serve the content.


Also : here, you say :

I hope the user never will know the direct url to the image

Bu okuma, birisi kendi URL biliyorsa görüntüleri, PHP komut atlayarak, Apache üzerinden doğrudan ulaşılabilir olduğunu varsayalım; bilinmezlik güvenlik iyi değil.

Daha iyi bir çözüm, size görüntüleri Apache tarafından hizmet etmek istemiyorsanız Apache şey hizmet olmaz yerden bir dizine koymak olacaktır:

  • Ya içeren bir. htaccess dosyası ile "Deny from all" korumalı belge kökü bir alt dizin,
  • ya da öylesine, senin belge kök altında değil, ve bir dizin, Apache tarafından servis asla.

Her iki şekilde de, bu doğrudan Apache değil sadece komut dosyaları erişebilirsiniz sağlamak, ve - komut atlayarak bir kullanıcı anlamına gelir değil.


Another idea, about the performance problem, might be to indicate the browser that it can cache your images -- at least, if that makes a sense.

Örneğin, "Etag" ve / veya "Last-Modified" olarak HTTP başlıklarını suchs tarafından ilginizi çekebilir.

Eğer görüntüyü sadece kullanıcılar giriş gerektirir beri sonra ben bu söz konusu olduğunda gerçekten bir seçeneğim yok olduğunu söyleyebilirim. Eğer site (bir sürü maliyeti) PHP daha alt düzey erişim denetimi kullanarak birden fazla sunucu için daha verimli bir sistem anlamaya mümkün olabilir hangi noktadan delicesine popüler hale gelinceye kadar bu böyle yapıyor tutmak zorunda olacak.

<?php

if($_SESSION['user']){

    $result = mysql_query("SELECT src FROM Media WHERE id = '"
    . mysql_real_escape_string($_GET['id']) ."'");

    $data = mysql_fetch_assoc($resultat);

    // Output the image
    header('Content-Type: image/jpeg');
    readfile("media/". $data['src']));
}

Pascal MARTIN readfile esas echo ve file_get_contents ile aynı olduğu doğrudur. Ben performansında herhangi bir fark olduğunu sanmıyorum, ancak kullanımı daha net readfile.

Bildiğim kadarıyla sadece görüntüleri görmek için oturum açmış kullanıcılar izin verilmesi, web dizini dışındaki görüntülerini koydu. readfile, bazı diğer dizinden dosyayı kapmak kullanma. Onlar url tahmin yaptım bile bu şekilde, onlar erişmeye hiçbir yolu yoktur.