保护包含的页面包括("");

时间:2017-03-03 21:26:39

标签: php security

目前正在学习PHP并使用include来包含页面元素,例如

include('menubar.php');
include('content.php');
include('footer.php');

这些都是来自private.php

我想知道您认为这是在example.com/content.php中键入内容时保护这些页面的最便捷方式

我目前正在使用类似

的内容
<?php //
require("common.php"); 

// Check to see if the user is logged in
if( empty($_SESSION['user']) || $_SERVER['PHP_SELF'] == "content.php") 
{ 
    // if either is true redirect to index.php
    header("Location: index.php"); 
    die("Redirecting to index.php"); // login page
} 

但是想知道还有什么我可以/应该做的吗?

注意:$ _SESSION [&#39; user&#39;]在每个会话开始时或登录时进行验证。

2 个答案:

答案 0 :(得分:1)

我认为最方便的方法是将文件放在www-root之外,并从那里包含它们。所以文件结构是这样的:

/some-folder
    common.php
    /www-root
        -index.php

你可以在index.php中包含这样的文件:

include("../common.php");

这样,它们无法从任何地方直接访问。

答案 1 :(得分:1)

使用.htaccess文件也可以。 @ 1615903的答案在很大程度上依赖于此。

理解这一点将清除完整的概念。

请求进来(来自用户的网络浏览器)。您的Web服务器(在此示例中为Apache)收到此信息。首先,它检查权限。然后它查看配置的其余部分,并最终将请求URI映射到文件系统。现在,最后,它可以检查权限以及.htaccess。

如果任何权限检查失败(例如,拒绝所有权限),Apache将停止处理请求,并发回错误(或在HTTP基本身份验证的情况下请求用户名和密码)。

一旦所有权限检查通过,Apache就会查看该文件,并注意到它的.php文件。在你的(或你的web主机)Apache配置的某个地方,有一个AddHandler指令告诉Apache将这个请求传递给PHP引擎(可以是mod_php,或者通过快速cgi)。 (对于大多数文件,它会将文件的内容发送到浏览器。但是脚本文件很特殊,因为AddHandler。)

现在,PHP会读取您的脚本文件。然后它还直接读取您的包含文件。这不会通过Apache返回,所以像.htaccess这样的东西不适用。这也意味着您的PHP包含不需要在您的文档根目录中。它们可以是PHP进程可以访问的任何位置(基于UNIX权限和PHP配置)。在php.ini中设置include_dir可以很容易地将它们放在任何地方。

客户端JavaScript由用户的浏览器运行。它不是服务器端解释(就像PHP一样)。因此用户必须能够访问它,就像用户必须能够访问.html文件一样。

简而言之:

你可以在你的PHP include目录中放入一个带有Deny的.htaccess。 PHP的include指令不通过Apache,因此它不会关心。理想情况下,您甚至根本不将PHP包含目录放在文档根目录下。

你不能为JavaScript做这件事,因为JavaScript访问通过Apache(就像.html,.png等访问)。

参考:protect php includes (with htaccess?)