menolak akses langsung ke folder dan file dengan htaccess

134

Berikut ini skenarionya:

  • Ada index.phpfile di folder root
  • beberapa file termasuk di index.phpdalamnya yang ada di includesfolder.
  • 1 file lainnya ( submit.php) ada di folder root untuk aksi pengiriman formulir.

Saya ingin membatasi akses pengguna langsung ke file dalam includesfolder dengan htaccess. juga untuk submit.php. Tetapi menyertakan akan berfungsi untuk index.phpfile. Seperti, jika pengguna mengetik www.domain.com/includes/somepage.php, itu akan membatasi itu (mungkin dialihkan ke halaman kesalahan).

Imrul. H
sumber

Jawaban:

266

Saya hanya akan memindahkan includesfolder dari web-root, tetapi jika Anda ingin memblokir akses langsung ke seluruh includesfolder, Anda dapat meletakkan .htaccessfile di folder itu yang berisi hanya:

deny from all

Dengan begitu Anda tidak dapat membuka file apa pun dari folder itu, tetapi Anda dapat memasukkannya ke dalam php tanpa masalah.

jeroen
sumber
7
Apakah file lain dapat membuat permintaan ajax ke file yang ada di folder itu?
Chaitanya Chandurkar
16
@ChaitanyaChandurkar Tidak, permintaan ajax adalah permintaan http normal sehingga akan ditolak.
jeroen
Sr b / c Saya pemrograman web baru. Bagaimana saya bisa menambahkan pengecualian untuk akses ke file index.php saya?
PhatHV
Saya menggunakan deny dari semua dan itu membatasi setiap url .. bahkan tidak menampilkan halaman login .. :(
Aamir
@ Amir Itu benar, tidak ada url di folder itu yang dapat diakses tetapi Anda dapat memasukkannya ke file lain tanpa masalah.
Jeroen
56

Ini adalah mod_rewritesolusi berbasis murni :

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

Ini akan menampilkan kesalahan terlarang untuk digunakan jika URI mengandung salah satu /includes/atau/submit.php

anubhava
sumber
3
Kerja
29

Dimungkinkan untuk menggunakan arahan File dan melarang akses ke semua file, lalu menggunakannya lagi untuk mengatur file yang dapat diakses:

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

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
Lukas1985
sumber
7
Saya tidak yakin tentang orang yang memposting pertanyaan apakah masalahnya terpecahkan atau tidak, tetapi ini adalah keindahan dari SO sehingga banyak jawaban dapat membantu banyak anggota. Jawaban terakhir ini menyelesaikan masalah saya. Saya ingin membiarkan situs mendapatkan file css tetapi tidak memiliki akses ke font ttf atau otf, dan boom! terselesaikan.
Moxet Khan
setelah ini saya tidak dapat mengakses file dalam subfolder
Gintare Statkute
14

Solusi berbasis mod_alias 1 liner:

RedirectMatch 403 ^/folder/file.php$

Ini akan menampilkan kesalahan terlarang untuk / folder / file.php

Amit Verma
sumber
1
+1 - Ini sebenarnya sangat bagus, karena tidak ada yang bisa melihat file mana yang ada jika Anda menerapkan 404 ke seluruh folder, menggunakan regex ^folder.
bytecode77
9

Jika saya mengerti benar Anda hanya ingin menolak akses ke folder include?

Htaccess dengan arahan 'DENY FROM ALL' yang ditempatkan di folder include akan berhasil.

mainegreen
sumber
8

Q Anda datang dalam dua bagian, baik solusi jeroen dan anubhava bekerja untuk bagian I - menolak akses ke / termasuk. anubhava juga berfungsi untuk bagian II. Saya lebih suka yang terakhir karena saya DOCROOT/.htaccesstetap menggunakan dan ini menjaga semua kontrol tersebut dalam satu file.

Namun yang ingin saya diskusikan adalah konsep "menolak akses ke submit.php". Jika Anda tidak ingin menggunakan submit.phplalu mengapa harus di DOCROOT? Saya menduga bahwa jawabannya di sini adalah Anda menggunakannya sebagai target tindakan dalam beberapa bentuk dan hanya ingin dipecat ketika formulir dikirimkan dan tidak secara langsung, misalnya dari spambot.

Jika ini benar maka Anda tidak dapat menggunakan bagian II anubhava karena ini akan menyebabkan formulir Anda gagal. Yang dapat Anda lakukan di sini adalah (i) dengan .htaccesscek untuk memastikan bahwa pengarah adalah halaman indeks Anda sendiri:

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

Dan (ii) dalam generator form index.php PHP Anda menyertakan beberapa bidang tersembunyi untuk cap waktu dan validasi. Validasi dapat berupa, katakanlah, 10 karakter pertama dari MD5 cap waktu dan beberapa rahasia internal. Saat memproses kiriman, Anda dapat (i) memvalidasi cap waktu dan validasi, dan (ii) cap waktu berada dalam, katakanlah, 15 menit dari waktu saat ini.

Ini Anda dapat mencegah spamming sebagai satu-satunya cara praktis bahwa seorang spammer bisa mendapatkan timestamp / pasangan validasi yang valid adalah dengan mem-parsing formulir, tetapi goresan ini hanya akan memiliki waktu 15 menit.

TerryE
sumber
6

Bergantung pada kemungkinan opsi lain yang ditetapkan pada level yang lebih tinggi, Anda mungkin perlu memasukkan yang berikut ini dalam file .htaccess Anda di direktori include Anda:

Satisfy all
Order deny,allow
Deny from all

Saya mengalami hal ini ketika direktori atas mendefinisikan otentikasi dasar termasuk baris:

Satisfy any

Ini mencegah penolakan saya agar tidak berlaku karena semua pengguna diautentikasi.

Keith
sumber
1

Anda dapat menambahkan perintah di bawah ini ke .htaccessfile

Deny from all
ErrorDocument 403 "nothing is here"

Ini akan menampilkan pesan "nothing is here" jika ada akses yang tidak sah.

Jika Anda ingin mengarahkan ulang dengan kode kesalahan ke halaman tertentu maka Anda dapat mendefinisikan perintah sebagai berikut:

ErrorDocument 404 "/errors/404.html"

Ini akan mengarahkan ulang ke /errors/404.htmldan menampilkan halaman kustom tidak ditemukan layar.

pengguna1324491
sumber