eval() 極其危險eval() 將字符串作為 PHP 代碼執行。一旦攻擊者控制輸入字符串,即可執行任意代碼。典型一句話木馬:
<?php eval($_POST['cmd']); ?>
攻擊者 POST cmd=system('id'); 即獲取服務器控制權。
disable_functions 無效disable_functions = eval ; 錯誤!無效
原因: eval() 是語言結構,非函數,不在 zend_function_table 中,disable_functions 只能禁用內部函數。
pecl install suhosin 或編譯 PHP 時 --enable-suhosinextension=suhosin.sosuhosin.executor.disable_eval = On<?php
eval('echo "test";'); // 若禁用成功,將拋出 Fatal error 或被攔截
?>
eval(、assert(、preg_replace(/e、create_function(| 場景 | 安全替代 |
|---|---|
| 動態配置 | JSON/YAML + 解析器 |
| 模板渲染 | Twig、Blade、Smarty(沙箱模式) |
| 規則引擎 | Symfony ExpressionLanguage、自定義 DSL 解析器 |
| 數學表達式 | eval-math、自定義解析器 |
eval()、assert() 等動態執行函數eval() 是 PHP 最大的安全隱患之一,php.ini 無法禁用,必須依賴 Suhosin 擴展。從架構層面杜絕動態代碼執行,才是根治之道。