thinkPHP3.2的rewrite问题,之前也没在意过,但是今天浏览了一下服务器的一套CMS的相关东西,因为这套CMS是使用thinkPHP3.2搭建的,在浏览代码时发现其目录架构与目前的流行架构不一样,其index.php是写在应用程序的根目录下,而现在的index.php一般都写在public目录(只允许对外访问的目录下面),于是我顺便看了一下涉及此CMS平台的nginx配置,配置conf基本和thinkphp官网的配置一样,在thinkphp网站上也能看到大多数这样的配置,如下:本文地址:http://www.04007.cn/article/532.html,未经许可,不得转载.
server { listen 80; server_name domain.com; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; #这个location块处理动态资源请求. location ~ \.php { root /data0/htdocs/www; fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; } #这个location处理能处理所有的静态资源 location / { root /home/htdocs/www; index index.php index.html index.htm; if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; } } }看了一眼之后突然觉得这个有问题,在执行最后一步rewrite之前的判断是判断这个文件是否存在,if (!-e $request_filename)。如果不存在才会执行由index.php入口进行请求。但这明显是有问题的,那么如果直接请求存在的PHP文件或者其它文件呢?是不是也能请求(是否会造成问题不论,至少突破了你的设防)。由于我的代码版本中存在一些shell脚本以及一些python代码,于是我尝试直接访问python代码文件,发现其能将python文件下载下来,这就是很大的问题了。万一shell或者python代码块中有服务器密码或什么账号之类的东西,这个服务器就要被攻击玩完了。可见thinkphp升级到5的必要性了,thinkPHP5中的框架已经是大众架构了(对外只允许访问Public目录,index.php和其它的css/js等资源文件都放在此目录。当然对于我现在的情况,也懒得去升级了。不改代码的话在nginx层加上配置:本文地址:http://www.04007.cn/article/532.html,未经许可,不得转载.
#将不允许直接访问的文件后缀列在此处 location ~ \.(py|sh)$ { return 404; }如果你方便去改代码,建议将thinkphp3.2的PHP的入口文件移动到Public目录下,同时将其它robots.txt文件也放入。然后修改thinkphp3.2的入口文件如下:本文地址:http://www.04007.cn/article/532.html,未经许可,不得转载.
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- // 应用入口文件 // 检测PHP环境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG',false); // 定义应用目录 define('ROOT_PATH', dirname(__DIR__)); #此行为增加的新行 define('APP_PATH', ROOT_PATH.'/Application/'); #修改此处加载路径,添加上面的ROOT_PATH // 引入ThinkPHP入口文件 require ROOT_PATH.'/ThinkPHP/ThinkPHP.php'; #修改此处加载路径,添加上面的ROOT_PATH // 亲^_^ 后面不需要任何代码了 就是如此简单本文地址:http://www.04007.cn/article/532.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/532.html 未经许可,不得转载. 手机访问本页请扫描下方二维码: