我想阻止直接访问我的header.php
和footer.php
文件......
我知道有很多关于如何防止直接访问的问题,但没有一个真正解释这些方法的安全性。
下面的例子看起来像是默默无闻的安全,因为任何人都可以将$_POST[$variable]
设置为他们想要的东西。
if (!isset($_POST['field'])) {
die();
}
/* AND */
if (empty($_POST)) {
exit("Direct access not allowed");
}
但是使用define
函数来阻止直接访问呢?设置define
的人是否更安全?
像
这样的东西// index.php
define("DIRECTACCESS", "NO");
include 'header.php';
// header.php
if(DIRECTACCESS == "NO")
die('No direct access allowed');
或者我甚至可以这样做:
// index.php
$daccess = 'NO';
include 'header.php';
// header.php
if(!isset($daccess))
die('No direct access allowed');
答案 0 :(得分:4)
只需使用.htaccess文件即可。这将阻止来自外部的访问,但仍允许包括:
<Files ~ "\.inc\.php$">
Order allow,deny
Deny from all
</Files>
现在只需重命名包含文件.inc.php,不允许从外部访问。
这样可以节省对代码的无意义修改。
最好将您的包含文件移出文档根目录(include('../includes/header.php');
)并从那里包含它们,自动禁止直接访问。
答案 1 :(得分:2)
$_SERVER['SCRIPT_FILENAME']
是当前正在执行的脚本的绝对路径名。
__FILE__
是文件的完整路径和文件名。
if (realpath($_SERVER['SCRIPT_FILENAME']) == realpath(__FILE__)) {
die('No direct access allowed');
}
答案 2 :(得分:1)
在第一个示例中,用户可以修改POST
字段的值(如果他们选择这样),因此他们可以绕过限制。在第二个示例中,您是定义值的那个,并且最终用户无法执行任何操作来修改常量,因此它(更)安全。第三个例子实际上与第二个例子相同,但是,定义一个常量更有意义,因为值总是一个常量。