拒绝直接访问除index.php之外的所有.php文件
我想拒绝直接访问所有.php
文件,除了一个: index.php
对其他.php
文件的唯一访问应该通过php include
。
如果可能,我想要在同一个文件夹中的所有文件。
更新:
一个通用的规则会很好,所以我不需要通过所有的文件。 风险是我忘记了一个文件或一行。
更新2:
index.php
位于一个文件夹www.myadress.com/myfolder/index.php
我想拒绝对我的文件夹和子文件夹中的所有.php
文件进行访问。
在index.php中,添加一个像这样的访问值:
$access = 'my_value';
在每个其他文件中,甚至在单个字节被php回显之前也要包含这个检查:
if(empty($access)) { header("location:index.php"); die(); }
这样,其他的PHP文件将只能通过要求/包括,而不是通过URL访问。
你确定,你想这样做吗? 即使是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>
第一个指令禁止访问除localhost以外的任何文件,因为Order Deny,Allow
,Allow gets later,第二个指令只影响index.php。
警告:订单行中逗号后面没有空格。
要允许访问匹配* .css或* .js的文件,请使用以下指令:
<FilesMatch ".*\.(css|js)$"> Order Allow,Deny Allow from all </FilesMatch>
尽pipe如此,你不能在<Location>
或者<Directory>
里使用指令。
你的select是使用<FilesMatch ".*\.php$">
围绕第一个允许,拒绝组,然后明确允许访问index.php。
Apache 2.4更新:这个答案对于Apache 2.2是正确的。 在Apache 2.4中, 访问控制范例已经改变,正确的语法是使用Require all denied
。
实际上,我是以这个主题的创造者的同一个问题来到这里的,但是没有一个解决scheme是我的问题的完整答案。 为什么只要将代码添加到服务器上的所有文件,只需configuration一次? 最接近的一个是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文件是recursion的工作,所以它完全适合问题的先决条件。)
现在我们开始。 唯一可以被用户访问的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文件的访问。 它不会影响其他文件types。
你可以尝试在index.php
定义一个常量,并添加类似的东西
if (!defined("YOUR_CONSTANT")) die('No direct access');
到其他文件的开头。
或者,您可以使用mod_rewrite
并将请求redirect到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文件夹添加到包含path将有助于保持简单,不需要使用绝对path等。
可以使用URL重写来将URL映射到.php文件。 以下规则可以确定.php请求是直接创build还是被重写。 它在第一种情况下禁止请求:
RewriteEngine On RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ] RewriteRule \.php$ - [F] RewriteRule test index.php
这些规则将禁止以.php
结尾的所有请求。 然而,诸如/
(它激发index.php), /test
(重写为index.php)和/test?f=index.php
(其中包含查询string中的index.php)的URL仍然是允许的。
THE_REQUEST
包含浏览器发送到服务器的完整HTTP请求行(例如GET /index.php?foo=bar HTTP/1.1
)
而不是传递一个variables我做这是独立的任何网页的顶部,你不想直接访问,这应该仍然配对.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 } ?>
一个简单的解决scheme是将所有非index.php文件重命名为.inc,然后拒绝访问* .inc文件。 我在很多我的项目中使用它,它工作得很好。
将所有文件放在一个文件夹中。 将一个.htaccess文件放在该文件夹中,并给它的值全部拒绝。 然后在index.php放置在文件夹外面,它会根据用户input或事件回显出正确的页面
在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>
只允许2个IP,所有其他将阻止
Order Deny,Allow Deny from all Allow from 173.11.227.73 108.222.245.179
<Files ~ "^.*\.([Pp][Hh][Pp])"> Order allow,deny Deny from all Satisfy All </Files>