禁止直接访问codeigniter上的任何PHP文件

jfgube3f  于 4个月前  发布在  PHP
关注(0)|答案(3)|浏览(37)

我已经建立了一个网站与codeigniter 3
我想阻止直接运行所有的php文件。假设我在根目录下有一个名为test.php的文件。
当用户访问site.com/test.php时,无法访问它。不是针对特定文件,而是针对所有PHP文件
我只想通过调用控件及其方法来访问站点,如:site.com/user/login

kknvjkwl

kknvjkwl1#

我可以通过在**.htaccess**文件中添加以下代码来实现:

RewriteEngine on

# Block direct access to PHP files except index.php
RewriteCond %{REQUEST_FILENAME} !index\.php
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteRule ^(.*)$ index.php/$1 [L,NC]

字符串
现在每个请求.php文件的URL重定向到404页面。:)

ckocjqey

ckocjqey2#

我想阻止直接运行所有的php文件。[.我]想象我在我的根目录下有一个名为test.php的文件。
你想直接执行PHP文件,因为你正在使用的应用程序的index.php就是这种情况。它仍然是一个PHP应用程序。
但是你不想在根目录下执行非预期的PHP文件。下面是如何防止这种情况的方法:

  • 不要将文件添加到您不希望在那里的根目录中

此外:

  • 将根目录设置为只读
  • 使所有目录项只读(递归)

简而言之:不要与你正在使用的框架作斗争,而是要了解如何正确地使用它部署应用程序,并与你打算使用的系统的主机/系统管理员讨论需求。
首先考虑您的需求,然后通过配置解决它们。您的需求是安全地运行应用程序。它的生产默认值应该是安全的,如果不是,您正在使用的托管不适合该应用程序(或者不太可能,应用程序本身不适合托管-我怀疑这是它被编写的目的)。
否则,你会遇到这样的问题:你正在使用代码来解决代码之外的问题,而这通常不会很好地工作,因为抽象不仅仅是泄漏。应用服务器(Apache2)当你试图变得更聪明的时候,你不能正确地为你的应用程序服务。你也不能欺骗系统,应用程序和服务器都在运行。总是应用控制一个级别更高,因为它帮助你更有效,更容易掌握。这意味着你对部署的影响更少,这使它更标准,这将给予你在一天结束时的安心。
因此,不要被你的恐惧所打动,而是与那些可以改变现状的人(比如你的服务器管理员)谈论和讨论你所看到的问题。
如果你喜欢修修补补(就像你把你的探索黑客小屋),得到一个虚拟机(VM),配置它,并有一个实验室,你可以真正弯曲所有的东西,直到它打破和超越。我也建议,因为这是非常容易的这些天,只是重新发现使用Vagrant与Ansible供应的乐趣。它往往是简单的事情,使不同。
请注意,我建议的只读也适用于.htaccess文件。(最好已经知道系统管理员的视角是什么),除此之外,我知道,将此文件设置为只读也会强制应用程序代码在部署后不能修改它(例如,像WordPress这样的应用程序期望这样,所以仔细检查应用程序有多少技术债务-如果不是破产的话-这通常是你面临的风险)。
共享主机可能提供.htaccess,那么这可以适用(手册中也有说明)。尽管如此,由于服务器正在使用模块,因此您应该编写任何不是来自服务器核心而是来自使用条件门控的模块的指令,因此,它们仅在模块加载时应用(否则您将无法托管甚至文件,但会显示500内部服务器错误消息)。
只要决定你喜欢什么,这是配置,所以它是重要的。首先找出什么是适合你的,* 然后 * 你配置服务器软件。然后你测试配置。如果主题是新的,因为你已经感觉到,找一个陪练伙伴,最好是该系统的系统管理员。
如果你使用重写条件和规则,首先确定你的需求,然后选择适当的指令,参数和标志。重写模块是强大的,因此很容易在没有正确理解的情况下做意想不到的事情。
我知道你喜欢用一种特殊的方式做事(根据你自己的答案),它邀请我放置一个提醒,如果你想要一个404响应,你可以只有它(先阅读手册,一次读不懂并不能成为不读的理由)。没有必要改变路径到一个意想不到的地方,因为你显然没有意识到你在做什么(无意冒犯,我们都需要学习,而对于mod rewrite,我们--作为普通人--在前面的几年里总是会发现新的行为--否则将自己的更改提交到上游,但这样你不仅需要阅读手册,还需要阅读代码。这是你正在使用的软件的一个选项,所以如果你想做它的配置,也要考虑这一点)。

gjmwrych

gjmwrych3#

最可靠的方法也是大多数现代php框架使用的方法是实际拥有一个不包含您不想暴露的php文件的文档根。
这也可以在codeigniter中通过一个小技巧来完成:
1.首先在你的项目中创建一个public/目录。这将是文档的根目录,里面的所有内容都是公开的。
1.在那里创建一个简单的index.php文件,只包含“hello world”用于测试
1.更改服务器的配置,将该目录作为文档根目录。例如,如果典型/当前文档根目录是/var/www/html,则在您的情况下,它现在应该是/var/www/html/public
1.确保它能正常工作:当你访问网站时,“hello world”应该会出现,你也不能访问任何其他php文件。
1.(可选)此时您还可以实现url重写(类似于Dev Kraken之前提到的)。然后当您访问不存在的url时,您也应该/总是获得“hello world”。
1.最后,将我们创建的index.php的内容替换为:

<?php

// this makes codeigniter believe that it is running from the project root, not public directory
chdir(dirname(__DIR__));

// ..and this loads codeigniter
require_once(__DIR__ . '/../index.php');

字符串

相关问题