PHP 允許在運行時通過 eval() 執行字串代碼,從而實現「動態生成函數」。這雖然強大,但極度危險——任何用戶可控輸入進入 eval 都可能導致任意代碼執行 (RCE)。本文展示基本用法並重點剖析防禦策略。
<?php
$a = ['a' => 1, 'b' => 1, 'c' => 1];
// 字串形式的函數定義
$code = "function check_a() {
global \$a;
if (\$a['a'] == 1 && \$a['b'] == 1 && \$a['c'] == 1) {
return 'OK';
}
return 'ERR';
}";
eval($code); // 定義函數 check_a()
echo check_a() === 'OK' ? 'GOOD' : 'OH NO'; // GOOD
<?php
// 極度危險:直接 eval 用戶輸入
eval($_POST['code']); // 攻擊者傳入 "system('rm -rf /');" 即可毀滅伺服器
| 需求 | 安全做法 | 原理 |
|---|---|---|
| 動態業務規則 | 策略模式 + 類/閉包 | 預先定義好規則類,運行時注入實例 |
| 模板引擎 | Twig / Blade / Smarty | 沙箱編譯,禁止 PHP 原生代碼 |
| 用戶自定義腳本 | Lua (php-lua) / V8JS / WebAssembly | 獨立虛擬機,資源隔離、可設限制 |
| 插件系統 | Composer 套件 + 介面契約 | 靜態分析、版本管理、簽名驗證 |