PHP 遠程執行系統命令實現服務器關機與重啟
本文展示一個通過 Web 界面遠程執行 Windows 系統關機命令的 PHP 實現。雖然功能強大,但安全風險極高,僅供內網受控環境教學參考,嚴禁暴露在公網或生產環境中使用。
核心實現代碼
<?php
/**
* 遠程執行系統命令
* 要求:Web 服務器進程需有 cmd.exe 執行權限
* 作者:薛如飛
* 日期:2008-08-28
*/
if (isset($_POST['cmd'])) {
$cmd = stripslashes($_POST['cmd']);
exec($cmd, $out);
var_dump($out);
echo '
';
var_dump($cmd);
} else {
?>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<form action="index.php" method="post" name="form0" id="form0">
<p> </p>
<p align="center">CMD 控制台</p>
<table width="200" border="0" align="center">
<tr>
<td width="81" height="18">選擇操作:</td>
<td width="109">
<select name="cmd">
<option value="shutdown -r" selected="selected">重啟計算機</option>
<option value="shutdown -s">關閉計算機</option>
<option value="shutdown -l">注銷當前用戶</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="Submit" value="提交執行" /></td>
</tr>
</table>
<p></p>
</form>
<?php
}
?>
Windows shutdown 命令參數詳解
| 參數 | 功能 | 常用組合 |
| -s | 關機 | shutdown -s -t 60 (60秒後關機) |
| -r | 重啟 | shutdown -r -t 0 (立即重啟) |
| -l | 注銷 | shutdown -l |
| -t xxx | 設置倒計時(秒) | shutdown -s -t 300 |
| -c "msg" | 關機提示信息 | shutdown -r -c "系統維護" |
| -f | 強制關閉應用 | shutdown -s -f |
| -a | 取消已排程關機 | shutdown -a |
| -m \\computer | 遠程計算機 | shutdown -m \\192.168.1.100 -r |
⚠️ 嚴重安全風險分析
🔴 高危漏洞清單
- 命令注入:用戶可提交任意命令(如 `format c:`, `del /s *.*`, `net user hacker pass /add`)
- 權限過高:Web 進程需擁有系統級命令執行權限
- 無認證授權:任何訪問者均可執行關機操作
- 無審計日誌:無操作記錄,事後無法追蹤
- CSRF 攻擊:無 Token 驗證,易被惡意頁面誘導提交
安全加固方案(若必須使用)
1. 基礎防護
<?php
// 嚴格命令白名單
$allowed_commands = [
'shutdown -r' => '重啟計算機',
'shutdown -s' => '關閉計算機',
'shutdown -l' => '注銷用戶'
];
if (isset($_POST['cmd']) && isset($allowed_commands[$_POST['cmd']])) {
$cmd = $allowed_commands[$_POST['cmd']];
// 添加 CSRF Token 驗證
if (!verify_csrf_token($_POST['token'])) die('Token 無效');
// 添加 IP 白名單
$allowed_ips = ['192.168.1.100', '10.0.0.50'];
if (!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)) die('IP 不允許');
// 記錄操作日誌
log_operation($_SERVER['REMOTE_ADDR'], $cmd);
exec($cmd, $out, $return_code);
// ...
}
?>
2. 進階架構:任務隊列 + 守護進程
// Web 端:寫入任務隊列(數據庫/Redis)
$task = [
'command' => 'shutdown -r',
'ip' => $_SERVER['REMOTE_ADDR'],
'user' => $current_user,
'time' => time(),
'status' => 'pending'
];
$db->insert('system_tasks', $task);
// 守護進程(系統服務,高權限運行):
// 1. 輪詢任務表
// 2. 驗證任務合法性
// 3. 執行命令
// 4. 記錄結果
// 優點:Web 進程無需高權限,權限隔離,可審計
跨平台兼容性說明
| 系統 | 關機命令 | 權限要求 |
| Windows | shutdown -s | SeShutdownPrivilege |
| Linux | shutdown -h now / poweroff | root 或 sudo 權限 |
| macOS | shutdown -h now | root 權限 |
現代替代方案
- IPMI/iDRAC/iLO:服務器硬件級遠程管理,獨立於操作系統
- Ansible/SaltStack:自動化運維工具,支持批量、定時、條件式操作
- 系統監控平台:Zabbix/Prometheus + Alertmanager 觸發自動化腳本
- 雲廠商 API:AWS EC2 RebootInstances、阿里云 RebootInstance 等
總結:此代碼展示了 PHP exec() 函數調用系統命令的基本用法,但在任何實際場景中,直接暴露系統命令執行接口都是不可接受的安全風險。請採用權限分離、審計日誌、自動化運維平台等專業方案替代。
- 上一篇文章: PHP 文件緩存類實現與最佳實踐指南
- 下一篇文章: PHP 檢測遠程 URL 是否可訪問的多種方法
Copyright ©
程式碼之家 All Rights Reserved