搜尋
首頁後端開發PHP問題如何使用PHP中的runkit擴展

本篇文章為大家介紹一下使用PHP中的runkit擴充的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

如何使用PHP中的runkit擴展

這次又為大家帶來一個好玩的擴充。我們知道,在 PHP 運行的時候,也就是部署完成後,我們是無法修改常數的值,也不能修改方法體內部的實作的。也就是說,我們編碼完成後,將程式碼上傳到伺服器,這時候,我們想在不修改程式碼的情況去修改一個常數的值是不行的。常量本身就是不允許修改的。但是,runkit 擴充卻可以幫助我們完成這個功能。

動態修改常數

define('A', 'TestA');

runkit_constant_redefine('A', 'NewTestA');

echo A; // NewTestA

是不是很神奇。這個 runkit 擴充就是在執行時可以讓我們來動態的修改一些常數、方法體及類別的功能擴充。當然,從系統安全的角度來來,這個擴充並不是很推薦。因為本身常量的意義就是不變的量,本身就不應該修改的。同理,在執行時期動態的改變函數體或類別定義的內容都是會有可能影響到其它呼叫到這些函數或類別的程式碼,所以,這個擴充是一個危險的擴充。

除了動態地修改常數外,我們還可以使用 runkit_constant_add() 、 runkit_constant_remove() 函數來動態地增加或刪除常數。

安裝

runkit 擴充功能的安裝是需要在 github 下載然後進行正常的擴充編譯即可,pecl 下載的已經過時了。

PHP5: http://github.com/zenovich/runkit

PHP7:https://github.com/runkit7/runkit7.git

clone 成功後進行正常的擴充編譯安裝步驟即可。

phpize
./configure
make
make install

不同的PHP 版本需要安裝不同版本的擴展,同時,runkit7 還在開發中,有一些函數還沒有支持,例如:

  • runkit_class_adopt

  • runkit_class_emancipate

  • #runkit_import

  • runkit_lint_file

  • #runkit_lint

  • runkit_sandbox_output_handler

  • #runkit_return_value_used

  • Runkit_Sandbox

  • #Runkit_Sandbox

# #Runkit_Sandbox_Parent

在寫這篇文章的測試程式碼時,上述函數或類別都是不支援的。大家可以用 PHP5 的環境測試下原版的擴充功能是否都能正常使用。

查看超全域變數鍵

print_r(runkit_superglobals());
//Array
//(
//    [0] => GLOBALS
//    [1] => _GET
//    [2] => _POST
//    [3] => _COOKIE
//    [4] => _SERVER
//    [5] => _ENV
//    [6] => _REQUEST
//    [7] => _FILES
//    [8] => _SESSION
//)

這個函數其實就是要查看下目前運行環境中的所有超全域變數鍵名。這些都是我們常用的一些超全域變量,就不一一解釋了。

方法相關操作

方法運算就和常數運算一樣,我們可以動態地新增、修改、刪除、重新命名各種方法。首先還是來看看我們最關心的在動態運行時來修改方法體裡面的邏輯程式碼。

function testme() {
  echo "Original Testme Implementation\n";
}
testme(); // Original Testme Implementation
runkit_function_redefine('testme','','echo "New Testme Implementation\n";');
testme(); // New Testme Implementation

定義了一個 testme() 方法,然後透過 runkit_function_redefine() 來修改它的實現,最後再次呼叫 testme() 時輸出的就是新修改後的實現了。那麼,我們能不能修改 PHP 自備的那些方法呢?

// php.ini runkit.internal_override=1
runkit_function_redefine('str_replace', '', 'echo "str_replace changed!\n";');
str_replace(); // str_replace changed!

runkit_function_rename ('implode', 'joinArr' );
var_dump(joinArr(",", ['a', 'b', 'c'])); 
// string(5) "a,b,c"


array_map(function($v){
   echo $v,PHP_EOL;
},[1,2,3]);
// 1
// 2
// 3
runkit_function_remove ('array_map');

// array_map(function($v){
//   echo $v;
// },[1,2,3]);
// PHP Fatal error:  Uncaught Error: Call to undefined function array_map()

程式碼裡的註解說的很清楚了,我們只要在 php.ini 中設定 runkit.internal_override=1 ,就可以動態地修改 PHP 自帶的那些方法函數了。例如第一段我們修改了 str_replace() 方法,讓他直接就輸出了一段文字。然後我們將 implode() 改名為 joinArr() ,就可以像 implode() 一樣來使用這個 joinArr() 。最後,我們刪除了 array_map() 方法,如果再次呼叫這個方法,就會報錯。

類別方法相關運算

類別內部方法函數的運算和上面變數方法運算是類似的,不過對於PHP 自帶的類別我們無法進行修改之類的操作。這個大家可以自己試試看。

//runkit_method_add('PDO', 'testAddPdo', '', 'echo "This is PDO new Func!\n";');
//PDO::testAddPdo();
// PHP Warning:  runkit_method_add(): class PDO is not a user-defined class

從報錯資訊可以看出,PDO 類別不是使用者定義的類,所以無法使用 runkit 函數進行相關操作。那我們就來看看我們自訂的類別是如何使用 runkit 來進行動態操作的吧。

class Example{
}

runkit_method_add('Example', 'func1', '', 'echo "This is Func1!\n";');
runkit_method_add('Example', 'func2', function(){
    echo "This is Func2!\n";
});
$e = new Example;
$e->func1(); // This is Func1!
$e->func2(); // This is Func2!

runkit_method_redefine('Example', 'func1', function(){
    echo "New Func1!\n";
});
$e->func1(); // New Func1!

runkit_method_rename('Example', 'func2', 'func22');
$e->func22(); // This is Func2!

runkit_method_remove('Example', 'func1');
//$e->func1();
// PHP Fatal error:  Uncaught Error: Call to undefined method Example::func1()
###我們定義了一個空類,然後動態給它添加了兩個方法,之後修改了方法1,重命名了方法2,最後刪除了方法1,一系列的操作其實和上面的普通方法的操作基本上是一樣的。 #########總結#########就像上面說過的一樣,這個擴展是比較危險的一個擴展,特別是如果開啟了runkit.internal_override 後,我們還能夠修改PHP 的原生函數。不過如果是必須要使用它的話,那麼它的這些功能就非常有用。就像 訪客模式 一樣,“大多時候你並不需要訪客模式,但當一旦你需要訪客模式時,那就是真的需要它了”,這套 runkit 擴展也是一樣的道理。 ###

推荐学习:php视频教程

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E4%B8%80%E8%B5%B7%E5%AD%A6%E4%B9%A0PHP%E7%9A%84runkit%E6%89%A9%E5%B1%95%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8.php

以上是如何使用PHP中的runkit擴展的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
酸與基本數據庫:差異和何時使用。酸與基本數據庫:差異和何時使用。Mar 26, 2025 pm 04:19 PM

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

PHP安全文件上傳:防止與文件相關的漏洞。PHP安全文件上傳:防止與文件相關的漏洞。Mar 26, 2025 pm 04:18 PM

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

PHP輸入驗證:最佳實踐。PHP輸入驗證:最佳實踐。Mar 26, 2025 pm 04:17 PM

文章討論了PHP輸入驗證以增強安全性的最佳實踐,重點是使用內置功能,白名單方法和服務器端驗證等技術。

PHP API率限制:實施策略。PHP API率限制:實施策略。Mar 26, 2025 pm 04:16 PM

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

php密碼哈希:password_hash和password_verify。php密碼哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

OWASP前10 php:描述並減輕常見漏洞。OWASP前10 php:描述並減輕常見漏洞。Mar 26, 2025 pm 04:13 PM

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。

PHP XSS預防:如何預防XSS。PHP XSS預防:如何預防XSS。Mar 26, 2025 pm 04:12 PM

本文討論了防止PHP中XSS攻擊的策略,專注於輸入消毒,輸出編碼以及使用安全增強的庫和框架。

PHP接口與抽像類:何時使用。PHP接口與抽像類:何時使用。Mar 26, 2025 pm 04:11 PM

本文討論了PHP中接口和抽像類的使用,重點是何時使用。界面定義了無實施的合同,適用於無關類和多重繼承。摘要類提供常見功能

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。