整理目錄結構、更名素材檔、以 include 拆分前後台頁面框架,並用 switch-case 控制內容區的動態載入。
【步驟說明】
css/、js/、upload/、icon/、view/、Controller/ 等目錄。.css、.js、icon 圖檔複製到對應目錄。01P01.html → login.php01P02.html → index.php01P03.html → backend.php01P04.html → news.php<link>、<script> 的路徑,指向新目錄。view/ 下再建 front/(前台)、backend/(後台)、modal/(彈出視窗)三個子目錄。【概念】
index.php 與 backend.php 只保留「不變的外框」(導覽、頁首、頁尾),中間「會變動的內容區」挖出來,存成獨立的 view/ 檔案。include 把對應的 view 檔案嵌回去,達到「一個外框 + 多個內容」的架構。/* index.php 示意(只保留外框,中間用 include 填入) */
<!-- 導覽列 HTML -->
<div id="content">
<?php include './view/front/main.php'; ?>
</div>
<!-- 頁尾 HTML -->
【問題根源】
?do=xxx 的 GET 參數決定要 include 哪個 view 檔案。$do 拼進路徑:// ❌ 危險做法:直接把 GET 值拼進路徑
$do = $_GET['do'] ?? 'main';
$file = './view/front/' . $do . '.php';
if (file_exists($file)) {
include $file; // ?do=../../config 就能 include 任意檔案
}
?do=../../config,讓伺服器 include 到不該公開的檔案(路徑穿越攻擊)。
【switch-case 解法】
case 裡寫到的才能被載入,其他一律走 default(回到預設頁)。// ✅ 前台 index.php
$do = (!empty($_GET['do'])) ? $_GET['do'] : 'main';
switch ($do) {
case 'main':
include './view/front/main.php';
break;
case 'login':
include './view/front/login.php';
break;
case 'news':
include './view/front/news.php';
break;
default:
include './view/front/main.php';
}
// ✅ 後台 backend.php(同樣邏輯)
$do = (!empty($_GET['do'])) ? $_GET['do'] : 'title';
switch ($do) {
case 'title': include './view/backend/title.php'; break;
【學習重點】
case 的頁面才能被 include,任意路徑一律被擋下。default 扮演「保底」角色:不管傳什麼奇怪的值,都回到預設頁,不會出錯也不會洩漏。index.php 和後台 backend.php 各有自己的 switch,管各自的 view 目錄。