Php include dosyasına doğrudan erişimi önleme


166

Ben sadece bir içerme olarak kullanacağım bir php dosyası var. Bu nedenle, URL yerine yazılmak yerine doğrudan URL'ye yazıldığında erişilmesi yerine hata vermek istiyorum.

Temelde ben php dosyasında aşağıdaki gibi bir kontrol yapmak gerekir:

if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");

Bunu yapmanın kolay bir yolu var mı?


10
die () yerine 'header ("HTTP / 1.1 404 Dosya Bulunamadı", 404); çıkış;'. Bu (en azından apache'de) sunucunun normal 404 sayfasına dönmesini sağlar.
gnud

İşte PHP dahil dosyaları doğrudan erişimi devre dışı bırakmak için açıklamak iki kolay yöntem - codespeedy.com/disable-direct-access-to-the-php-include-file
Faruque Ahamed Mollick 18:07

Yanıtlar:


174

Genel "bir Apache sunucusunda çalışan veya tam olarak kontrol edemeyeceğiniz" durumundaki PHP uygulamasının en kolay yolu, eklerinizi bir dizine koymak ve .htaccess dosyanızdaki bu dizine erişimi reddetmektir. Kullanıcılara Google'ı kullanmaktan kaçınmak için, Apache kullanıyorsanız, bunu erişilebilir olmasını istemediğiniz dizine ".htaccess" adlı bir dosyaya koyun:

Deny from all

Aslında sunucunun tam denetimine sahipseniz (bu günlerde küçük uygulamalar için bile bu yanıtı ilk yazdığımdan daha yaygın), en iyi yaklaşım korumak istediğiniz dosyaları web sunucunuzun hizmet verdiği dizinin dışına yapıştırmaktır . Dolayısıyla, uygulamanız içeriyorsa /srv/YourApp/, sunucuyu dosyaları sunacak /srv/YourApp/app/ve içerecekleri şekilde ayarlayacak şekilde ayarlayın; /srv/YourApp/includesbu nedenle, bunlara erişebilecek herhangi bir URL yoktur.


1
Teşekkürler, bu uygulamayı çalıştığım sunucu üzerinde tam kontrole sahip olduğum için, bu cevap verdim.
Alterlife

24
sunucunun tam denetimine sahipseniz, config'i sanal ana bilgisayar yapılandırma dosyasına bir dizin yönergesine koyarsanız daha iyi olur. Apache başlangıçta sadece bir kez okudu, her erişimde .htaccess okunur ve sunucuyu yavaşlatır
Eineki

22
Bu yanıtın bir parçası olarak örnek bir .htaccess dosyasına sahip olmak güzel olurdu.
Graham Lea

7
<Files ~ "\.inc$"> Order Allow,Deny Deny from All </Files>
Dracorat

11
@James: Ayrıca herkes Stack Overflow'un bir "plz send teh codez" sitesi olması gerektiğini düşünmez. Soruyu açıkça cevaplıyorsa, iyi bir cevaptır. Hiçbir şeye ihtiyaç duyulmayan bir örnek vermek, yalnızca kopyala ve yapıştır kodlamasını teşvik eder.
Chuck

188

Bunu yalnızca dahil edilmesini istediğiniz sayfaya ekleyin

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

daha sonra içerdiği sayfalarda

<?php
define('MyConst', TRUE);
?>

3
Gerçekten daha hızlı yazmayı öğrenmem gerekiyor. Bu, kontrol etmek için bir değişken kullanan bir yöntemden daha güvenli olduğu gibi önerebileceğim gibi. Bazı PHP kurulumlarında, değişkeni geçersiz kılmak mümkün olabilir.
Mark Davidson

3
Birkaç 'ana akım' uygulama bu şekilde ele alır. Joomla'nın bu şekilde yaptığını biliyorum ve sanırım Wiki, Wordpress ve diğerleri de.
UnkwnTech

1
Belki mesaj bir hacker için çok yararlıdır (hiçbir gerçek kullanıcı bu sayfaları bulamaz), sadece bir yönlendirme başlığı gönderebilir ve php işlemini durdurabilirsiniz.
bandi

7
Bir 404 üstbilgisi gönderin ve çıkın - hata sayfası normal 404 sayfalarıyla aynı görünecektir (en azından Apache'de).
gnud

4
@ Smile.Hunter: Bu, içerme / kütüphane script dosyalarınızı doğrudan görüntüleme erişimini engelleme ile ilgili, cevap çalışıyor. somefile.phpSunucunuzda oluşturup tanımlamanızı eklediyse, yine de ekleme dosyasına doğrudan erişmelerine izin vermez. Kitaplık dosyalarınızı "dahil etmelerine" izin verir, ancak sunucunuzda dosya oluşturmaya ve tanımla / dahil komut dosyalarınızı bilmeye yetecek kadar çok şey alırlarsa, öncelikle kendi tanımlamanızı kullanarak kendi dosyalarınızı yazmayı reddeden başka sorunlarınız olur. .
James

114

Doğrudan (özellikle bir print()vs return()) erişildiğinde vs dahil edildiğinde farklı davranmak için gereken bir dosya var İşte bazı değiştirilmiş kod:

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

Erişilen dosya her zaman dahil edilen bir dosyadır, dolayısıyla == 1'dir.  


12
Bu aslında dahil edilen dosya sayısını kontrol eden bir fikir. Hangisinin daha iyi olduğunu merak ediyorum: tanımlar veya bu yöntemi kullanarak? Bu daha bağımsız görünüyor.
Akoi Meexx

İlk defa kimsenin bununla geldiğini gördüm. Nedenini bilmiyorum, çünkü olabildiğince kendi kendine yeten gibi görünüyor ve ilişkili olduğu varsayılan bir şeyi (belirli bir sabit veya .htaccess tarafından yasaklanan belirli bir konum). Güzel.
Jimbo Jonny

Bu gerçekten harika çünkü tüm .php dosyalarını engellemek için .htaccess kullanmak her zaman mümkün olmayabilir, çünkü aynı dizinde doğrudan veya javascripts tarafından çağrılması gereken bazı dosyalar olabilir. Bu harika fikir için teşekkürler!
Anuj

3
Bu yalnızca PHP5 ve sonraki sürümlerde çalışır. PHP5 öncesi tekrar 1 yerine 0 karşılaştırmak istiyorsunuz.
jmucchiello

Bu gerçekten akıllı bir çözümdür ve sadece erişimi engellemekle kalmayıp doğrudan erişimi kontrol etmenizi sağlar. Genellikle dosyalara birim testi eklerim ve bu şekilde birim testimi bu if ifadesine sarabilirim. Merak ne kadar verimli ..
whiteatom

34

Dosyalara doğrudan erişimi önlemenin en iyi yolu, dosyaları web sunucusu belge kökünün dışına (genellikle bir düzey yukarıda) yerleştirmektir. Bunları yine de ekleyebilirsiniz, ancak birisinin http isteği ile bunlara erişme olasılığı yoktur.

Genellikle sonuna kadar gidip tüm PHP dosyalarımı bootstrap dosyasından (web sitesinin / uygulamanın tamamını yönlendirmeye başlayan belge kökünde yalnız bir index.php) bir kenara yerleştirin .


3
Bunu yapabiliyorsanız, bu harika bir çözümdür. Kısa süre önce paylaşılan webhost'larla çalışmaya başladım ve her şeyin doktora içinde olması gerektiği için pek çok sıkıntıdan birini keşfettim.
Beau Simensen

3
Birlikte çalıştığım her barındırma sağlayıcısında her zaman (tam olarak) belge kökünün üzerine eriştim.
Eran Galperin

3
Bazı ana bilgisayarlarda (geçerli olanı da dahil), alan adınızı istediğiniz klasöre yönlendirebilirsiniz.
Dinah

1
Bu da iyi bir alternatif .. preg_match -> if (preg_match ("~ globalfile \ .php ~ i", $ _SERVER ['PHP_SELF'])) {die ('<h3 style = "color: red"> Cihaz Güvenlik Uyarısı - Doğrudan Erişime İzin Verilmedi! IP'niz günlüğe kaydedildi! <h3> '); //
Yürütmeyi

Bu url devzone.zend.com/node/view/id/70 artık 404. Bu sorunun yanıtı, orijinal olarak mevcut olmayan URL'den kullanılan kodu içermelidir.
Funk Forty Niner

31

1: Eklenen dosya sayısını kontrol etme

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

Mantık: Minimum içerme sayısı karşılanmazsa PHP çıkar. PHP5'ten önce temel sayfanın bir içerme olarak değerlendirilmediğini unutmayın.


2: Global sabitin tanımlanması ve doğrulanması

// 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');

Mantık: Sabit tanımlanmazsa, yürütme temel sayfadan başlamaz ve PHP yürütmeyi durdurur.

Not önemli ölçüde değişiklikler sabit kodlanmış her dosyaya olması gerekmez gibi havai kodlama azaltacak bu kimlik doğrulama yöntemi modüler yaparak yükseltmeleri ve gelecekteki değişiklikleri karşısında taşınabilirlik uğruna.

// 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');

Bu şekilde , günlük kaydı ve analitik amaçların yanı sıra uygun yanıtlar oluşturmak için ek kod eklenebilir checkdefined.php .

Kredinin vadesi geldiğinde kredi: Parlak bir taşınabilirlik fikri bu cevaptan geldi .


3: Uzaktan adres yetkilendirme

// 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');

Bu istekle ilgili dezavantaj, dahili istekle birlikte bir oturum belirteci sağlanmadığı takdirde yalıtılmış yürütmedir. Tek bir sunucu yapılandırması veya çoklu sunucu veya yük dengeli bir sunucu altyapısı için bir adres beyaz listesi olması durumunda geri döngü adresi üzerinden doğrulayın.


4: Jeton yetkilendirme

Önceki yönteme benzer şekilde, içerme dosyasına bir yetkilendirme belirteci iletmek için GET veya POST kullanılabilir:

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

Çok dağınık bir yöntem, aynı zamanda doğru şekilde kullanıldığında belki de en güvenli ve çok yönlü.


5: Web sunucusuna özgü yapılandırma

Çoğu sunucu tek tek dosyalar veya dizinler için izin atamanıza izin verir. Tüm içeriklerinizi bu tür kısıtlı dizinlere yerleştirebilir ve sunucunun bunları reddedecek şekilde yapılandırmasını sağlayabilirsiniz.

Örneğin APACHE'de yapılandırma .htaccessdosyaya kaydedilir . Eğitim burada .

Not farklı web sunucular arasında taşınabilirlik için kötü çünkü sunucu özgü yapılandırmaları benim tarafımdan tavsiye edilmez ancak o. Reddetme algoritmasının karmaşık olduğu veya reddedilen dizinlerin listesinin oldukça büyük olduğu İçerik Yönetim Sistemleri gibi durumlarda, yalnızca yeniden yapılandırma oturumlarını oldukça korkunç hale getirebilir. Sonunda bunu kodda ele almak en iyisidir.


6: Yerleştirme, site kökünün DIŞINDA güvenli bir dizine içerir

En az sunucu ortamlarındaki erişim sınırlamaları nedeniyle tercih edilir, ancak dosya sistemine erişiminiz varsa oldukça güçlü bir yöntemdir.

//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");

Mantık:

  • Bağlantılar htdocsweb sitesinin adres sisteminin kapsamı dışında olacağından , kullanıcı klasör dışındaki herhangi bir dosyayı isteyemez .
  • Php sunucusu, dosya sistemine yerel olarak erişir ve bu nedenle, gerekli ayrıcalıklara sahip normal bir program gibi bir bilgisayardaki dosyalara erişebilir.
  • Dahil etme dosyalarını bu dizine yerleştirerek, hotplinking kullanıcı tarafından reddedilirken php sunucusunun bunlara erişmesini sağlayabilirsiniz.
  • Web sunucusunun dosya sistemi erişim yapılandırması düzgün yapılmasa bile, bu yöntem bu dosyaların yanlışlıkla halka açılmasını engelleyecektir.

Lütfen alışılmadık kodlama sözleşmelerimi affedin. Herhangi bir geri bildirim takdir edilmektedir.


2 numarayı seviyorum
Baim Wrong

26

Chuck'ın çözümüne alternatif (veya tamamlayıcı), .htaccess dosyanıza böyle bir şey koyarak belirli bir kalıpla eşleşen dosyalara erişimi reddetmek olacaktır.

<FilesMatch "\.(inc)$">
    Order deny,allow
    Deny from all
</FilesMatch>

Sanırım .inc.php kullanmak daha iyi olurdu ve bu yaygın bir uygulamadır
Lis

14

Aslında benim tavsiyem tüm bu en iyi uygulamaları yapmak.

  • Belgeleri web kökünün dışına VEYA web sunucusu tarafından erişimi reddedilen bir dizine koyun VE
  • Görünür belgelerinizde gizli belgelerin kontrol ettiği bir tanım kullanın:
      if (!defined(INCL_FILE_FOO)) {
          header('HTTP/1.0 403 Forbidden');
          exit;
      }

Bu şekilde dosyalar bir şekilde yanlış yerleştirilirse (hatalı bir ftp işlemi) korunurlar.


8

Ben bir kez bu sorunu vardı, ile çözüldü:

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

ancak ideal çözüm, dosyayı başka bir sunucuda belirtildiği gibi web sunucusu belge kökünün dışına yerleştirmektir.


7

Bir giriş noktasıyla uygulama oluştursanız iyi olur, yani tüm dosyalara index.php dosyasından ulaşılmalıdır.

Bunu index.php dosyasına yerleştirin

define(A,true);

Bu kontrol her bağlantılı dosyada çalıştırılmalıdır (zorunlu veya dahil)

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

7

Ben doğrudan PHP dosyasına erişimi kısıtlamak istedim , ama aynı zamanda üzerinden aramak mümkün jQuery $.ajax (XMLHttpRequest). İşte benim için işe yarayan.

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;
    }
}

3

En kolay yol, çağrıda bulunan dosyada, örneğin

$including = true;

Ardından dahil edilen dosyada değişkeni kontrol edin

if (!$including) exit("direct access not permitted");

2
Register_globals açıksa bu tehlikelidir.
jmucchiello

25
Register_globals açıksa PHP tehlikelidir.
David Precious

3

.Htaccess yolunun yanı sıra, çeşitli çerçevelerde, örneğin raylarda yakutta kullanışlı bir desen gördüm. Uygulama kök dizininde ayrı bir pub / dizini var ve kütüphane dizinleri pub / ile aynı düzeydeki dizinlerde yaşıyorlar . Böyle bir şey (ideal değil, ama fikri anlıyorsunuz):

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

Web sunucunuzu pub / dosyasını belge kökü olarak kullanacak şekilde ayarladınız. Bu, komut dosyalarınız için daha iyi koruma sağlar: gerekli bileşenleri yüklemek için belge kökünden uzanabilirken, bileşenlere internetten erişmek imkansızdır. Güvenliğin yanı sıra bir diğer fayda da her şeyin tek bir yerde olmasıdır.

Bu kurulum, dahil edilen her dosyada kontrol oluşturmaktan daha iyidir, çünkü "erişime izin verilmiyor" mesajı saldırganlar için bir ipucu ve beyaz listeye dayalı olmadığı için .htaccess yapılandırmasından daha iyidir: dosya uzantılarını sıkıştırırsanız lib /, conf / etc. dizinlerinde görünmez.


Uzun bir süre sonra, yukarıda açıkladığınız modelin MVC (Model - View - Controller) modeli olduğunu söylemek istiyorum. Lütfen, google'ı kontrol edin ve cevabınıza biraz daha bilgi ekleyin. Ayrıca MVC sadece Ruby on Rails ve ASP.NET uygulamalarını değil, aynı zamanda PHP'yi de destekler (bakınız Lavarel, CakePHP).

3

Ne Joomla! kök dosyada bir sabiti tanımlamak ve bunun içerdiği dosyalarda tanımlanıp tanımlanmadığını kontrol etmektir.

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

ya da başka

CodeIgniter gibi çoğu çerçeve önerdiği gibi webroot dizininin dışına yerleştirerek tüm dosyaları bir http isteğinin dışında tutabilirsiniz.

hatta dahil etme klasörüne ve yazma kurallarına bir .htaccess dosyası yerleştirerek doğrudan erişimi engelleyebilirsiniz.


3
debug_backtrace() || die ("Direct access not permitted");

3

Cevabım yaklaşım açısından biraz farklı ama burada verilen cevapların birçoğunu içeriyor. Çok yönlü bir yaklaşım tavsiye ederim:

  1. Elbette .htaccess ve Apache kısıtlamaları
  2. defined('_SOMECONSTANT') or die('Hackers! Be gone!');

ANCAKdefined or die yaklaşım başarısızlıkları bir numarası vardır. İlk olarak, varsayımlarda test etmek ve hata ayıklamak için gerçek bir acıdır. İkincisi, eğer fikrinizi değiştirirseniz, korkunç, akıl almaz sıkıcı yeniden düzenlemeyi içerir. "Bul ve Değiştir!" diyorsun. Evet, ama her yerde aynı yazdığınızdan ne kadar eminsiniz? Şimdi bunu binlerce dosyayla çarpın ... oO

Ve sonra .htaccess var. Kodunuz yöneticinin çok titiz olmadığı sitelere dağıtılırsa ne olur? Dosyalarınızı güvence altına almak için yalnızca .htaccess'e güveniyorsanız, a) yedeklemeye, b) gözyaşlarınızı kurutmak için bir kutu mendile, c) insanlardan tüm hatemaildeki alevleri söndürmek için bir yangın söndürücüye ihtiyacınız olacaktır. kodunuzu kullanarak.

Bu yüzden sorunun "en kolay" olduğunu sorduğunu biliyorum, ama bunun daha çok "savunmacı kodlama" olduğunu düşünüyorum.

Ne öneririm:

  1. Senaryoların herhangi birinden önce require('ifyoulieyougonnadie.php');( yerine include() ve yerine defined or die)
  2. İçinde ifyoulieyougonnadie.phpbazı mantıksal şeyler yapın - farklı sabitleri kontrol edin, komut dosyası, localhost testi die(), throw new Exception, 403vb.

    İki olası giriş noktasıyla kendi çerçevemi oluşturuyorum - ana index.php (Joomla çerçevesi) ve ajaxrouter.php (çerçevem) - bu yüzden giriş noktasına bağlı olarak farklı şeyleri kontrol ediyorum. Eğer istek ifyoulieyougonnadie.phpbu iki dosyadan birinden gelmezse, shenanigans'ın üstlenildiğini biliyorum!

    Ancak yeni bir giriş noktası eklersem ne olur? Telaşa gerek yok. Sadece değiştiriyorum ifyoulieyougonnadie.phpve sıralıyorum, artı 'bul ve değiştir' yok. Yaşasın!

    Betiklerimin bir kısmını aynı sabitlere sahip olmayan farklı bir çerçeve oluşturmak için taşımaya karar verirsem ne olur defined()? ... Yaşasın! ^ _ ^

Bu stratejinin gelişimi çok daha eğlenceli ve çok daha az hale getirdiğini gördüm:

/**
 * 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();

2

Daha doğrusu, bu koşulu kullanmalısınız:

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

get_included_files () , dahil edilen tüm dosyaların adlarını içeren dizine alınmış diziyi döndürür ( dosya yürütülürse dosya dahil edilir ve adı dizide bulunur). Bu nedenle, dosyaya doğrudan erişildiğinde, dizideki ilk addır, dizideki diğer tüm dosyalar dahil edilmiştir.


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>");
}
?>

yukarıdaki kodu dahil php dosyanızın üstüne yerleştirin.

örn:

<?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
?>

if (preg_match ("~ globalfile \ .php ~ i", $ _SERVER ['PHP_SELF'])) {die ('<h3 style = "color: red"> Cihaz Güvenlik Uyarısı - Doğrudan Erişime İzin Verilmedi! IP'niz günlüğe kaydedildi ! <h3> '); // Daha fazla yürütmeyi durdur}
whis


1

Ben hem php hem de cli ile çalışan bu php sadece ve değişmez bir çözüm bulundu:

Bir fonksiyon tanımlayın:

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

Doğrudan erişimi engellemek istediğiniz dosyadaki işlevi çağırın:

forbidDirectAccess(__FILE__);

Bu soruya yukarıda verilen çözümlerin çoğu Cli modunda çalışmaz.


URL'yi CLI modunda nerede yazması gerekiyor?
Ortak Duygunuz

Sadece php script / inlude'un cli modunda başlatılmasını önlemek içindir. Birden çok geliştiriciye sahip bir projede faydalı olabilir.
Ka.

1
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { die('Access denied'); };

1
<?php       
$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  if (false !== strpos($url,'.php')) {
      die ("Direct access not premitted");
  }
?>

1

Dahil etme dosyalarınızı web erişilebilir dizinin dışında saklamaktan birkaç kez bahsedildi ve kesinlikle mümkün olduğunda iyi bir stratejidir. Ancak, daha önce bahsetmediğim başka bir seçenek: içerme dosyalarınızın çalıştırılabilir kod içermediğinden emin olun . Dahil etme dosyalarınız yalnızca işlevleri ve sınıfları tanımlarsa ve bunun dışında hiçbir kod yoksa, doğrudan erişildiğinde boş bir sayfa oluştururlar.

Elbette bu dosyaya tarayıcıdan doğrudan erişime izin verin: hiçbir şey yapmaz . Bazı işlevleri tanımlar, ancak hiçbiri çağrılmaz, hiçbiri çalışmaz.

<?php

function a() {
    // function body
}

function b() {
    // function body
}

Aynı şey sadece PHP sınıfları içeren dosyalar için de geçerlidir.


Dosyalarınızı mümkünse web dizininin dışında tutmak yine de iyi bir fikirdir.

  • PHP'yi yanlışlıkla devre dışı bırakabilirsiniz; bu durumda sunucunuz PHP'yi çalıştırmak ve sonucu göndermek yerine tarayıcıya PHP dosyalarının içeriğini gönderebilir. Bu, kodunuzun (veritabanı şifreleri, API anahtarları vb. Dahil) sızmasına neden olabilir.
  • Web dizinindeki dosyalar, uygulamanız için kullanmak isteyebileceğiniz URL'lerde çömeliyor. systemKod için kullanılan bir yol ile çakışma çünkü adlı bir sayfa olamaz bir CMS ile çalışır . Bunu sinir bozucu buluyorum.

0

Gibi bir şey yapın:

<?php
if ($_SERVER['SCRIPT_FILENAME'] == '<path to php include file>') {
    header('HTTP/1.0 403 Forbidden');
    exit('Forbidden');
}
?>

Bu, tarayıcıya yüklenmesini engellemez.
UnkwnTech

0

Aşağıdaki yöntemi kullanabilirsiniz, ancak bir kusur vardır, çünkü sahte olabilir, ancak isteğin yalnızca sunucunuzdan Javascript kullanarak geldiğinden emin olmak için başka bir kod satırı ekleyebilmeniz dışında. Bu kodu HTML kodunuzun Gövde bölümüne yerleştirebilirsiniz, böylece hata burada görünür.

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

Diğer HTML kodunuzu buraya yerleştirin

<? } ?>

Bu şekilde bitirin, böylece hatanın çıktısı her zaman gövde bölümünde gösterilecektir, eğer böyle olmasını istiyorsanız.


Tüm HTTP_ * sunucu başlıklarına güvenilmeyeceğini anlıyorum, bu yüzden bu yöntemi kullanmasanız iyi olur.
andreszs

0

$_SERVERGüvenlik nedeniyle kullanmamanızı öneririm . İlk dosyada olduğu
gibi $root=true;başka bir değişken içeren bir değişken kullanabilirsiniz .
ve isset($root)ikinci dosyanın başlangıcında kullanın .


0

Yapabileceğiniz şey parola dizini korumak ve tüm php komut dosyalarınızı orada tutmaktır, tabii ki index.php dosyası hariç, dahil etme sırasında parola gerekli olmadığından, yalnızca http erişimi için gerekli olmayacaktır. ne yapacağını da o dizine erişmek için şifre olacak gibi komutları erişmek için seçenek sunmaktır. kullanıcının kimliğini doğrulamak için dizin için .htaccess dosyasını ve .htpasswd dosyasını ayarlamanız gerekir.

bu dosyalara normal olarak erişmeniz gerekmediğini düşünüyorsanız, yukarıda verilen çözümlerden herhangi birini de kullanabilirsiniz, çünkü cPanel vb. aracılığıyla her zaman erişebilirsiniz.

Bu yardımcı olur umarım


0

En kolay yol, içeriklerinizi web dizininin dışında saklamaktır. Bu şekilde sunucunun bunlara erişimi olur, ancak dış makineye erişimi olmaz. Tek tarafı sunucunuzun bu bölümüne erişebilmenizdir. Bunun tersi hiçbir kurulum, yapılandırma veya ek kod / sunucu stresi gerektirmemesidir.


0

Bu klasördeki kullanıcının erişmesine izin vermek isteyebileceğiniz diğer içerikleri engelleyebileceği için .htaccess ile önerileri çok iyi bulamadım, bu benim çözümüm:

$currentFileInfo = pathinfo(__FILE__);
$requestInfo = pathinfo($_SERVER['REQUEST_URI']);
if($currentFileInfo['basename'] == $requestInfo['basename']){
    // direct access to file
}

0
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

işi düzgün yapacak


2
CodeIgnitor kopya yapıştırın. Bu harika ama aslında kendi başına bir şey yapmıyor. Bu BASEPATH const , index.phpağaç yapısının altında bulunan bir dosyada ayarlanır . CI, URL'leri yeniden yazar, böylece komut dosyalarına doğrudan erişmeye gerek kalmaz.
jimasun

gerek yok biliyorum ama herhangi biri bunu yapmaya çalışırsa
Varshaan

0

PHP sürüm kontrolü ile daha önce bahsedilen çözüm eklendi:

    $max_includes = version_compare(PHP_VERSION, '5', '<') ? 0 : 1;
    if (count(get_included_files()) <= $max_includes)
    {
        exit('Direct access is not allowed.');
    }

2
Bunun doğrudan erişimi nasıl önleyebileceğini gerçekten anlamıyorum
Adam Lindsay
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.