htaccess ile bir klasöre ve dosyaya doğrudan erişimi reddetmek


134

İşte senaryo:

  • index.phpKök klasörde bir dosya var
  • bazı dosyalar dahildir index.php içinde hangi includesklasörde.
  • 1 dosya daha (submit.php ) form gönderme işlemi için kök klasörde.

includesHtaccess ile klasördeki dosyalara doğrudan kullanıcı erişimini kısıtlamak istiyorum . ayrıca için submit.php. Ancak dahil etme index.phpdosya için çalışacaktır . Örneğin, kullanıcı yazarsa www.domain.com/includes/somepage.php, onu kısıtlayacaktır (bir hata sayfasına yönlendirilebilir).

Yanıtlar:


266

Sadece hareket edeceğini includesweb kök klasör out, ancak bütün doğrudan erişim engellemek istiyorsanız includesklasöründe, bir koyabilirsiniz .htaccesssadece içerdiğini klasöre:

deny from all

Bu şekilde o klasördeki herhangi bir dosyayı açamazsınız, ancak bunları php'ye sorunsuz bir şekilde dahil edebilirsiniz.


7
Başka bir dosya, o klasörde bulunan dosyaya ajax talebinde bulunabilecek mi?
Chaitanya Chandurkar

16
@ChaitanyaChandurkar Hayır, bir ajax talebi normal bir http talebidir, bu nedenle reddedilecektir.
jeroen

Sr b / c I yeni web programlama. İndex.php dosyama erişim için nasıl bir istisna ekleyebilirim?
PhatHV

Her şeyi reddet kullandım ve her url'yi kısıtladım .. giriş sayfasını bile göstermiyordu .. :(
Aamir

@Aamir Doğru, o klasördeki hiçbir url'ye erişilemez, ancak bunları başka dosyalara da sorunsuz bir şekilde ekleyebilirsiniz.
jeroen

56

Bu saf mod_rewritetemelli çözümdür:

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

Bu, URI /includes/veya/submit.php



29

Bir Files yönergesi kullanmak ve tüm dosyalara erişime izin vermemek mümkündür, ardından erişilebilir olan dosyaları ayarlamak için bu yönergeyi tekrar kullanın:

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>

7
Sorunun çözülüp çözülmediğini soran kişiden emin değilim, ancak bu, çoklu yanıtın birçok üyeye yardımcı olabilmesi SO'nun güzelliğidir. Bu son cevap sorunumu çözdü. Sitelerin css dosyası almasına izin vermek istiyorum, ancak ttf veya otf yazı tiplerine erişim yok ve patlama! çözüldü.
Moxet Khan

bundan sonra alt klasörlerdeki dosyalara erişemiyorum
Gintare Statkute

14

1 liner mod_alias tabanlı çözüm:

RedirectMatch 403 ^/folder/file.php$

Bu, /folder/file.php için yasaklanmış bir hata gösterecektir.


1
+1 - Bu aslında çok iyidir, çünkü 404'ü tüm klasöre regex kullanarak uygularsanız, hangi dosyaların var olduğunu kimse göremez ^folder.
bytecode77

9

Doğru anladıysam, sadece içerir klasörüne erişimi reddetmek mi istiyorsunuz?

Içerir klasörüne yerleştirilmiş 'TÜMÜNÜ DENY' yönergesine sahip bir .htaccess işe yarayacaktır.


8

Q'nuz iki bölümden oluşuyor, hem jeroen hem de anubhava'nın çözümleri 1. bölümde çalışıyor - içeriğe / içeriğe erişimi reddediyor. anubhava's da bölüm II için çalışıyor. İkincisini tercih ederim çünkü birDOCROOT/.htaccess yine de bir kullanıyorum ve bu tüm kontrolü tek bir dosyada tutuyor.

Ancak tartışmak istemediğim şey, "erişimi reddetme" kavramı submit.php. Kullanmak istemiyorsansubmit.phpKullanmak neden DOCROOT'da var? Buradaki cevabın, onu bazı biçimlerde bir eylem hedefi olarak kullanmanız ve yalnızca form gönderildiğinde ve örneğin bir spambottan değil, doğrudan gönderildiğinde ateşlenmesini istemenizden şüpheleniyorum.

Bu doğruysa, anubhava'nın II. Bölümünü kullanamazsınız çünkü bu, formunuzun başarısız olmasına neden olur. Burada yapabilecekleriniz (i) .htaccessyönlendirenin kendi dizin sayfanız olduğundan emin olmak için yapılan kontrol:

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

Ve (ii) PHP index.php form oluşturucunuzun içinde bir zaman damgası ve doğrulama için bazı gizli alanlar bulunur. Doğrulama, örneğin, zaman damgasının bir MD5'inin ilk 10 karakteri ve bazı dahili sırlar olabilir. Gönderiyi işlerken, daha sonra (i) zaman damgası ve doğrulama eşleştiğini ve (ii) zaman damgasının, örneğin geçerli zamanın 15 dakikası içinde olduğunu doğrulayabilirsiniz.

Bu, bir spam göndericinin geçerli bir zaman damgası / doğrulama çifti almasının tek pratik yolu, bir formu ayrıştırmak olabilir, ancak bu sıyrığın yalnızca 15 dakikalık bir ömrü olacaktır.


6

Daha yüksek bir düzeyde ayarlanmış olası diğer seçeneklere bağlı olarak, aşağıdakileri içerirler dizininizdeki .htaccess dosyanıza koymanız gerekebilir:

Satisfy all
Order deny,allow
Deny from all

Üst dizin aşağıdaki satırı içeren temel kimlik doğrulamasını tanımladığında bununla karşılaştım:

Satisfy any

Bu, kullanıcıların kimlik doğrulaması yapıldığı için herkesten reddetmemin yürürlüğe girmesini engelliyordu.


1

.htaccessDosyaya aşağıdaki komutu ekleyebilirsiniz

Deny from all
ErrorDocument 403 "nothing is here"

Yetkisiz erişim durumunda "burada hiçbir şey yok" mesajını gösterecektir.

Bir hata kodu ile belirli bir sayfaya yönlendirme yapmak istiyorsanız, aşağıdaki gibi bir komut tanımlayabilirsiniz:

ErrorDocument 404 "/errors/404.html"

/errors/404.htmlÖzel sayfa bulunamadı ekranına yönlendirilecek ve gösterecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.