問題描述

我的問題是:當我編寫一個 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。