拒绝直接访问除index.php之外的所有.php文件


77

我想拒绝直接访问.php除以下文件之外的所有文件:index.php

只能.php通过php访问其他文件include

如果可能的话,我希望所有文件都在同一文件夹中。

更新:

一般规则会很好,所以我不需要浏览所有文件。风险是我忘记了文件或行。

更新2:

index.php是一个文件夹中www.myadress.com/myfolder/index.php

我想拒绝访问该文件夹中的所有.php文件myfolder及其子文件夹。

Answers:


107

您确定要这样做吗?甚至css和js文件和图像等等...?

确定,首先检查是否已将mod_access安装到apache中,然后将以下内容添加到您的.htaccess中:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

<Files /index.php>
    Order Allow,Deny
    Allow from all
</Files>

第一个指令禁止访问除本地主机以外的任何文件,因为Order Deny,Allow,稍后允许应用,第二个指令仅影响index.php。

警告:订单行中逗号后没有空格。

要允许访问与* .css或* .js匹配的文件,请使用以下指令:

<FilesMatch ".*\.(css|js)$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

但是,您不能在.htaccess文件中<Location><Directory>内部使用指令。

您的选择是<FilesMatch ".*\.php$">在第一个allow,deny组周围使用,然后显式允许访问index.php。

Apache 2.4的更新: 该答案对于Apache 2.2是正确的。在Apache 2.4中,访问控制范例已更改,并且使用了正确的语法Require all denied


3
嗯...不,仅适用于.php文件
约翰·约翰(Johan)2009年

好的,我完全不是.htaccess的新手,我试图复制粘贴您的代码,它可以拒绝除index.php之外的所有文件,但不允许非.php文件。这是我的.htaccess文件:从127.0.0.1 <Files index.php>拒绝所有订单,允许所有拒绝</ Files> <FilesMatch“ * \。(css | js)$” >允许订单,拒绝所有</ FilesMatch>
约翰,

2
没有为我工作(但我没有对你投反对票)。我收到“服务器配置错误”消息。也许服务器确实配置错误。这样做有效:stackoverflow.com/a/1607587/539300
Tyler

85

实际上,我来这里时遇到的是与主题创建者相同的问题,但是给出的解决方案都不能完全解决我的问题。为什么只需将代码配置一次就可以向服务器上的所有文件添加代码?最接近的是Residuum的,但是,当我只想排除未命名为index.php的php文件时,他却排除了所有文件。

所以我想出了一个包含以下内容的.htaccess文件:

<Files *.php>
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
</Files>

<Files index.php>
    Order Allow,Deny
    Allow from all
</Files>

(请记住,htaccess文件是递归工作的,因此它完全适合问题的先决条件。)

现在我们开始。用户可以访问的唯一php文件将是名为index.php的文件。但是您仍然可以访问每个图像,css样式表,js脚本等。


34

对这个问题的一个倾斜答案是将所有代码作为类编写,除index.php文件外,这是唯一的切入点。包含类的PHP文件即使直接通过Apache调用也不会引起任何后果。

一个直接的答案是在.htaccess中包含以下内容:

<FilesMatch "\.php$">
    Order Allow,Deny
    Deny from all
</FilesMatch>
<FilesMatch "index[0-9]?\.php$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

这将允许访问诸如index.php,index2.php等之类的任何文件,但将拒绝对其他.php文件的任何形式的访问。它不会影响其他文件类型。


如果您使用的是Joomla,则Joomla网站通常只有index.php和index2.php。请注意,自Joomla 1.6起不推荐使用index2.php。
rineez 2014年

好东西,但是当您在应用程序中包含其他index.php时,这种情况就被破坏了(这在某些框架的视图中很常见)。
Sliq 2014年

17

您可以尝试在中定义常量index.php并添加类似

if (!defined("YOUR_CONSTANT")) die('No direct access');

到其他文件的开头。

或者,您可以使用mod_rewrite请求并将其重定向到index.php,.htaccess如下所示进行编辑:

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L,R=301]

然后,您应该能够分析index.php中的所有传入请求并采取相应的措施。

例如,如果要保留所有* .jpg,*。gif,*。css和* .png文件,则应编辑第二行,如下所示:

RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png)

你知道如何?我没有线索。
约翰

index.php是否在文件夹中没有关系。
约翰·约翰(Johan)2009年

是的,您应该在RewriteRule中为其写完整的绝对路径,例如RewriteRule ^(。*)$ /somedir/anotherdir/index.php/$1 [L]
n1313,2009年

.htaccess: RewriteRule: unknown flag 'L][R'
Brock Hensley

编辑:标记应以逗号分隔
Brock Hensley

11

如何将除index.php之外的所有.php文件保留在Web根上方?无需任何重写规则或程序性错误。

然后将include-folder添加到include路径将有助于使事情简单,无需使用绝对路径等。


好的,我将文件移动到另一个文件夹。感谢所有.htaccess的帮助,但这对我来说太复杂了。
约翰,

也许不是,在我的文档之间有太多的链接引用,所以我等待这种解决方案。
约翰

链接引用是什么意思?您是否将文件移动的文件夹添加到了包含路径中?
nikc.org,2009年

Linkreference = include('file.php')toinclude('myfolder/file.php')
Johan

如果包含文件夹,则将文件移动到包含路径(ini_set('include_path', ini_get('include_pat'). ':/path/to/files');)中,那么您可以做同样的事情而不会破坏任何内容。
nikc.org

6

URL重写可用于将URL映射到.php文件。以下规则可以确定.php请求是直接发出还是被重写。在第一种情况下,它禁止请求:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ]
RewriteRule \.php$ - [F]
RewriteRule test index.php

这些规则将禁止所有以结尾的请求.php。但是,仍允许使用诸如/(将触发index.php),/test(将其重写为index.php)和/test?f=index.php(在querystring中包含index.php)之类的URL。

THE_REQUEST包含浏览器发送到服务器的完整HTTP请求行(例如,GET /index.php?foo=bar HTTP/1.1


1
这是我一直在寻找的解决方案。除了重写规则,我想拒绝所有php访问。谢谢!
machineaddict

您的答案很接近我想要的东西,如果您仍然在这里,您可以看看stackoverflow.com/questions/57260003/…–
Serge

2

与其传递变量而不是在不希望直接访问的任何页面顶部包含独立变量,我仍然应该将其与.htaccess规则配对,但我知道如果存在故障安全,则会更加安全htaccess曾经一团糟。

<?php
// Security check: Deny direct file access; must be loaded through index
if (count(get_included_files()) == 1) {
    header("Location: index.php"); // Send to index
    die("403"); // Must include to stop PHP from continuing
}
?>

这对于小型应用程序很好,但是当您有大量的控制器,模型和模板等时,则变得完全无法管理。
詹姆斯

2

在Apache 2.4中,访问控制的语法已更改。如果使用如下指令:

Order deny,allow
Deny from all

不起作用,您可能正在使用Apache 2.4。

Apache的2.4文档是在这里

您需要以下列Require all denied方式之一使用:

# you can do it this way (with "not match")

<FilesMatch ^((?!index\.php).)*$>
  Require all denied
</FilesMatch>

# or 

Require all denied

<Files index.php>
  Require all granted
</Files>

如果您请求example.org,第二个似乎无效,例如example.org/index.php
DamienÓCeallaigh

1

一个简单的解决方案是将所有非index.php文件重命名为.inc,然后拒绝访问* .inc文件。我在很多项目中都使用了它,并且效果很好。


0

将所有文件放在一个文件夹中。将.htaccess文件放在该文件夹中,并为其赋予值deny all。然后在index.php中,将其放置在文件夹外部,使其根据用户输入或事件回显正确的页面


-1
<Files ~ "^.*\.([Pp][Hh][Pp])">
 Order allow,deny
 Deny from all
 Satisfy All
</Files>

-2

只允许2 ip,所有其他将被阻止

Order Deny,Allow
Deny from all
Allow from 173.11.227.73 108.222.245.179
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.