关于lnmp目录禁止执行的绕过与正确方法
无意中看到了这篇文章:http://www.freebuf.com/articles/system/49428.html
对于下面我莫名其妙中枪的事。。。我就不多说了:
于是我详细地把文章看了一遍,文章比较基础但也不失为一个引导新手的一个方法。但其中对于禁止执行的方式,我就不敢苟同了。在某种配置下,这个方法是能够很容易被绕过的。
文中提到,使用lnmp1.1搭建的nginx环境,正好我的vps也是lnmp搭建的环境,所以我可以在我的vps里做实验。
看到文中的解决方案:
在location中,将匹配到/(avatar|uploads|ups)/.*.(php|php5)?$的请求全部禁用掉。
似乎是一个很好的方法,那我们怎么绕过?
在web世界里,有一种请求方式叫pathinfo,我们在图中也可以看到,倒数第二行注释掉了一个include pathinfo.conf。前面的说明里也说到了,如果要开启pathinfo,只要注释掉try_files $uri =404即可。
很多框架、CMS的默认请求方式就是pathinfo,如著名php框架codeigniter,所以可见pathinfo用的是比较广的,所以也会有大量vps在这里是允许pathinfo的。
那么,当开启了pathinfo后,前面的deny all;就完全失效了,我们只需要在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_index index.php;
include fastcgi.conf;
include pathinfo.conf;
}
在php的解析块前,加上location ^~ /upload/
块,^~的意思是“一旦匹配上该块,则不再匹配其他块,一般匹配目录”。所以,这里正好满足我的要求,只要在/upload/目录下的文件,都将匹配到这个块中,而且不会再匹配别的块,所以也不会再进入下面的php解析块中。
附location匹配命令的一些说明:http://www.nginx.cn/115.html
- rman数据备份恢复学习笔记(49天)
- 虚拟专用数据库VPD应用 (48天)
- 关于创建视图的问题(48天)
- 性能调优之redo切换频率(47天)
- 关于oracle中session跟踪的总结(56天)
- oracle中关于小数中0的格式化(55天)
- 关于trigger过滤最大值的问题(54天)
- oracle共享服务器配置汇总(53天)
- 关于drop user的cascade选项解惑(52天)
- ORACLE数据文件名导致的奇怪问题 (51天)
- linux下挂载新硬盘和分区的步骤 (50天)
- 通过shell脚本生成数据统计信息的报表 (笔记65天)
- 物化视图全量刷新的简单测试(63天)
- Golang语言社区--Go操作CSV文件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法