如何使PHP脚本只能访问某些文件?

时间:2011-04-22 16:20:17

标签: php session .htaccess cookies

我正在构建CMS,主页(index.php)正在从CMS目录中的许多小文件构建。例如,结构可能是这样的:

index.php
menu/admin/content.php
           config.php
           requests.php

menu/tools/content.php
           config.php
           requests.php

menu/users/content.php
           config.php
           requests.php

当我访问根目录中的index.php时,我会根据$_GET参数得到不同的结果。例如,当我访问index.php?section=tools时,索引文件会从content文件夹中加载cofnigrequestsmenu/tools/个文件。

现在问题。 index.php页面本身只对登录用户可访问,但出于安全考虑,我想禁用menu文件夹中的所有内容,而不是通过php的include函数进行访问。

要演示可能发生的情况:如果我想删除某些内容,请使用index.php?section=tools&delete=5,并在menu/tools/requests.php文件中,检查是否设置了$_GET['delete'],然后删除了ID 5来自DB。现在的问题是,如果有人知道实际的结构,他可以像requests.php一样访问site.com/admin/menu/tools/requests.php?delete=5文件,并以这种方式破解网站。

有没有办法防止这种可能的攻击?要拒绝访问菜单文件夹中的文件,但仍然可以从我的index.php文件中访问它们? Htaccess可能吗?我真的不想对“菜单”文件夹中的每个文件进行检查(如果设置了会话/ cookie),尽管这可能是一种解决方案。

3 个答案:

答案 0 :(得分:3)

在您要拒绝访问的文件夹中创建一个.htaccess,其中包含以下内容:

deny from all

最好的办法是将文件夹放在网络根目录之外。

答案 1 :(得分:1)

最好的方法是将menu文件夹移动到Web服务器文档根目录之外的某个位置。这样,没有网址映射到menu/tools/requests.php,您唯一的安全问题就是您在index.php

中所做的事情

答案 2 :(得分:0)

首先,如果有人手动添加GET参数并“破解”该网站则存在问题。在脚本中,您应该验证尝试执行这些操作的用户的身份验证,如果他们经过身份验证,则应该没有问题。我不认为任何人会在通过GET param删除某些内容时会出现问题,因为他们可以在界面上自行完成。

你提出的方法有解决方案,但他们每个人都有自己的顾虑......

CodeIgniter通过设置变量,然后在每个脚本的头部

来工作
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

您还可以检查$ _SERVER ['SCRIPT_FILENAME'],$ _SERVER ['SCRIPT_NAME']或$ _SERVER ['PHP_SELF']以查看其index.php,否则退出。