360°网站管家_运维学院_提供最新最全的服务器运维视频教程与网站维护视频教程

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
1 2 3 4
查看: 2890|回复: 0
打印 上一主题 下一主题

LNMP环境中如何正确的设置指定目录禁止执行PHP程序

[复制链接]

823

主题

909

帖子

4623

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4623
跳转到指定楼层
楼主
发表于 2015-10-9 11:39:53 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

亲!这问题您也搜索很久了吧?不如咨询下我们吧


613049616  613049616  613049616   613049616   613049616


文中提到,使用lnmp1.1搭建的nginx环境,正好我的vps也是lnmp搭建的环境,所以我可以在我的vps里做实验。
    看到文中的解决方案:
   
    在location中,将匹配到/(avatar|uploads|ups)/.*\.(php|php5)?$的请求全部禁用掉。
    似乎是一个很好的方法,那我们怎么绕过?
    在web世界里,有一种请求方式叫pathinfo,我们在图中也可以看到,倒数第二行注释掉了一个includepathinfo.conf。前面的说明里也说到了,如果要开启pathinfo,只要注释掉try_files $uri=404即可。
    很多框架、CMS的默认请求方式就是pathinfo,如著名php框架codeigniter,所以可见pathinfo用的是比较广的,所以也会有大量vps在这里是允许pathinfo的。
    那么,当开启了pathinfo后,前面的denyall;就完全失效了,我们只需要在upload目录里上传xxx.php后,如下方式访问:
    http://xxx/upload/xxx.php/xxx
    即可让location/(avatar|uploads|ups)/.*\.(php|php5)?$这条规则完全失效,因为上述请求并不以.php结尾。
    那么,怎样才能有效禁止某目录下解析php?
    那还是应该回到nginx解析php的方式上。我们看到上图,我们可以发现,实际上进入这个location块:location~ [^/]\.php(/|$),才真正将请求交给fastcgi去解析。
    所以,我们只需要阻止请求进入这个location块,那么这个请求不论是怎样的后缀,怎样的方式,都不会被php-fpm解析的。
    所以,我的方法是:
location ^~ /upload/ {
    default_type text/plain;
    expires 30d;
}
location ~ [^/]\.php(/|$)
{
        # comment try_files$uri =404; to enable pathinfo
        #try_files $uri=404;
        fastcgi_pass  unix:/tmp/php-cgi-leavesongs.sock;
        fastcgi_indexindex.php;
        includefastcgi.conf;
        includepathinfo.conf;
}
    在php的解析块前,加上“location ^~ /upload/”块,^~的意思是“一旦匹配上该块,则不再匹配其他块,一般匹配目录”。所以,这里正好满足我的要求,只要在/upload/目录下的文件,都将匹配到这个块中,而且不会再匹配别的块,所以也不会再进入下面的php解析块中。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 快速注册

本版积分规则


Archiver|手机版|小黑屋|360wzgj Inc. 百度统计

GMT+8, 2024-11-1 13:33 , Processed in 0.071139 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表