2011-02-10 98 views
3

的index.php:PHP定義安全問題?

define("included", true); 

包含的頁面:

if (included !== true) header('HTTP/1.1 404 Not Found'); 

目的的代碼是直接禁止訪問,但允許它,如果包括在內。我不確定這是否會帶來風險。我不允許覆蓋.htaccess,所以我堅持使用PHP替代方案。

任何幫助將不勝感激!

+0

似乎很好。唯一的建議是在if中添加`exit;`語句,因爲頭文件不會終止應用程序,它仍然會處理。這和常量通常是所有的大寫,這將是我的其他建議:) – 2011-02-10 23:24:11

+0

這通常表示一個不好的應用程序設計。應該避免在main中執行的代碼。包括應該定義函數,所以這種解決方法是不必要的。 – mario 2011-02-10 23:27:21

回答

4

一個性感辦法是...

defined('included') OR exit; 

也就是說,使用正確的函數(defined())查看是否定義了一個值,然後利用short circuit evaluation。另外,您可以使用現有的定義而不是專門創建一個定義,例如,引導文件可以定義類似...

define('DOCROOT', realpath(basename(__FILE__))); 

...在這種情況下,你可以安全地使用DOCROOT

你也應該保持除了你的引導任何PHP文件的文檔根目錄上面,然後確保你的網站是安全的從directory traversal attacks :)

1

這是好的,但我想將其更改爲:

if (!defined('included')) { 
    header('HTTP/1.1 404 Not Found'); 
    // actually make the request stop, since clients will not stop on 404 headers 
    die(); 
} 

歡呼

0

通常您使用安裝喜歡自己正在做的,但執行dieexit放棄它,而不用擔心重定向。即使他們知道該文件存在,但如果您無法訪問該內容,則無用。

的common.php(或你的index.php,這取決於你的設置)

<?php 
    define('IN_PAGE',true); 
    ... 
?> 

include_file.php

<?php 
    defined('IN_PAGE') or die('Unallowed access'); // or header('HTTP/1.0 404 Not Found'); exit; 
    ... 
?> 
1

如何只將所有不屬於文件應該直接訪問webserver的文檔根目錄之外的目錄?

0

一個更簡單的方法是:

<?php 
    @runtime_presence(); 

如果函數存根不集中前確定這導致了致命錯誤。 (標題重定向和一個漂亮的錯誤消息沒有用作安全措施。)