修改nginx中php的后辍名文件名

本文介绍了如何通过修改Nginx配置使服务器能够正确处理以.html结尾的PHP文件,包括调整Nginx匹配规则及php-fpm的安全配置。此外,还提供了解决方案以将PHP文件的访问路径更改为.html的方法。

由于有一个项目的某个功能逻辑需要回调(项目组提供给第三方接口的地址),但某同事提供了一个html结尾的回调地址。由于某种原因回调地址不能更改。
无奈之下,想出了一个办法那就是修改nginx原来匹配php的地方改为html。

nginx配置:

server
{
    listen 80;
    server_name www.test.com test.com;
    index index.html index.htm index.php;
    root  /home/wwwroot/test/;

    #error_page   404   /404.html;

    location ~ [^/]\.html(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    location /nginx_status
    {
        stub_status on;
        access_log   off;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/access.log  access;
}

然后保存nginx配置,并重启nginx

但访问的时候发现:Access denied.

开始我以为是文件权限问题,跑了一大圈,什么该用户所属啊之类。

但最终发现是php的配置问题:
修改:/usr/local/php/etc/php-fpm.conf
在最后的位置加上:security.limit_extensions = .php .html

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
security.limit_extensions = .php .html

重启php-fpm即可访问。


还有一种情况就是项目的文件还是php扩展名,但想访问的时候要求改成html。
那就改nginx的配置,新增一个rewrite即可:

server
{
    listen 80;
    server_name www.test.com test.com;
    index index.html index.htm index.php;
    root  /home/wwwroot/test/;

    #error_page   404   /404.html;
    if (!-e $request_filename)
    {
        rewrite ^\/(.*)\.html$ /$1.php last;
        break;
    }

    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    location /nginx_status
    {
        stub_status on;
        access_log   off;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/access.log  access;
}
<think>我们正在处理用户关于Apache HTTPD多后缀名解析漏洞的查询。根据用户的要求,我们需要提供漏洞的详情、可能的利用方式以及修复方法。同时,我们需要参考提供的引用内容,并确保回答结构清晰、可靠。 根据引用[1]和引用[2]: - 漏洞原因:Apache HTTPD服务器在解析文件时,允许一个文件有多个后缀(以点分割)。它会从最右边开始识别后缀名,如果遇到无法识别的后缀,则向左继续识别。如果配置中使用了`AddHandler`指令(例如`AddHandler application/x-httpd-php .php`)来处理PHP文件,那么只要文件名中包含`.php`后缀(即使它并不是最后一个后缀),该文件就会被当作PHP文件解析。 - 漏洞影响:攻击者可以上传一个看似非PHP的文件(例如`filename.php.jpg`),但由于其中包含`.php`后缀,Apache会将其作为PHP文件解析并执行其中的恶意代码。 - 漏洞与版本无关,属于配置不当导致。 修复方法: 1. 修改配置,避免使用`AddHandler`指令,而是使用`FilesMatch`指令来精确匹配文件类型。例如: ```apache <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> ``` 这样配置后,只有以`.php`结尾的文件才会被当作PHP文件解析。 2. 禁止上传目录执行脚本:在文件上传目录的配置中,移除PHP处理程序,确保上传目录下的文件不会被当作脚本执行。例如: ```apache <Directory "/var/www/upload"> php_flag engine off # 或者对于Apache 2.4,可以使用: # SetHandler None </Directory> ``` 3. 清理文件后缀:在应用程序中,对上传的文件名进行严格检查,确保只有一个后缀且是允许的类型。 4. 使用`mod_rewrite`阻止恶意请求:可以添加规则来阻止包含多个后缀的请求,特别是包含`.php`的请求。 5. 确保其他后缀不被错误解析:检查服务器配置,确保没有其他非必要后缀被配置为可执行脚本。 相关问题: 1. 如何验证Apache服务器是否存在多后缀解析漏洞? 2. 除了多后缀解析漏洞,Apache HTTPD还有哪些常见的安全漏洞? 3. 如何配置Apache服务器以提高文件上传功能的安全性? 4. 在Nginx服务器中,是否也存在类似的多后缀解析漏洞?如何防范?</think>### Apache HTTPD 多后缀名解析漏洞详情 #### 漏洞原理 Apache HTTPD 在处理文件时存在一个特性:**允许单个文件拥有多个后缀名**(如 `file.php.jpg`)。解析规则如下: 1. 从**最右侧后缀开始识别**(如 `.jpg`) 2. 若无法识别则**向左依次检测**后缀名 3. 遇到可识别的后缀(如 `.php`)时,**直接按该类型解析文件**[^1][^2] **关键触发条件**: ```apache # 危险配置示例(漏洞根源) AddHandler application/x-httpd-php .php ``` 当存在此配置时,上传 `malicious.php.jpg` 文件会被解析为 PHP 脚本执行,因为服务器识别到 `.php` 后缀[^1]。 #### 漏洞利用方式 1. **文件上传绕过** - 攻击者上传伪装文件:`shell.php.jpg` 或 `shell.php.123` - Apache 解析时识别 `.php` 后缀,执行其中的恶意代码 - 经典攻击载荷: ```php <?php system($_GET['cmd']); ?> ``` 2. **结合其他漏洞** - 配合文件上传功能缺陷,突破白单限制 - 通过路径拼接触发解析(如 `/uploads/user_avatar.php.jpg`) #### 修复方法 1. **修改 Apache 配置**(根本解决方案) ```apache # 替换危险的 AddHandler 指令 <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> ``` 此配置**严格匹配以 `.php` 结尾的文件**,忽略多后缀情况[^1]。 2. **限制上传目录执行权限** ```apache <Directory "/var/www/uploads"> # 禁止执行脚本 php_flag engine off Options -ExecCGI </Directory> ``` 3. **应用程序层防护** - 文件上传时**重命文件**(如生成随机文件名) - 检查文件内容而非依赖后缀名 - 使用 MIME 类型检测(如 `finfo_file()`) 4. **补充方案** - 升级到 Apache 2.4.26+ 并启用 `AllowOverride None` - 使用 WAF 规则拦截异常后缀组合(如 `.php.`) > **注意**:该漏洞与 Apache/PHP 版本无关,纯属配置问题[^1]。修复后需测试 `test.php.jpg` 是否返回源码而非执行。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值