我正在创建一个允许人们上传文件,html页面等的网站......现在我遇到了问题。我有一个像这样的目录结构:
-/USERS
-/DEMO1
-/DEMO2
-/DEMO3
-/etc... (every user has his own direcory here)
-index.php
-control_panel.php
-.htaccess
现在我要禁用PHP,但在/ USERS
内的direcories和子目录中启用服务器端包含可以这样做(以及如何:))?提前谢谢。
BTW,我使用WAMP服务器
答案 0 :(得分:114)
尝试禁用.htaccess文件中的engine
option:
php_flag engine off
答案 1 :(得分:47)
要禁用对子目录的所有访问(最安全),请使用:
<Directory full-path-to/USERS>
Order Deny,Allow
Deny from All
</Directory>
如果您只想阻止直接提供PHP文件,请执行以下操作:
1 - 确保您知道服务器识别为PHP的文件扩展名(并且不允许人们在htaccess中覆盖)。我的一台服务器设置为:
# Example of existing recognized extenstions:
AddType application/x-httpd-php .php .phtml .php3
2 - 基于扩展,将正则表达式添加到FilesMatch(或LocationMatch)
<Directory full-path-to/USERS>
<FilesMatch "(?i)\.(php|php3?|phtml)$">
Order Deny,Allow
Deny from All
</FilesMatch>
</Directory>
或使用位置来匹配php文件(我更喜欢上述文件方法)
<LocationMatch "/USERS/.*(?i)\.(php3?|phtml)$">
Order Deny,Allow
Deny from All
</LocationMatch>
答案 2 :(得分:13)
如果你正在使用mod_php,你可以把(在USERS目录中的.htaccess或USERS目录的httpd.conf中)。
RemoveHandler .php
或
RemoveType .php
(取决于是否使用AddHandler或AddType启用PHP)
从另一个目录运行的PHP文件仍然可以包含/ USERS中的文件(假设没有open_basedir限制),因为这不会通过Apache。如果使用apache访问php文件,它将作为纯文本服务器。
修改强>
Lance Rushing的拒绝访问文件的解决方案可能更好
答案 3 :(得分:10)
<Directory /your/directorypath/>
php_admin_value engine Off
</Directory>
答案 4 :(得分:9)
这将显示源代码而不是执行它:
<VirtualHost *>
ServerName sourcecode.testserver.me
DocumentRoot /var/www/example
AddType text/plain php
</VirtualHost>
我曾经使用过一次,让其他同事可以从本地网络读取源代码(只是一个快速而又脏的选择)。
警告!:
Dan不久前指出,这种方法绝对不能用于生产。请遵循接受的答案,因为它会阻止任何执行或显示php文件的尝试。
如果您希望用户共享php文件(并让其他人显示源代码),可以采用更好的方法,例如git,wiki等。
应该避免这种方法! (你已经被警告了。把它留在这里用于教育目的)
答案 5 :(得分:2)
这些答案都不适用于我(产生500错误或无所事事)。这可能是因为我在托管服务器上工作,我无法访问Apache配置。
但这对我有用:
RewriteRule ^.*\.php$ - [F,L]
此行会为以.php
结尾的任何网址生成403 Forbidden错误,最终会出现在此子目录中。
答案 6 :(得分:1)
这可能有些过分 - 但要小心做任何依赖于.php
扩展PHP文件的事情 - 如果有人稍后出现并为.php4
甚至.html
添加处理程序会怎么样?所以他们是由PHP处理的。您可能最好从Apache的不同实例或其他服务器提供这些目录中的文件,这些实例仅提供静态内容。
答案 7 :(得分:1)
如果您使用php-fpm
,则php_admin_value将不能工作并给出内部服务器错误。
请在您的.htaccess
中使用它。它将禁用该文件夹及其所有子文件夹中的解析器:
<FilesMatch ".+\.*$">
SetHandler !
</FilesMatch>
答案 8 :(得分:0)
在生产环境中,我更喜欢将请求重定向到应禁用PHP处理的目录下的.php文件到主页或404页面。这不会透露任何源代码(为什么搜索引擎应该索引上载的恶意代码?),并且对访问者甚至是试图利用这些东西的邪恶黑客来说都更加友好。 而且,它几乎可以在任何上下文中实现-vhost或.htaccess。 像这样:
using String = std::basic_string<TCHAR>;
// a struct with all the properties you'd like to use on disconnect
struct device_info {
CHANGER_PRODUCT_DATA cpd; // just an example
String something;
};
int main() {
// a map where the device_name is the key and device_info the value
std::unordered_map<String, device_info> devices;
{ // on connect, create a device_info struct and fill it with the info you need on
// disconnect
DEV_BROADCAST_DEVICEINTERFACE* devInterface =
reinterpret_cast<DEV_BROADCAST_DEVICEINTERFACE*>(lParam);
String new_dev_name { devInterface->dbcc_name };
device_info di{}; // store what you need from the opened device here
// and put it in the map
devices.emplace(new_dev_name, di);
}
{ // on disconnect, find the entry in the map using the disconnected device_name
DEV_BROADCAST_DEVICEINTERFACE* devInterface =
reinterpret_cast<DEV_BROADCAST_DEVICEINTERFACE*>(lParam);
String disc_dev_name{ devInterface->dbcc_name };
auto fit = devices.find(disc_dev_name);
if (fit != devices.end()) {
// we found the device, extract it
device_info disc_di = fit->second;
// and erase it from the map
devices.erase(fit);
std::wcout << "\"" << disc_di.something << "\" disconnected\n";
}
}
}
根据需要调整指令。
答案 9 :(得分:0)
我在 Centos 6.10 中使用了虚拟主机 .conf 定义文件中的多个文件夹:
<DirectoryMatch ^/var/www/mysite/htdocs/(nophpexecutefolder1|nophpexecutefolder2)>
php_admin_value engine Off
</DirectoryMatch>
然而,即使它不以通常的方式解析 php 代码,它仍然会从 .php 中输出诸如变量声明和文本之类的内容,例如在执行 echo 时
<?php
echo "<strong>PHP CODE EXECUTED!!";
$a=1;
$b=2;
echo $a+$b;
以上内容在浏览器中产生?
PHP CODE EXECUTED!!"; $a=1; $b=2; echo $a+$b;
这可能会向用户公开一些不理想的代码。
因此,最好将上述内容与 .htaccess 中的以下内容结合使用:
<FilesMatch ".*.(php|php3|php4|php5|php6|php7|php8|phps|pl|py|pyc|pyo|jsp|asp|htm|html|shtml|phtml|sh|cgi)$">
Order Deny,Allow
Deny from all
#IPs to allow access to the above extensions in current folder
# Allow from XXX.XXX.XXX.XXX/32 XXX.XXX.XXX.XXX/32
</FilesMatch>
以上将阻止访问上述任何文件扩展名,但允许其他扩展名,如图像、css 等,以通常的方式访问。访问.php时的错误:
Forbidden
You don't have permission to access /nophpexecutefolder1/somefile.php on this server.
答案 10 :(得分:-3)
试试这个:
<FilesMatch "\.((php[0-9]?)|p?html?|pl|sh|java|cpp|c|h|js|rc)$">
SetHandler None
</FilesMatch>