Cegah akses langsung ke file include php

166

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?

Alterlife
sumber
10
alih-alih die () Anda harus menguji tajuk '("HTTP / 1.1 404 File Tidak Ditemukan", 404); keluar;'. Ini akan (setidaknya pada apache) membuat server mengembalikan halaman 404 yang normal.
Gnud
Berikut adalah dua metode mudah yang saya jelaskan untuk menonaktifkan akses langsung di PHP termasuk file - codespeedy.com/disable-direct-access-to-the-php-include-file
Faruque Ahamed Mollick

Jawaban:

173

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:

Deny from all

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.

Membuang
sumber
1
Terima kasih, karena saya memiliki kontrol penuh atas server tempat saya menjalankan aplikasi ini, inilah jawaban yang saya gunakan.
Alterlife
24
jika Anda memiliki kontrol penuh terhadap server lebih baik jika Anda memasukkan konfigurasi ke dalam direktori directive ke dalam file konfigurasi host virtual. Apache membacanya hanya sekali pada saat startup, .htaccess dibaca pada setiap akses dan memperlambat server
Eineki
22
Akan menyenangkan untuk memiliki contoh file .htaccess sebagai bagian dari jawaban ini.
Graham Lea
7
<Files ~ "\.inc$"> Order Allow,Deny Deny from All </Files>
Dracorat
11
@ James: Juga, tidak semua orang merasa bahwa Stack Overflow harus berupa situs "plz send teh codez". Jika itu menjawab pertanyaan dengan jelas, maka itu adalah jawaban yang baik. Memberikan contoh di mana tidak diperlukan hanya mendorong pengkodean copy dan paste.
Chuck
188

Tambahkan ini ke halaman yang hanya ingin Anda sertakan

<?php
if(!defined('MyConst')) {
   die('Direct access not permitted');
}
?>

kemudian pada halaman yang memasukkannya tambahkan

<?php
define('MyConst', TRUE);
?>
UnkwnTech
sumber
3
Saya benar-benar perlu belajar mengetik lebih cepat. Ini adalah cara yang sama saya sarankan, karena lebih aman daripada metode yang menggunakan variabel untuk memeriksa. Karena dengan beberapa pengaturan PHP, dimungkinkan untuk mengganti variabel.
Mark Davidson
3
Ini adalah bagaimana beberapa aplikasi 'arus utama' menanganinya. Saya tahu Joomla melakukannya dengan cara ini dan saya pikir Wiki, Wordpress, dan lainnya juga.
UnkwnTech
1
Mungkin pesan ini terlalu membantu bagi peretas (tidak ada pengguna nyata yang akan menemukan halaman ini), Anda cukup mengirim header redirect dan menghentikan pemrosesan php.
bandi
7
Cukup kirim tajuk 404 dan keluar - halaman kesalahan akan terlihat identik dengan halaman 404 normal (setidaknya di Apache).
gnud
4
@ Smile.Hunter: ini tentang memblokir akses untuk melihat file skrip include / library Anda secara langsung, jawabannya bekerja. Jika mereka dibuat somefile.phpdi 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. .
James
114

Saya punya file yang harus saya lakukan dengan cara berbeda saat disertakan vs saat diakses langsung (terutama print()vs return()) Berikut ini beberapa kode yang dimodifikasi:

if(count(get_included_files()) ==1) exit("Direct access not permitted.");

File yang diakses selalu merupakan file yang disertakan, karenanya == 1.  

batal
sumber
12
Itu sebenarnya ide yang sangat bagus, memeriksa jumlah file yang disertakan. Saya bertanya-tanya mana yang lebih baik: menggunakan definisi, atau menggunakan metode ini? Ini tampaknya lebih mandiri.
Akoi Meexx
Pertama kali saya pernah melihat ada yang datang dengan ini. Namun saya tidak tahu mengapa, karena nampak seperti berisi diri, dan itu secara langsung mengukur apa yang sebenarnya ingin Anda ketahui (jika disertakan atau tidak) daripada mengukur sesuatu yang diasumsikan terkait (seperti konstanta atau lokasi tertentu dilarang oleh .htaccess). Cantik.
Jimbo Jonny
Yang ini sangat keren karena menggunakan .htaccess untuk memblokir semua file .php mungkin tidak dapat dilakukan sepanjang waktu karena mungkin ada beberapa file dalam direktori yang sama yang perlu dipanggil secara langsung atau bahkan oleh javascripts. Terima kasih atas ide bagus ini!
Anuj
3
Ini hanya berfungsi di PHP5 dan lebih tinggi. Pra-PHP5 Anda ingin membandingkan lagi 0 bukannya 1.
jmucchiello
Ini adalah solusi yang sangat pintar dan memungkinkan Anda untuk mengontrol akses langsung, bukan hanya memblokirnya - itulah yang saya suka. Saya biasanya menyertakan pengujian unit dalam file itu sendiri, dan dengan cara ini saya bisa membungkus pengujian unit saya dalam pernyataan if ini. Bertanya-tanya seberapa efisiennya ..
whiteatom
34

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.

Eran Galperin
sumber
3
Ini adalah solusi hebat jika Anda mampu melakukannya. Saya baru-baru ini harus mulai bekerja dengan hosting bersama dan menemukan satu dari banyak gangguan adalah bahwa semuanya harus ada di dalam dokumen.
Beau Simensen
3
Di setiap penyedia hosting tempat saya bekerja, saya selalu memiliki akses (persis) satu tingkat di atas root dokumen.
Eran Galperin
3
Di beberapa host (termasuk saya yang sekarang), Anda dapat mengarahkan domain Anda ke folder mana pun yang Anda inginkan.
Dinah
1
Ini adalah alternatif yang baik juga .. menggunakan preg_match -> if (preg_match ("~ globalfile \ .php ~ i", $ _SERVER ['PHP_SELF'])) {die ('<h3 style = "color: red"> Peringatan Keamanan Peralatan - Akses Langsung Dilarang! IP Anda telah dicatat! <h3> '); // Hentikan eksekusi lebih lanjut}
MarcoZen
URL devzone.zend.com/node/view/id/70 itu adalah 404 sekarang. Jawabannya harus mencakup kode yang awalnya digunakan dari url yang tidak ada.
Funk Forty Niner
31

1: Memeriksa jumlah file yang disertakan

if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
    exit('Restricted Access');
}

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

// In the base page (directly accessed):
define('_DEFVAR', 1);

// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');

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.

// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');

// Replace the same code in the include files with:
require_once('checkdefined.php');

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

// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");

// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');

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:

if($key!="serv97602"){header("Location: ".$dart);exit();}

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 .htaccessfile. 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.

//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");

Logika:

  • Pengguna tidak dapat meminta file apa pun di luar htdocsfolder karena tautannya akan berada di luar ruang lingkup sistem alamat situs web.
  • Server php mengakses sistem file secara asli, dan karenanya dapat mengakses file di komputer seperti halnya program normal dengan hak istimewa yang diperlukan dapat.
  • Dengan menempatkan file sertakan dalam direktori ini, Anda dapat memastikan bahwa server php dapat mengaksesnya, sementara hotlinking ditolak untuk pengguna.
  • Bahkan jika konfigurasi akses sistem file server web tidak dilakukan dengan benar, metode ini akan mencegah file-file tersebut menjadi publik secara tidak sengaja.

Maafkan konvensi pengkodean yang tidak lazim. Umpan balik sangat dihargai.

RiA
sumber
Saya suka nomor 2
Baim Salah
26

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

<FilesMatch "\.(inc)$">
    Order deny,allow
    Deny from all
</FilesMatch>
Kevin Loney
sumber
Akan lebih baik menggunakan .inc.php saya percaya, dan ini adalah praktik umum
Lis
14

Sebenarnya saran saya adalah melakukan semua praktik terbaik ini.

  • Letakkan dokumen di luar webroot ATAU di direktori yang tidak dapat diakses oleh server web DAN
  • Gunakan definisi dalam dokumen Anda yang terlihat yang diperiksa oleh dokumen tersembunyi:
      if (!defined(INCL_FILE_FOO)) {
          header('HTTP/1.0 403 Forbidden');
          exit;
      }

Dengan cara ini jika file menjadi salah tempat entah bagaimana (operasi ftp yang salah) mereka masih dilindungi.

jmucchiello
sumber
8

Saya pernah mengalami masalah ini, diselesaikan dengan:

if (strpos($_SERVER['REQUEST_URI'], basename(__FILE__)) !== false) ...

tetapi solusi yang ideal adalah menempatkan file di luar root dokumen web-server, sebagaimana disebutkan dalam server lain.

mati
sumber
7

Anda sebaiknya membangun aplikasi dengan satu titik masuk, yaitu semua file harus dijangkau dari index.php

Tempatkan ini di index.php

define(A,true);

Pemeriksaan ini harus dijalankan di setiap file yang ditautkan (melalui keharusan atau termasuk)

defined('A') or die(header('HTTP/1.0 403 Forbidden'));
pengguna2221806
sumber
7

Saya ingin membatasi akses ke file PHP secara langsung, tetapi juga dapat memanggilnya via jQuery $.ajax (XMLHttpRequest). Inilah yang bekerja untuk saya.

if (empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_SERVER["HTTP_X_REQUESTED_WITH"] != "XMLHttpRequest") {
    if (realpath($_SERVER["SCRIPT_FILENAME"]) == __FILE__) { // direct access denied
        header("Location: /403");
        exit;
    }
}
krasenslavov
sumber
3

Cara termudah adalah dengan menetapkan beberapa variabel dalam file yang menyertakan panggilan, seperti

$including = true;

Kemudian dalam file yang disertakan, periksa variabelnya

if (!$including) exit("direct access not permitted");
Kyle Cronin
sumber
2
Ini berbahaya jika register_globals aktif.
jmucchiello
25
PHP berbahaya jika register_globals aktif.
David Precious
3

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):

app/
 |
 +--pub/
 |
 +--lib/
 |
 +--conf/
 |
 +--models/
 |
 +--views/
 |
 +--controllers/

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.

bandi
sumber
Setelah lama saya hanya ingin berkomentar bahwa model yang Anda gambarkan di atas disebut model MVC (Model - View - Controller). Jika Anda berkenan, periksa google dan tambahkan beberapa info lagi ke jawaban Anda. MVC juga mendukung tidak hanya aplikasi Ruby on Rails dan ASP.NET, tetapi juga PHP (lihat Lavarel, CakePHP).
3

Apa Joomla! Apakah mendefinisikan Konstan dalam file root dan memeriksa apakah hal yang sama didefinisikan dalam file yang disertakan.

defined('_JEXEC') or die('Restricted access');

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.

Pradeesh kumar
sumber
3
debug_backtrace() || die ("Direct access not permitted");
Unirgy
sumber
3

Jawaban saya agak berbeda dalam pendekatan tetapi mencakup banyak jawaban yang diberikan di sini. Saya akan merekomendasikan pendekatan multiguna:

  1. Pembatasan .htaccess dan Apache pasti
  2. defined('_SOMECONSTANT') or die('Hackers! Be gone!');

Namun yang defined or diependekatan 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 ... oO

Lalu 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:

  1. Sebelum ada skrip Anda require('ifyoulieyougonnadie.php');( bukan include() dan sebagai pengganti untuk defined or die)
  2. Di ifyoulieyougonnadie.php, lakukan beberapa hal yang logis - periksa konstanta yang berbeda, skrip panggilan, pengujian localhost dan semacamnya - dan kemudian implementasikan die(), 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.phptidak 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.phpdan 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:

/**
 * Hmmm... why is my netbeans debugger only showing a blank white page 
 * for this script (that is being tested outside the framework)?
 * Later... I just don't understand why my code is not working...
 * Much later... There are no error messages or anything! 
 * Why is it not working!?!
 * I HATE PHP!!!
 * 
 * Scroll back to the top of my 100s of lines of code...
 * U_U
 *
 * Sorry PHP. I didn't mean what I said. I was just upset.
 */

 // defined('_JEXEC') or die();

 class perfectlyWorkingCode {}

 perfectlyWorkingCode::nowDoingStuffBecauseIRememberedToCommentOutTheDie();
Biasa saja
sumber
2

Jika lebih tepat, Anda harus menggunakan kondisi ini:

if (array_search(__FILE__, get_included_files()) === 0) {
    echo 'direct access';
}
else {
    echo 'included';
}

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.

Oleg Lokshyn
sumber
1
<?php
if (eregi("YOUR_INCLUDED_PHP_FILE_NAME", $_SERVER['PHP_SELF'])) { 
 die("<h4>You don't have right permission to access this file directly.</h4>");
}
?>

tempatkan kode di atas di bagian atas file php Anda yang disertakan.

ex:

<?php
if (eregi("some_functions.php", $_SERVER['PHP_SELF'])) {
    die("<h4>You don't have right permission to access this file directly.</h4>");
}

    // do something
?>
Kiat Blogging
sumber
if (preg_match ("~ globalfile \ .php ~ i", $ _SERVER ['PHP_SELF'])) {die ('<h3 style = "color: red"> Peringatan Keamanan Peralatan - Akses Langsung Tidak Diijinkan! IP Anda telah dicatat ! <h3> '); // Hentikan eksekusi lebih lanjut} whre ~ adalah pembatas
MarcoZen
1

Kode berikut digunakan dalam Flatnux CMS ( http://flatnux.altervista.org ):

if ( strpos(strtolower($_SERVER['SCRIPT_NAME']),strtolower(basename(__FILE__))) )
{
    header("Location: ../../index.php");
    die("...");
}
JohnRDOrazio
sumber
1

Saya menemukan solusi php-only dan invariable ini yang berfungsi baik dengan http dan cli:

Tentukan fungsi:

function forbidDirectAccess($file) {
    $self = getcwd()."/".trim($_SERVER["PHP_SELF"], "/");
    (substr_compare($file, $self, -strlen($self)) != 0) or die('Restricted access');
}

Panggil fungsi dalam file yang Anda ingin mencegah akses langsung ke:

forbidDirectAccess(__FILE__);

Sebagian besar solusi yang diberikan di atas untuk pertanyaan ini tidak berfungsi dalam mode Cli.

Ka.
sumber
di mana seharusnya mengetik URL dalam mode CLI?
Akal Sehat Anda
Ini hanya untuk mencegah peluncuran script php / inlude dalam mode cli. Dapat bermanfaat dalam proyek dengan banyak pengembang.
Ka.
1
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { die('Access denied'); };
andy
sumber
1
<?php       
$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  if (false !== strpos($url,'.php')) {
      die ("Direct access not premitted");
  }
?>
Matt Bettiol
sumber
1

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.

<?php

function a() {
    // function body
}

function b() {
    // function body
}

Hal yang sama berlaku untuk file yang hanya berisi kelas PHP, dan tidak ada yang lain.


Sebaiknya simpan file Anda di luar direktori web.

  • Anda mungkin secara tidak sengaja menonaktifkan PHP, dalam hal ini server Anda dapat mengirim konten file PHP ke browser, alih-alih menjalankan PHP dan mengirimkan hasilnya. Ini dapat menyebabkan kode Anda (termasuk kata sandi basis data, kunci API, dll.) Bocor.
  • File dalam direktori web jongkok di URL yang mungkin ingin Anda gunakan untuk aplikasi Anda. Saya bekerja dengan CMS yang tidak dapat memiliki halaman yang dipanggil system, karena itu akan bertentangan dengan jalur yang digunakan untuk kode. Saya menemukan ini menjengkelkan.
Trigonometri
sumber
0

Lakukan sesuatu seperti:

<?php
if ($_SERVER['SCRIPT_FILENAME'] == '<path to php include file>') {
    header('HTTP/1.0 403 Forbidden');
    exit('Forbidden');
}
?>
kmkaplan
sumber
Ini tidak akan mencegahnya dimuat di browser.
UnkwnTech
0

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.

<?
if(!isset($_SERVER['HTTP_REQUEST'])) { include ('error_file.php'); }
else { ?>

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.

Pangeran yang menawan
sumber
Saya mengerti bahwa semua header server HTTP_ * tidak dapat dipercaya, jadi sebaiknya Anda tidak menggunakan metode ini.
andreszs
0

Saya menyarankan agar jangan gunakan $_SERVERuntuk 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.

M Rostami
sumber
0

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

RohitG
sumber
0

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
0

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:

$currentFileInfo = pathinfo(__FILE__);
$requestInfo = pathinfo($_SERVER['REQUEST_URI']);
if($currentFileInfo['basename'] == $requestInfo['basename']){
    // direct access to file
}
taliboni
sumber
0
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

akan melakukan pekerjaan dengan lancar

Varshaan
sumber
2
Salin tempel dari CodeIgnitor. Itu keren tapi sebenarnya tidak melakukan apa-apa sendiri. Ini BASEPATH const diatur dalam index.phpfile yang terletak di bagian bawah struktur pohon. CI menulis ulang URL sehingga tidak perlu mengakses skrip secara langsung.
jimasun
saya tahu tidak perlu tetapi jika ada yang mencoba melakukannya
Varshaan
0

Solusi yang disebutkan sebelumnya dengan cek versi PHP ditambahkan:

    $max_includes = version_compare(PHP_VERSION, '5', '<') ? 0 : 1;
    if (count(get_included_files()) <= $max_includes)
    {
        exit('Direct access is not allowed.');
    }
Milo Wanrooij
sumber
2
Saya tidak begitu mengerti bagaimana ini dapat mencegah akses langsung
Adam Lindsay