我下載了ci,slim,laravel架構,上傳到我的ubuntu+nginx+php主機上,但是我發現,隨便這三個架構的任意一個目錄中放一個test.php檔案,輸出 echo "hello world",然後這個檔案竟然能在瀏覽器上訪問。
那麼請問,這些架構不是單入口的嗎,只能通過index.php訪問,可是為什麼這裡能以目錄+檔案名稱的形式越過index.php進行訪問嗎,那隨便一個檔案都能被外部存取了,還有什麼安全性和隔離性可言呢。
還有就是怎麼隱藏index.php這個檔案呢,直接通過網域名稱根目錄訪問各頁面路由。
回複內容:
我下載了ci,slim,laravel架構,上傳到我的ubuntu+nginx+php主機上,但是我發現,隨便這三個架構的任意一個目錄中放一個test.php檔案,輸出 echo "hello world",然後這個檔案竟然能在瀏覽器上訪問。
那麼請問,這些架構不是單入口的嗎,只能通過index.php訪問,可是為什麼這裡能以目錄+檔案名稱的形式越過index.php進行訪問嗎,那隨便一個檔案都能被外部存取了,還有什麼安全性和隔離性可言呢。
還有就是怎麼隱藏index.php這個檔案呢,直接通過網域名稱根目錄訪問各頁面路由。
你現在對單一入口的理解有點問題:單一入口指的是你的應用是通過一個入口檔案進入的,其實你的單一入口的程式不就是個 PHP 檔案嘛,也沒什麼特別的,為什麼其它程式就不能被訪問呢?你可能要說因為它是單一入口(這隻是你臆想出來的),Web 服務器可不認為只有它可以訪問,能限制誰允許被訪問,誰不允許被的就只有 Web 服務器,可以用它來限制只有你要的 PHP 被訪問,其它的不允許。
另外:架構的源碼應該是放到 webRoot 之外的,只有需要被訪問的程式放在 webRoot 裡,比如你的 index.php 還有一些靜態資源。
如何?限制只有單一入口這一個 PHP 訪問,可以去查對應的架構所對應的 Web 服務器的寫法:
比如我是 YII2 加 Nginx
server { server_name xxx.idarex.com; index index.php; set $rootdir /var/www/html/idarex/passport/web; root $rootdir; location / { try_files $uri $uri /index.php?$args; } location ~ \.php$ { include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $rootdir/index.php; fastcgi_pass 127.0.0.1:9000; }}
使用單入口的app,控制不讓存取碼所在目錄,一般有兩種實現:
使用web server的rewrite 規則,把源碼所在目錄的.php檔案排除在外。
把你的入口檔案單獨放在一個檔案夾,且作為網站root目錄,源碼在上層目錄。
重寫規則吧 非檔案或目錄 - List Item
看下對比
多入口即通過訪問不同的 php 檔案運行對應的功能
index.php - 網站首頁list.php?page=5 - 內容列表頁 article.php?id=12 - 內容詳細頁
單一入口程式都是在訪問index.php時附帶一個特定的參數
index.php?action=list 就可以定義為訪問內容列表頁index.php?action=info 則可以定義為訪問內容詳細頁
index.php的內容
$action=$_GET['action']==''?'index':$_GET['action'];include('files/'.$action.'.php');
正常的根目錄下面就你只需要放一個index.php 就可以實現您網站所有的功能。
在nginx情況下隱藏index.php,需要修改nginx的設定檔。
location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; } }
樓主,單入口訪問是針對PHP程式而言,你手動在瀏覽器輸入項目的目錄結構肯定是可以的啊!
在允許直接存取的檔案開頭(頁面控制器或者前端控制器)定義入口:
if (!defined('APP_ROOT')) define('APP_ROOT', './');
在不允許直接存取的檔案開頭這樣寫:
if (!defined('APP_ROOT')) exit();
可以通過配置rewrite重寫規則實現URL的RESTful,比如Nginx:
rewrite ^/post/([0-9]+)$ /post.php?id=$1;
訪問 /post/1024 Nginx會轉成 /post.php?id=1024 來處理.
以下轉自: http://ftqq.com/open-source-projects/lazyphp/
前端控制器 /index.php?c=user&a=login
載入名為user的控制器(controller),並執行名為login的方法(action).
實現上,controller被放到AROOT.controller目錄下,以class形式存在,而action就是這個class的一個方法.
$c = $_GET['c']; //擷取controller$a = $_GET['a']; //擷取actionrequire_once AROOT.'controller/'.$c.'/'.$a.'.class.php'; //載入檔案/controller/user/login.class.php$o = new $c.'Controller'; // 建立對象userControllercall_user_func(array($o,$a)); //調用對象$o(userController)裡的方法$a(login)
實際編寫應用的過程,就是不斷的添加controller和action並把它實現,比如:
class defaultController extends appController { function __construct() { parent::__construct(); } function index() { $data['title'] = $data['top_title'] = '首頁'; render( $data ); }}
rewrite是最簡單的 另外php這個單入口也就那麼回事了 寫成index.php?act=buy&id=20和buy.php?id=20有區別麼
laravel的index.php檔案是放在public檔案夾下面的,所有的靜態檔案js,css這類的都可以放在這個public下面,nginx只要設定到這個public目錄就行了,其他檔案夾下的檔案是訪問不了的。還有架構都是有執行流程的, 即使你訪問了一個其他的檔案,架構不通過index.php引入啟動,訪問到了也沒什麼實際作用。除非那些php檔案事先就是留好後門的。
認真你就輸了,php就是指令碼語言,你放哪裡,怎麼訪問都需要你人為控制的,想實現安全性那就需要一系列的措施的,包括伺服器的設定,web伺服器相關設定,php相關設定等……