首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP eval() 函數危害深度解析與正確禁用方案

     編輯:PHP 綜合知識

為什麼 eval() 極其危險

eval() 將字符串作為 PHP 代碼執行。一旦攻擊者控制輸入字符串,即可執行任意代碼。典型一句話木馬:

<?php eval($_POST['cmd']); ?>

攻擊者 POST cmd=system('id'); 即獲取服務器控制權。

常見誤區:disable_functions 無效

disable_functions = eval  ; 錯誤!無效

原因: eval() 是語言結構,非函數,不在 zend_function_table 中,disable_functions 只能禁用內部函數。

正確禁用方案:Suhosin 擴展

  1. 安裝 Suhosin:pecl install suhosin 或編譯 PHP 時 --enable-suhosin
  2. 加載擴展:extension=suhosin.so
  3. 配置禁用:suhosin.executor.disable_eval = On
  4. 重啟 PHP-FPM/Apache

驗證禁用效果

<?php
eval('echo "test";'); // 若禁用成功,將拋出 Fatal error 或被攔截
?>

代碼審計視角:如何發現 eval 風險

  • 全局搜索 eval(、assert(、preg_replace(/e、create_function(
  • 檢查變量是否經過嚴格過濾、白名單驗證
  • 業務邏輯是否真正需要動態執行代碼(極少數模板引擎、規則引擎除外)

替代方案

場景安全替代
動態配置JSON/YAML + 解析器
模板渲染Twig、Blade、Smarty(沙箱模式)
規則引擎Symfony ExpressionLanguage、自定義 DSL 解析器
數學表達式eval-math、自定義解析器

最佳實踐清單

  1. 生產環境強制安裝 Suhosin 並禁用 eval
  2. 代碼規範禁止使用 eval()、assert() 等動態執行函數
  3. CI/CD 流程集成靜態分析工具掃描高危函數
  4. 最小權限原則:Web 目錄不可寫、禁用危險函數、open_basedir 限制
  5. 定期滲透測試與代碼審計

總結

eval() 是 PHP 最大的安全隱患之一,php.ini 無法禁用,必須依賴 Suhosin 擴展。從架構層面杜絕動態代碼執行,才是根治之道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved