PHP: Bir dosya yerine dahil doğrudan yüklü olup olmadığını kontrol edin?

10 Cevap php

Bir dosyayı görüntülerken bir kullanıcı önlemek için bir yolu var mı ama başka bir dosyaya dahil olarak yine kullanabilirsiniz PHP?

10 Cevap

Eğer kullanın

define('APP_RAN'); 

sonra onu içeren dosya ve koydum

if(!defined('APP_RAN')){ die(); }

bunları doğrudan ulaşmak eğer dahil dosyaları öleceğini.


Muhtemelen olsa DocumentRoot yukarıdaki dahil tüm dosyaları koymak için daha iyi olurdu.

Örneğin, dizin sayfası olarak ise

/my/server/domain/public_html

Sen dahil dosyaları koymak gerekir

/my/server/domain/

, Dosyalarınızı sadece işlevleri ve yöntemleri herhangi bir küresel kodunu kullanmayın. Sonra doğrudan kullanım vs dahil umurumda gerek yok olacaktır.

Benim öneri:

<?php
if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
    exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>404 Not Found</title>\r\n</head><body>\r\n<h1>Not Found</h1>\r\n<p>The requested URL " . $_SERVER['SCRIPT_NAME'] . " was not found on this server.</p>\r\n</body></html>");
}
else {
   // your code
}
?>

Doğrudan başka denir eğer 1.) Bunun bir hata atar denetler

2). Onu belirsizlik aracılığıyla güvenlik eklemek için (orijinal 404 sayfa veya basit ile karşılaştırın lütfen bu sayfayı dahil) 404 standart apache hata sayfası çıktılar

Dosyası (PHP) ">" için beklemez canlı ortamına yüklenen ise 3..) Else parçalı kısmi yürütme önler. Lütfen dahil dosya yalnızca bir işlev / bir sınıf varsa bunu gerekmez.

Sadece web kök dışında dosya depolamak.

I Chacha102's solution için gitmek istiyorum.

Ayrıca, soru başlığı «how to check », aynı zamanda kullanarak bir değişken tanımlamak zorunda kalmadan yapabilirsiniz diyor

// secret.php is the name of this file.
if($_SERVER["SCRIPT_FILENAME"]=='secret.php') die();
if (!defined('FLAG_FROM_A_PARENT'))
// Works in all scenarios but I personally dislike this

if (__FILE__ == get_included_files()[0])
// Doesn't work with PHP prepend unless calling [1] instead.

if (__FILE__ == $_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_FILENAME'])
// May break on Windows due to mixed DIRECTORY_SEPARATOR

if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME']))
// Doesn't work with files with the same basename but different paths

if (realpath(__FILE__) == realpath($_SERVER['DOCUMENT_ROOT'].$_SERVER['SCRIPT_NAME']))
// Seems to do the trick

Upvote bu yararlı bulursanız!

Apache altında, bu kolaydır:. Bir web tarayıcı erişimi engellemek için htaccess bir <Files> direktifini ekleyin. Bu PHP includes için geçerli değildir, ve (genellikle tek bir dizinde birlikte tüm erişilebilir olmayan dosyaları koymak için çalışacağım olsa) tarayıcı erişimi birkaç dosya gizlemek için iyi bir uygulamadır.

<Files="myprivatefile.php">
    deny from all
</Files>

Farklı bir web sunucusu altında, belge kök dışarı dosyayı gizleyebilirsiniz, ancak (betiklerinizin open_basedir 'sıkı bir şekilde d iseniz gibi) bazı durumlarda altında, bu iş olmaz.

Burada daha otomatik bir şekilde oluyor dahil değilken hiç görüntülenmesini durdurmak istiyorum.

if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])) header("HTTP/1.0 404 Not Found");

Eğer dosya adı veya bir şey değiştirerek sonuna kadar bu şekilde yine çalışacağız.

. Sadece $_SERVER değişkenleri ile çözümleri genişletmek için - aşağıda küçük bir php dosyası ve yorumların içinde Ubuntu yaptım bash test bir kopyasıdır; varlık noktası, bu değişkenler erişim türüne bağlı olarak biraz değiştirebilirsiniz, ve sembolik bağların başka yankı açıklamada, sözdizimi renk tatili içinde (note also, in the code below I have to escape the '?\> 'kullanılmadığını, ters eğik çizgi kaldırmak çalışıyor ise kod ):

<?php

function report($label, $value) {
  printf ("%23s: %s\n", $label, $value);
}

report("DOCUMENT_ROOT.PHP_SELF",  $_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'] );
report("SCRIPT_FILENAME",         $_SERVER['SCRIPT_FILENAME'] );
report("__FILE__",                __FILE__ );
report("PHP_SAPI",                PHP_SAPI );

/*
# the test (bash):

home~$ mkdir /tmp/ptest
home~$ cd /tmp/ptest/
ptest$ ln -s /real/path/to/varcheck.php .
ptest$ echo '<? require_once "varcheck.php"; ?\>' > varcheckincl.php


# ... and in a separate terminal, run
# php (>5.4) cli server at same (/tmp/ptest) location:

ptest$ php-5.4.10 -S localhost:8000

# back to first terminal, the test - and output:

ptest$ php varcheck.php
 DOCUMENT_ROOT.PHP_SELF: varcheck.php
        SCRIPT_FILENAME: varcheck.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli

ptest$ php -r 'require_once "varcheck.php";'
 DOCUMENT_ROOT.PHP_SELF: -
        SCRIPT_FILENAME:
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli

ptest$ php varcheckincl.php
 DOCUMENT_ROOT.PHP_SELF: varcheckincl.php
        SCRIPT_FILENAME: varcheckincl.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli

ptest$ wget http://localhost:8000/varcheck.php -q -O -
 DOCUMENT_ROOT.PHP_SELF: /tmp/ptest/varcheck.php
        SCRIPT_FILENAME: /tmp/ptest/varcheck.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli-server

ptest$ wget http://localhost:8000/varcheckincl.php -q -O -
 DOCUMENT_ROOT.PHP_SELF: /tmp/ptest/varcheckincl.php
        SCRIPT_FILENAME: /tmp/ptest/varcheckincl.php
               __FILE__: /real/path/to/varcheck.php
               PHP_SAPI: cli-server
*/
?>

Sen bir kodlayıcı ve yükleyici PHP uzantısı kullanmak zorunda:

Commercial

Free