問題描述
我的問題是:當我編寫一個 AJAX 函式時,我可以使用一個單獨的檔案來編寫它。我可以將 wp-load.php 包含在該檔案中,並使用 WP 核心功能。我知道這是錯的。你能告訴我有多糟糕?這是一個很大的安全隱患嗎?我有什麼安全的風險和劣勢?
最佳解決方案
這是非常糟糕的,一個重大的安全漏洞,你將不得不面對這些問題:
-
即使您的外掛被停用,或者您切換主題,您的端點將始終工作
-
您的端點將在多站點安裝的所有站點上處於活動狀態,而不僅僅是您打算使用的端點,這可能導致端點在不需要的位置使用
-
該檔案將變得脆弱,移動您的外掛資料夾,或插入
mu-plugins外掛將導致端點給 500 個致命錯誤 -
您將需要自己實現所有的身份驗證和驗證
-
快取外掛將無法與您的端點進行互動,從而減緩常見請求
-
所述端點可以接受任何東西,它可以返回任何東西
說主題和外掛中的獨立端點是一個安全風險,無論是 AJAX 處理程序還是表單處理程序,甚至是影像的獨立檔案 (timtumb 這樣做,甚至原始的開發人員都因為其安全聲譽)
您可以使用更好的 WP AJAX API,但需要您自己實施任何身份驗證或清理檢查,並有一些怪癖。它也沒有提供任何結構,如同一個標準端點,它可以接收任何東西並返回任何東西 (如果它完全返回) 。
相反,使用 REST API 與 register_rest_route,它更容易使用,有更少的怪癖,併為您處理身份驗證。它還給你更友好的 URL 和名稱空間,例如:
function tomjn_rest_test() {
return "moomins";
}
add_action( 'rest_api_init', function () {
register_rest_route( 'tomjn/v1', '/test/', array(
'methods' => 'GET',
'callback' => 'tomjn_rest_test'
) );
} );
你可以看到:
https://tomjn.com/wp-json/tomjn/v1/test
有了這個我可以做一些事情:
-
指定使用者必須登入,以及他們需要什麼才能做到這一點
-
指定引數
-
分別指定每個引數的型別和消音器
-
指定是否需要它們
-
-
指定端點是用於讀寫還是兩者
所有這些都是由為核心編寫的程式碼處理的。當然,您可以在每個 WP AJAX 處理程序中手動實現所有這些操作,但是這更簡潔和測試 (WP 社群中很少有足夠的能夠正確執行此操作) 。使我的端點僅適用於管理員:
register_rest_route( 'tomjn/v1', '/test/', array(
'methods' => 'GET',
'callback' => 'tomjn_rest_test',
'permission_callback' => function( $req ) {
return current_user_can('manage_options');
}
) );
作為一個獎勵,它使某些最佳實踐更容易使用,例如返回資料不是 HTML,使用標準 HTTP GET PUT POST 等,並返回可以驗證的 JSON 響應
端點始終處於活動狀態的情況如何?
之前我提到本機端點是活動的,即使其內部的外掛被停用。關閉它的唯一方法是透過內部檢查,或刪除檔案。為什麼這麼糟糕?
這一點的關鍵在於,在某種情況下可能適用的可能不在另一種情況。
例如,情景 1:
管理員安裝一個外掛,允許使用者在前端登入並註冊,而無需重新整理頁面。為了做到這一點,外掛有一個端點來建立使用者。然而,管理員意識到註冊不是他們想要的,只能登入,並停用該外掛。這些檔案仍然存在,使用者仍然可以載入端點來建立新使用者。
情景 2:
在多站點安裝中正在使用一個外掛,透過聯絡表單向部落格的管理員傳送電子郵件。這一切都按預期工作,但網站上還有其他對此功能不感興趣的部落格。透過更改部落格使用的域名,攻擊者可以透過在網路上的其他部落格的上下文中載入聯絡人表單使用的端點,向這些其他部落格的管理員傳送電子郵件,向任何具有管理角色的人傳送電子郵件多站點安裝的任何地方
情景 3:
外掛具有一個有用的除錯功能,允許使用者更改其電子郵件,但出於安全原因,您已關閉此功能。然而,處理電子郵件更改表單的端點是一個獨立的檔案,任何知道如何構建表單的人仍然可以更改其電子郵件
次佳解決方案
編寫自定義檔案端點的主要缺點是,您的檔案不知道 wp-load.php 在一般情況下的位置。無論何時在 WP 環境中,都提供了上下文。如果您正在嘗試從任意 PHP 檔案中找到 WP 核心的位置,那麼它將不會對所有可能的配置起作用。
因此,這種技術的最大缺點是它不能在公共擴充套件中分發。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。