Kaydedilir sürece görüntülerin sıcak bağlama izin vermeyin

4 Cevap

Ben sadece bunun yapılıyor nasıl emin değilim bugün bir şey koştu.

I know a few things: The site is done in php There is an image gallery, a url would be something like http://www.example.com/girls/Cyn/sets/getImage/1170753147/7.jpg

Ben sürece ben siteye giriş olduğum gibi, bu url görebilirsiniz. Ben, url aldı bir tarayıcıda yeni bir pencere yapılmış ve hala bunu yaparken oturum iken onu yüklemek mümkün olduğu gibi, esaslı yönlendirme olmak görünmüyor, ben hiçbir yönlendirme vardı.

Oturumu ikinci, ben / giriş lütfen kayıt sayfasına yönlendirildi.

Bu ağır bir isabet sitedir.

Bu nasıl yapılır? Ben onlar Cent apache çalışan söyleyebilirim. Ben giriş yaptığında, ben onlar emin ben oturum izin am yapmak için bir id arama için kullandığınız eminim bir şey, bir karma olan bir çerez, verilen am

Ancak, yukarıda sadece bir jpg olan bir kaynak için doğrudan bir istek. Bazı Apache ile daha sonra iletişim, ve bu isteğin durumunu görmek için kendi veritabanı olmalı. Sadece bir url yükleme nasıl, daha sonra bir veritabanına kapalı geçebileceği apache için bir çerez değeri göndermek?

Ben ücretli üyelik site atılmak üzereyim, ve aynı şekilde görüntüleri korumak gerekir. Bu bu form tabanlı bir giriş oldu, http auth değildi ve ben bu nasıl yapıldı gibi bir kayıp am. Herhangi bir fikir?

4 Cevap

Tüm istekleri web sunucusu üzerinden gitmek. Bir site bir çerez varsa bu çerez sona ermesi veya kaldırılana kadar, sonra o site için tüm istekleri çerez içeriğini içerecektir. Bu sizden bunu isteyen nerede sadece önemli ne talep ediyorsanız farketmez.

Eğer varsa firebug bu sitede olduğunuzda 'Net' sekmesini açın ve yaptığınız tüm istekleri kontrol. Sen istek başlıklarına bir 'Cookie' hattı göreceksiniz. Bu istenen her kaynağın olacak: görüntüleri, biçimtabloları, her şey.

Apache web sunucusu ise, o zaman isteğinizi yönlendirmek için mod_rewrite kullanabilirsiniz ya da PHP veya Perl onu geçmek veya geçerli eğer görüntü tanımlama ve çıkışını kontrol etmek veya değilse yönlendirebilirsiniz başka bir şey olabilir.

İşte (görüntü çıkışı php.net alınan) bir php örnek:

if(valid_auth($_COOKIE['auth'])) {

    // open the file in a binary mode
    $name = './img/ok.png';
    $fp = fopen($name, 'rb');

    // send the right headers
    header("Content-Type: image/png");
    header("Content-Length: " . filesize($name));

    // dump the picture and stop the script
    fpassthru($fp);
    exit;

} else {

    header('Location: /login');
    exit;
}

Muhtemelen kimlik doğrulaması için bir oturum çerezi kullanır ve oturum kimliği değil ise yönlendiren bir web uygulaması var.

Hemen hemen herhangi bir web framework bu tür bir şey için eklentileri vardır. Orada bile bunu yapmak için apache modülleri olabilir, ama ben görmedim.

Sen görüntüler için bir "getter" oluşturmanız gerekir. Görüntüler kamu erişilebilir dizinleri dışında bir klasörde saklanmalıdır.

/public_html
    /js
        jquery.js
    index.php
    getimage.php

/private_images/
    myimage.jpg

Dizini private_images Not erişilebilir değilken: http://www.mysite.com/private_images

Şimdi, "alıcı" komut dosyası oluşturmak için.

/* This is getimage.php */
if(!isset($_SESSION['is_logged_in'])) {
    header('Location: /login');
    exit;
}

/*
Get the image_name from the URL
You will be using something like: http://mysite.com?image_name=flowers.jpg
This is the way to get the image.
*/
$path = "/var/www/html/private_images"
$name = $path.'/'.$_GET['image_name']; 
$fp = fopen($name, 'rb');

// send the right headers
header("Content-Type: image/jpg");
header("Content-Length: " . filesize($name));

// dump the picture and stop the script
fpassthru($fp);
exit;

Eğer yukarıdaki Yorum kaçırdıysanız, görüntü almak için bunu yapabilirsiniz:

http://mysite.com?image_name=flowers.jpg

Ancak, yukarıda sadece bir jpg olan bir kaynak için doğrudan bir istek. Bazı Apache ile daha sonra iletişim, ve bu isteğin durumunu görmek için kendi veritabanı olmalı. Sadece bir url yükleme nasıl, daha sonra bir veritabanına kapalı geçebileceği apache için bir çerez değeri göndermek?

Her bir http isteği bir web sunucusuna gönderilir. Web sunucusu daha sonra bir dizi kurala dayalı, isteği işlemek için nasıl karar verecektir. Varsayılan olarak, Apache sadece geri kullanıcıya istenen dosyayı gönderir basit bir işleyicisi var. Eğer bir php-script ile tüm istekleri işlemek için Apache yapılandırma olamazdı hiçbir neden ancak var. Bunu göstermek için her görüntü için php ateşlemek için biraz pahalı olduğundan bir yüksek trafik sitesinde, muhtemelen, farklı çözerdi, ama teoride sadece bir mod_rewrite kural boruları tüm istekleri yapabilir bir php-script (Gibi ^girls/Cyn/sets/getImage/.*), belirli bir desen eşleştirme. Bu komut dosyası daha sonra web kök dışından yerden gerçek dosyayı okumak ve kullanıcıya bunu basacaktır.