Saya memiliki file php yang akan saya gunakan secara eksklusif sebagai termasuk. Karena itu saya ingin melemparkan kesalahan alih-alih mengeksekusi ketika diakses langsung dengan mengetikkan URL alih-alih dimasukkan.
Pada dasarnya saya perlu melakukan pemeriksaan sebagai berikut dalam file php:
if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");
Apakah ada cara mudah untuk melakukan ini?
php
include
include-guards
Alterlife
sumber
sumber
Jawaban:
Cara termudah untuk situasi "aplikasi PHP umum yang berjalan pada server Apache yang Anda mungkin atau mungkin tidak sepenuhnya kendalikan" situasi adalah dengan memasukkan menyertakan Anda dalam direktori dan menolak akses ke direktori itu dalam file .htaccess Anda. Untuk menyelamatkan orang dari masalah Googling, jika Anda menggunakan Apache, letakkan ini dalam file yang disebut ".htaccess" di direktori yang tidak ingin Anda akses:
Jika Anda benar-benar memiliki kontrol penuh terhadap server (hari ini lebih umum bahkan untuk aplikasi kecil daripada ketika saya pertama kali menulis jawaban ini), pendekatan terbaik adalah menempelkan file yang ingin Anda lindungi di luar direktori tempat server web Anda melayani dari . Jadi, jika aplikasi Anda masuk
/srv/YourApp/
, atur server untuk menyajikan file dari/srv/YourApp/app/
dan masukkan termasuk/srv/YourApp/includes
, sehingga benar-benar tidak ada URL yang dapat mengaksesnya.sumber
<Files ~ "\.inc$">
Order Allow,Deny
Deny from All
</Files>
Tambahkan ini ke halaman yang hanya ingin Anda sertakan
kemudian pada halaman yang memasukkannya tambahkan
sumber
somefile.php
di server Anda dan menambahkan Anda di dalamnya, itu masih tidak membiarkan mereka secara langsung mengakses file include. Ini akan memungkinkan mereka "memasukkan" file perpustakaan Anda, tetapi jika mereka cukup jauh untuk membuat file di server Anda dan mengetahui skrip define / include Anda, Anda memiliki masalah lain yang sepertinya meniadakan penulisan file mereka sendiri dengan define Anda di tempat pertama. .Saya punya file yang harus saya lakukan dengan cara berbeda saat disertakan vs saat diakses langsung (terutama
print()
vsreturn()
) Berikut ini beberapa kode yang dimodifikasi:File yang diakses selalu merupakan file yang disertakan, karenanya == 1.
sumber
Cara terbaik untuk mencegah akses langsung ke file adalah menempatkannya di luar root dokumen server web (biasanya, satu tingkat di atas). Anda masih bisa memasukkan mereka, tetapi tidak ada kemungkinan seseorang mengaksesnya melalui permintaan http.
Saya biasanya pergi jauh-jauh, dan letakkan semua file PHP saya di luar root dokumen selain dari file bootstrap - lone index.php di root dokumen yang mulai merutekan seluruh situs web / aplikasi.
sumber
1: Memeriksa jumlah file yang disertakan
Logika: PHP keluar jika jumlah sertakan minimum tidak terpenuhi. Perhatikan bahwa sebelum PHP5, halaman dasar tidak dianggap sebagai termasuk.
2: Mendefinisikan dan memverifikasi konstanta global
Logika: Jika konstanta tidak didefinisikan, maka eksekusi tidak dimulai dari halaman dasar, dan PHP akan berhenti mengeksekusi.
Perhatikan bahwa demi portabilitas di seluruh peningkatan dan perubahan di masa mendatang, membuat metode otentikasi ini modular akan secara signifikan mengurangi overhead pengkodean karena perubahan tidak perlu dikodekan ke setiap file.
Dengan cara ini, kode tambahan dapat ditambahkan
checkdefined.php
untuk tujuan logging dan analitis, serta untuk menghasilkan respons yang sesuai.Kredit di mana kredit jatuh tempo: Ide brilian tentang portabilitas berasal dari jawaban ini .
3: Otorisasi alamat jauh
Kelemahan dengan metode ini adalah eksekusi yang terisolasi, kecuali token sesi disediakan dengan permintaan internal. Verifikasi melalui alamat loop-back dalam hal konfigurasi server tunggal, atau daftar putih alamat untuk infrastruktur server multi-server atau beban-seimbang.
4: Otorisasi token
Mirip dengan metode sebelumnya, seseorang dapat menggunakan GET atau POST untuk meneruskan token otorisasi ke file include:
Metode yang sangat berantakan, tetapi juga mungkin yang paling aman dan serbaguna pada saat yang sama, bila digunakan dengan cara yang benar.
5: konfigurasi spesifik server Web
Sebagian besar server memungkinkan Anda untuk menetapkan izin untuk file atau direktori individual. Anda dapat menempatkan semua menyertakan Anda dalam direktori terbatas seperti itu, dan mengonfigurasi server untuk menolaknya.
Sebagai contoh di APACHE, konfigurasi disimpan dalam
.htaccess
file. Tutorial di sini .Perhatikan bahwa konfigurasi khusus server tidak direkomendasikan oleh saya karena mereka buruk untuk portabilitas di berbagai server web. Dalam kasus-kasus seperti Content Management Systems di mana algoritma penolakan rumit atau daftar direktori ditolak agak besar, itu mungkin hanya membuat sesi konfigurasi ulang agak mengerikan. Pada akhirnya yang terbaik adalah menangani ini dalam kode.
6: Menempatkan termasuk dalam direktori aman DI LUAR root situs
Paling tidak disukai karena keterbatasan akses di lingkungan server, tetapi metode yang agak kuat jika Anda memiliki akses ke sistem file.
Logika:
htdocs
folder karena tautannya akan berada di luar ruang lingkup sistem alamat situs web.Maafkan konvensi pengkodean yang tidak lazim. Umpan balik sangat dihargai.
sumber
Alternatif (atau pelengkap) untuk solusi Chuck adalah dengan menolak akses ke file yang cocok dengan pola tertentu dengan meletakkan sesuatu seperti ini di file .htaccess Anda
sumber
Sebenarnya saran saya adalah melakukan semua praktik terbaik ini.
Dengan cara ini jika file menjadi salah tempat entah bagaimana (operasi ftp yang salah) mereka masih dilindungi.
sumber
Saya pernah mengalami masalah ini, diselesaikan dengan:
tetapi solusi yang ideal adalah menempatkan file di luar root dokumen web-server, sebagaimana disebutkan dalam server lain.
sumber
Anda sebaiknya membangun aplikasi dengan satu titik masuk, yaitu semua file harus dijangkau dari index.php
Tempatkan ini di index.php
Pemeriksaan ini harus dijalankan di setiap file yang ditautkan (melalui keharusan atau termasuk)
sumber
Saya ingin membatasi akses ke file PHP secara langsung, tetapi juga dapat memanggilnya via
jQuery $.ajax (XMLHttpRequest)
. Inilah yang bekerja untuk saya.sumber
Cara termudah adalah dengan menetapkan beberapa variabel dalam file yang menyertakan panggilan, seperti
Kemudian dalam file yang disertakan, periksa variabelnya
sumber
Selain cara .htaccess, saya telah melihat pola yang berguna dalam berbagai kerangka kerja, misalnya di ruby on rails. Mereka memiliki pub / direktori terpisah di direktori root aplikasi dan direktori perpustakaan tinggal di direktori pada tingkat yang sama dengan pub /. Sesuatu seperti ini (tidak ideal, tetapi Anda mendapatkan ide):
Anda mengatur server web Anda untuk menggunakan pub / sebagai root dokumen. Ini menawarkan perlindungan yang lebih baik untuk skrip Anda: walaupun skrip dapat menjangkau dari root dokumen untuk memuat komponen yang diperlukan, namun mustahil untuk mengakses komponen dari internet. Manfaat lain selain keamanan adalah semuanya ada di satu tempat.
Pengaturan ini lebih baik daripada hanya membuat pemeriksaan di setiap file yang disertakan karena pesan "akses tidak diizinkan" adalah petunjuk bagi penyerang, dan itu lebih baik daripada konfigurasi .htaccess karena tidak berdasarkan daftar putih: jika Anda mengacaukan ekstensi file itu tidak akan terlihat di direktori lib /, conf / etc.
sumber
Apa Joomla! Apakah mendefinisikan Konstan dalam file root dan memeriksa apakah hal yang sama didefinisikan dalam file yang disertakan.
atau
kita dapat menyimpan semua file di luar jangkauan permintaan http dengan menempatkannya di luar direktori webroot karena sebagian besar kerangka kerja seperti rekomendasi CodeIgniter.
atau bahkan dengan menempatkan file .htaccess di dalam folder include dan aturan penulisan, Anda dapat mencegah akses langsung.
sumber
sumber
Jawaban saya agak berbeda dalam pendekatan tetapi mencakup banyak jawaban yang diberikan di sini. Saya akan merekomendasikan pendekatan multiguna:
defined('_SOMECONSTANT') or die('Hackers! Be gone!');
Namun yang
defined or die
pendekatan memiliki sejumlah kegagalan. Pertama, itu adalah rasa sakit yang nyata dalam asumsi untuk menguji dan debug dengan. Kedua, ini melibatkan refactoring yang mengerikan, membosankan, dan membosankan jika Anda berubah pikiran. "Temukan dan ganti!" kamu bilang. Ya, tetapi seberapa yakin Anda bahwa itu ditulis persis sama di mana-mana, hmmm? Sekarang gandakan dengan ribuan file ... oOLalu ada .htaccess. Apa yang terjadi jika kode Anda didistribusikan ke situs di mana administrator tidak begitu teliti? Jika Anda hanya mengandalkan .htaccess untuk mengamankan file Anda, Anda juga akan memerlukan a) cadangan, b) sekotak tisu untuk mengeringkan air mata Anda, c) alat pemadam api untuk memadamkan api di semua capem dari orang-orang. menggunakan kode Anda.
Jadi saya tahu pertanyaannya menanyakan "yang termudah", tapi saya pikir apa yang dibutuhkan adalah "pengkodean defensif".
Apa yang saya sarankan adalah:
require('ifyoulieyougonnadie.php');
( bukaninclude()
dan sebagai pengganti untukdefined or die
)Di
ifyoulieyougonnadie.php
, lakukan beberapa hal yang logis - periksa konstanta yang berbeda, skrip panggilan, pengujian localhost dan semacamnya - dan kemudian implementasikandie(), throw new Exception, 403
, dll.Saya membuat kerangka kerja saya sendiri dengan dua kemungkinan titik masuk - index.php utama (kerangka kerja Joomla) dan ajaxrouter.php (kerangka kerja saya) - jadi tergantung pada titik masuknya, saya memeriksa hal-hal yang berbeda. Jika permintaan untuk
ifyoulieyougonnadie.php
tidak datang dari salah satu dari dua file itu, saya tahu kejahatan sedang dilakukan!Tetapi bagaimana jika saya menambahkan titik masuk baru? Jangan khawatir. Saya hanya berubah
ifyoulieyougonnadie.php
dan saya disortir, plus tidak ada 'temukan dan ganti'. Hore!Bagaimana jika saya memutuskan untuk memindahkan beberapa skrip saya untuk melakukan kerangka kerja berbeda yang tidak memiliki konstanta yang sama
defined()
? ... Hore! ^ _ ^Saya menemukan strategi ini membuat pengembangan lebih menyenangkan dan lebih sedikit:
sumber
Jika lebih tepat, Anda harus menggunakan kondisi ini:
get_included_files () mengembalikan array yang diindeks yang berisi nama-nama semua file yang disertakan (jika file beign dieksekusi maka itu dimasukkan dan namanya ada di dalam array). Jadi, ketika file diakses secara langsung, namanya adalah yang pertama dalam array, semua file lain dalam array dimasukkan.
sumber
tempatkan kode di atas di bagian atas file php Anda yang disertakan.
ex:
sumber
Kode berikut digunakan dalam Flatnux CMS ( http://flatnux.altervista.org ):
sumber
Saya menemukan solusi php-only dan invariable ini yang berfungsi baik dengan http dan cli:
Tentukan fungsi:
Panggil fungsi dalam file yang Anda ingin mencegah akses langsung ke:
Sebagian besar solusi yang diberikan di atas untuk pertanyaan ini tidak berfungsi dalam mode Cli.
sumber
sumber
sumber
Menyimpan file termasuk Anda di luar direktori yang dapat diakses web telah disebutkan beberapa kali, dan tentu saja merupakan strategi yang baik jika memungkinkan. Namun, opsi lain yang belum saya sebutkan disebutkan: pastikan bahwa file yang Anda sertakan tidak mengandung kode yang dapat dijalankan . Jika file sertakan Anda hanya mendefinisikan fungsi dan kelas, dan tidak memiliki kode selain itu, mereka hanya akan menghasilkan halaman kosong ketika diakses secara langsung.
Dengan segala cara, izinkan akses langsung ke file ini dari browser: tidak akan melakukan apa pun . Ini mendefinisikan beberapa fungsi, tetapi tidak ada yang dipanggil, jadi tidak ada yang berjalan.
Hal yang sama berlaku untuk file yang hanya berisi kelas PHP, dan tidak ada yang lain.
Sebaiknya simpan file Anda di luar direktori web.
system
, karena itu akan bertentangan dengan jalur yang digunakan untuk kode. Saya menemukan ini menjengkelkan.sumber
Lakukan sesuatu seperti:
sumber
Anda dapat menggunakan metode berikut di bawah ini meskipun, itu memang memiliki cacat, karena dapat dipalsukan, kecuali jika Anda dapat menambahkan baris kode lain untuk memastikan permintaan hanya datang dari server Anda dengan menggunakan Javascript. Anda dapat menempatkan kode ini di bagian Tubuh dari kode HTML Anda, sehingga kesalahan ditampilkan di sana.
Tempatkan kode HTML Anda yang lain di sini
Akhiri seperti ini, sehingga output dari kesalahan akan selalu muncul di dalam bagian tubuh, jika itu yang Anda inginkan.
sumber
Saya menyarankan agar jangan gunakan
$_SERVER
untuk alasan keamanan.Anda dapat menggunakan variabel seperti
$root=true;
di file pertama yang menyertakan yang lain.dan gunakan
isset($root)
di awal file kedua yang disertakan.sumber
Yang juga dapat Anda lakukan adalah melindungi kata sandi direktori dan menyimpan semua skrip php Anda di sana, tentu saja kecuali file index.php, karena pada saat memasukkan kata sandi tidak akan diperlukan karena hanya akan diperlukan untuk akses http. apa yang akan dilakukan adalah juga memberi Anda pilihan untuk mengakses skrip Anda jika Anda menginginkannya karena Anda akan memiliki kata sandi untuk mengakses direktori itu. Anda perlu mengatur file .htaccess untuk direktori dan file .htpasswd untuk mengotentikasi pengguna.
baik, Anda juga dapat menggunakan salah satu solusi yang disediakan di atas jika Anda merasa Anda tidak perlu mengakses file-file itu secara normal karena Anda selalu dapat mengaksesnya melalui cPanel dll.
Semoga ini membantu
sumber
Cara termudah adalah menyimpan milik Anda di luar direktori web. Dengan cara itu server memiliki akses ke mereka tetapi tidak ada mesin di luar. Satu-satunya kelemahan adalah Anda harus dapat mengakses bagian server ini. Sisi baiknya adalah tidak memerlukan pengaturan, konfigurasi, atau tekanan kode / server tambahan.
sumber
Saya tidak menemukan saran dengan .htaccess yang begitu bagus karena mungkin memblokir konten lain di folder itu yang mungkin ingin Anda akses pengguna, ini solusi saya:
sumber
akan melakukan pekerjaan dengan lancar
sumber
BASEPATH
const
diatur dalamindex.php
file yang terletak di bagian bawah struktur pohon. CI menulis ulang URL sehingga tidak perlu mengakses skrip secara langsung.Solusi yang disebutkan sebelumnya dengan cek versi PHP ditambahkan:
sumber