. htaccess kullanarak, sunucu dizin korumak için nasıl

5 Cevap php

Ben bir web sitesi tasarladık, ve bunun içinde benim sistemi ile etkileşim PHP betikleri bir dizi var. Bir kullanıcı bir görüntü yükler, örneğin, bu komut tarafından işlenir

image.php

ve bu bir kullanıcı günlükleri komut dosyası tarafından işlendiği takdirde

login.php

Tüm bu komut klasöründe saklanır seslendi: komut

nasıl ancak hala sistem tarafından kullanılan emin olun, birileri bu sayfaları erişemiyor sağlarım? Ben PHP sayfaları, yazılan değerleri kabul değerlerini almak ve diğer sayfalara yönlendirebilirsiniz olacak sağlamak istiyoruz, ancak doğrudan adres çubuğu üzerinden erişilen veya indirilen olamaz?

I deny from all kullanarak. Htaccess kullanarak erişimi engellemek için çalıştı ve Limit GET, POST ama ben tüm bu dosyaları erişemediği bu durum çalışan sistemini engelledi.

Bunu yapmanın bir yolu var mı?

Şimdiden teşekkürler

5 Cevap

Htaccess ile dosya engelleme istekte dosyaları ulaşılmaz hale getirir, örneğin Sayfanın ziyaretçi. Yani dosyaları ziyaretçinin isteği geçmek için bir proxy dosyasına ihtiyacınız var. Bunun için, MVC pattern bir göz ve Front Controller pattern var.

Temelde, ne yapmak isteyeceğiniz route all requests to a single point of entry, eg index.php ve isteği işlemek için denir eylem (betiklerinizin), oradan karar. (Bazı paylaşılan ana) imkansız ise zaten o (ALL inkar) yokmuş gibi Sonra place your scripts and templates outside the publicly accessible folder ya, Htaccess ile klasörleri korumak olabilir.

Eğer gibi bir URL olurdu yükleme komut dosyasını kullanmak için http://example.com/index.php?action=upload.

Bir supersimple FrontController kadar kolaydır

$scriptPath      = 'path/to/your/scripts/directory/';
$defaultAction   = 'action404.php';
$requestedAction = $_GET['action']; // you might want to sanitize this

switch($action) {
    case 'upload':
        $actionScript = 'image.php';
        break;
    case 'login':
        $actionScript = 'login.php';
        break;
    default:
        $actionScript = $defaultAction;
}
include $scriptPath . $actionScript;
exit;

Eğer gerekli gördükleri her türlü - ActionScript sonra vb yönlendirme, db erişim, kimlik doğrulama, yükleme malzeme, şablonlar render dahil olmak isteği ile yapmak için gereken her şeyi yapardı. Yukarıdaki örnekte varsayılan eylem bu gibi görünebilir:

<?php // action404.php
    header('HTTP/1.1 404 File Not Found');
    fpassthru('path/to/template/directory/error404.html');

Orada numerous implementations of the FrontController pattern in PHP. Bazı basit, bazı karmaşık. CodeIgniter framework Bu sizin için yeni ise çok büyük olmayabilir hafif bir MVC / FrontController uygulamasını kullanır.

Yukarıda önerilen Atlı gibi, mod_rewrite index.php tüm istekleri zorlamak için ve aynı zamanda oldukça yukarı URL'leri kullanabilirsiniz kullanabilirsiniz. Bu MVC çerçeveler ile yaygın bir uygulama olduğunu ve burada ve başka yerlerde yaygın örtülü olmuştur.

Eğer gerçekten dosyalara doğrudan isteklerini önlemek ve yine de onları diğer isteklere erişilebilir kalır olamaz. Yapabileceğiniz en iyi konumlarını maske ve kontrol how onlar erişilir.

Eğer gidebiliriz tek yolu sizin için komut içerir, yerine Apache onları doğrudan talep olurdu bir PHP "anahtarı" komut dosyası oluşturmak için.

Örneğin, sizin scripts/image.php kural hedef olsaydı switch.php?file=image.php yerine, biraz gibi:

RewriteRule ([^\.]+\.(jpe?g|png|gif)$ switch.php?file=image.php&rw=1&meta=$1 [L,QSA]

Sen scripts/.htaccess dosyasına deny from all ekleyebilir ve switch.php dosyasında bu yapabilirdi.

<?php
/** File: switch.php **/
$allowed_files = array(
    'login.php',
    'image.php'
);
$script_dir = 'scripts/';
if(isset($_POST['rw']) && in_array($_REQUEST['file'], $allowed_files)) {
    include $script_dir . $allowed_files[$_REQUEST['file']];
}
else {
    header('HTTP/1.1 404 File Not Found');
    include 'error404.html'; // Or something to that effect.
}
?>

$_POST['rw'] kural dosyaya doğrudan isteklerini önlemek içindir bir RewriteRule, gelen olmadığını görmek için zayıf bir onay vardır. Pretty sen orada olduğunu biliyorum atlamak için kolay, ama botlar ve böyle rastgele isteklerine karşı etkilidir.

Bu şekilde, ya scripts/image.php ve switch.php?file=image.php başarısız olur, ancak herhangi bir görüntü dosyasını istekleri scripts/image.php komut tetikleyecek doğrudan istekleri.

Sen. Bütün itibaren htaccess inkar kurmak ve bazı erişilebilir dizin bu dosyaları ekleyebilirsiniz

I want to ensure the PHP pages will accept post values, get values and can redirect to other pages, but not be directly accessed via the address bar or downloaded?

Sürece Apache PHP uygulaması ile tüm. Php dosyalarını ilişkilendirmek yapılandırılmış olduğu gibi, hiç kimse PHP içeriğini kendisi indirebilirsiniz. Birisi için "mysite.com / image.php" göz Yani, eğer PHP çalışacaktır. Kullanıcı PHP içerik değil göreceksiniz.

Bu httpd.conf dosyasında zaten tarafından yapılması gerektiği gibi:

  • AddType application / x-httpd-php. Php. Phtml

Şimdi, image.php belirli sonrası parametreleri bekliyor olacak. Onlar sağlanan değilse Atli yukarıda önerilen gibi bir MVC mimari uygulama kısa, incelikle ve güvenli bir eksik parametreler ile anlaşma olabilir. Sonra, kullanıcıların doğrudan sayfaya olsun ama bir şey yapamaz.

Bir çok uygulamalar değil sadece kamu (gibi / public_html / veya / www /) klasöründeki ancak aynı kök klasörde kamu klasör olarak komut gibi dosyaları koydum.

so not root/public_html/ and root/public_html/scripts/

but root/public_html/ and root/scripts/

Kamu klasörün üstünde bir klasörde şey ziyaretçiler tarafından erişilemez, ama örneğin de belirterek / public_html / index.php dosyası '.. / Scripts / yourscript.php' PHP bu dosyaları ve ziyaretçileri erişebilirsiniz olamaz . (Klasör .. / "klasör hiyerarşisinde bir adım yukarı çıkmak" anlamına gelir)