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

2020/10/16 16:21 · php ·  · 0评论

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

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

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

更新:

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

更新2:

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

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

您确定要这样做吗?甚至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

实际上,我来这里时遇到的是与主题创建者相同的问题,但是给出的解决方案都不能完全解决我的问题。为什么只需将代码配置一次就可以向服务器上的所有文件添加代码?最接近的是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脚本等。

对这个问题的一个倾斜答案是将所有代码作为类编写,除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文件的任何形式的访问。它不会影响其他文件类型。

您可以尝试在中定义一个常量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之外的所有.php文件保留在Web根上方?无需任何重写规则或程序性错误。

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

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

与其传递变量而不是在不希望直接访问的任何页面顶部包含独立变量,我仍然应该将其与.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
}
?>

在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>

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

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

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

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

Order Deny,Allow
Deny from all
Allow from 173.11.227.73 108.222.245.179
本文地址:http://php.askforanswer.com/jujuezhijiefangwenchuindex-phpzhiwaidesuoyou-phpwenjian.html
文章标签: ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!