2011-04-22 102 views
0

我正在构建一个CMS,并且主页面(index.php)由CMS目录中的很多小文件构建而成。例如,该结构可以是这样的:如何使某些文件仅适用于PHP脚本?

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时,索引文件会从menu/tools/文件夹中加载contentcofnigrequests文件。

现在来解决问题。 index.php页面本身仅供登录用户访问,但出于安全原因,我想要禁用menu文件夹中的所有内容,而不是通过其他任何方式访问,而不是通过php的include功能访问。

为了证明会发生什么:如果我要删除的东西,我用index.php?section=tools&delete=5,并在menu/tools/requests.php文件,如果$_GET['delete']设为我会检查,然后从数据库中删除的5号。现在的问题是,如果有人知道实际结构,他可以像这样访问requests.php文件:site.com/admin/menu/tools/requests.php?delete=5,然后用这种方法破解网站。

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

+0

index.php?section = tools&delete = 5本身就是一个坏主意。我现在找不到这个参考资料,但是有一个案例我读到了整个网站被一个仁慈的机器人销毁的地方,因为每个项目都有一个“删除”链接。改为使用POST请求。 – TecBrat 2014-06-16 14:24:43

回答

1

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

+0

好吧,或者我可以将'menu'文件夹重命名为'menu145235234952'或类似的东西,然后更改每个项目的编号,但这看起来不是一个干净的解决方案。我不知道我会在哪里移动它,我总是使用托管服务。 – Mike 2011-04-22 16:26:47

+0

应该有可能。有关详细信息,请咨询您的托管服务提供商。 – Oswald 2011-04-22 16:32:37

+1

@Mike:是的,请向您的提供商咨询,您应该至少可以访问您的账户的'$ HOME',该账户通常包含您的webroot所在的文件夹。如果他们不给这种访问它可能是一个很好的迹象,你应该切换提供商:-) – prodigitalson 2011-04-22 16:47:37

3

做创建的文件夹(S)在你的.htaccess到wan't拒绝包含以下访问:

deny from all 

尽管如此,最好的办法是将文件夹放在Web根目录之外。

+0

那么,有没有办法在使用普通托管服务时将文件放在根目录之外? – Mike 2011-04-22 16:28:50

+1

应该有,尽管一些(坏的)共享主机只允许你访问web根目录。 – 2011-04-22 16:30:57

+0

嗯,我尝试了“拒绝所有”,它工作正常。只是一件我不确定的事情,如果存在.htaccess规则,是否有某种方式可以让外部人员访问该文件?例如,如果他要使用CURL或类似的东西? – Mike 2011-04-22 16:42:19

0

首先,如果有人要手动添加GET参数并“破解”该网站,则存在问题。在脚本中,您应该验证尝试执行这些操作的用户的身份验证,并且如果它们已通过身份验证,则应该没有问题。我不认为任何人都会通过GET参数删除某些东西,当他们可以在接口上自己做这件事时会引发问题。

有解决方案,你问的方式,但他们每个人都有自己的忧虑......

CodeIgniter的工作原理是设置一个变量,然后在每个脚本的头,

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

你也可以检查$ _SERVER ['SCRIPT_FILENAME'],$ _SERVER ['SCRIPT_NAME']或$ _SERVER ['PHP_SELF']查看它的index.php,否则退出。

相关问题