2008-10-06 148 views
9

我想確保人們不能在URL中輸入PHP腳本的名稱並運行它。這樣做的最好方法是什麼?什麼是僅允許包含PHP文件的最佳方式?

我可以在將包含此文件的文件中設置一個變量,然後在包含的文件中檢查該變量,但有沒有更簡單的方法?

+0

您能否更清楚一點?我真的不明白,如果你的瀏覽器指向它,你不希望文件不能運行... – 2008-10-06 03:53:17

+0

也許如果預製函數的功能,也許是爲了安全起見,爲什麼不相關。 – UnkwnTech 2008-10-06 03:54:29

+0

@Unkwntech:我的困惑來自這樣的事實,如果一個文件是在webroot下它應該是查看,任何安全必須在它之外... – 2008-10-06 03:58:46

回答

6

您可以檢查URI,看看是否有文件被調用`

$_SERVER['SCRIPT_FILENAME'] 

,或者你可以將文件移到公共文件夾之外,這是一個更好的解決方案。

0

正如Unkwntech建議的那樣,Zend Framework建議您將文件保存在Web根目錄之外。我會說這是最安全和最愚蠢的解決方案。

0

從PHP Nuke的模塊:

<?php 
if (!eregi("modules.php", $PHP_SELF)) { 
    die ("You can't access this file directly..."); 
} 
// more code ... 
?> 

替換modules.php您的文件名,該文件不能被直接調用。我見過很多

0

一種方法是創建具有存在於每一個包含文件,並檢查第一件事就是在每一個變量包括:

if(!isset($in_prog)){ 
exit; 
} 
4

我早就把一切除了直接可見的腳本在網頁根目錄之外。然後配置PHP以將您的腳本目錄包含在路徑中。一個典型的設立將是:

appdir 
    include 
    html

在PHP配置(無論是全球PHP配置或在.htaccess文件中html目錄)補充一點:

include_path = ".:/path/to/appdir/include:/usr/share/php"

或(適用於Windows)

include_path = ".;c:\path\to\appdir\include;c:\php\includes"

請注意,該行可能已經在您的php.ini文件中,但可能會被註釋掉,以允許默認值工作。它也可能包含其他路徑。一定要保留這些。

如果你將它添加到.htaccess文件,格式爲:

php_value include_path .:/path/to/appdir/include:/usr/share/php

最後,你可以用這樣的編程添加路徑:

$parentPath = dirname(dirname(__FILE__)); 
$ourPath = $parentPath . DIRECTORY_SEPARATOR . 'include'; 

$includePath = ini_get('include_path'); 
$includePaths = explode(PATH_SEPARATOR, $includePath); 
// Put our path between 'current directory' and rest of search path 
if ($includePaths[0] == '.') { 
    array_shift($includePaths); 
} 

array_unshift($includePaths, '.', $ourPath); 
$includePath = implode(PATH_SEPARATOR, $includePaths); 
ini_set('include_path', $includePath); 

(基於工作代碼,但已修改,因此未經測試)

這應該在您的前端文件中運行(例如index.php)。我把它放在一個單獨的包含文件中,在修改上面的文件後,可以將其包含在#include '../includes/prepPath.inc'之類的文件中。

我已經使用了我在這裏介紹的所有版本,並取得了成功。使用的特定方法取決於偏好,以及項目將如何部署。換句話說,如果你不能修改php.ini,你顯然不能使用這種方法

9

在我探討過的一些開源應用程序中,包括Joomla和PHPBB,他們聲明瞭一個常量主要包括文件,然後驗證不斷在每個存在包括:

// index.php 
require_once 'includes.php'; 

// includes.php 
define('IN_MY_PROJECT', true); 
include 'myInc.php'; 

// myInc.php 
defined('IN_MY_PROJECT') || die("No direct access, plsktnxbai"); 
0

我想最好的辦法就是把你要包括裏面的文件「/包括」文件夾,並把訪問權限700該文件夾

相關問題