WordPress安全:使用Nonce保護主題和插件代碼
保護WordPress主題或插件代碼的安全至關重要,可以有效防止惡意用戶的攻擊。我們之前已經介紹過如何在WordPress中清理、轉義和驗證表單數據,以及如何使用VIP掃描器提高WordPress主題質量。今天,我們將探討Nonce(一次性使用數字)如何幫助保護WordPress主題和插件的安全。
wp_create_nonce()
實現的,該函數接受一個表示要保護的操作的單個字符串參數。驗證Nonce是使用wp_verify_nonce()
函數完成的,該函數接受兩個參數:要驗證的Nonce和關聯的操作。 WordPress Nonce定義為:
……一個“一次性使用數字”,用於幫助保護URL和表單免受某些類型的濫用(惡意或其他)。 https://www.php.cn/link/c5af1dfde10402285102771ad64b3dac
雖然在WordPress中,Nonce從技術上講不是數字(它是由字母和數字組成的哈希值),但它確實有助於防止惡意用戶運行操作。
WordPress Nonce的工作分為兩部分:
例如,當您在WordPress管理屏幕中刪除帖子時,您會注意到URL包含一個_wpnonce
參數:
https://www.php.cn/link/18175d262a01ebf04bc03e38e48e3ffc
刪除帖子的例程將檢查帖子542是否具有a03ac85772
的Nonce值,然後再刪除帖子。如果Nonce不存在或與預期值不匹配,則不會刪除帖子。
這可以防止惡意用戶潛在地刪除大量帖子。例如,以下內容將不起作用,因為Nonce屬於帖子ID 542:
https://www.php.cn/link/322d830da1130169fb4ca1c7543799d0 https://www.php.cn/link/dd4143061640d55fb312dd0ce8afa76e https://www.php.cn/link/9e0f9113b44003201076a9fade1b72d8
現在讓我們看看如何在插件中實現WordPress Nonce。
讓我們從一個具有自身設置屏幕的基本插件開始。設置屏幕有一個字段,可以提交並保存在WordPress選項表中。
在wp-content/plugins/implementing-wordpress-nonces/implementing-wordpress-nonces.php
中的新文件中輸入以下代碼:
<code class="language-php">// ... (插件代码,与原文相同) ...</code>
通過WordPress管理>插件屏幕激活插件,您將看到一個新的Nonces菜單項:
單擊此項,您將進入設置屏幕,其中只有一個字段:
輸入任何值,單擊“保存”,如果一切正常,您將看到確認信息以及您剛剛輸入的值:
將以下URL輸入到您的Web瀏覽器地址欄中(將域名替換為您安裝WordPress的位置):
https://www.php.cn/link/0e143c3bef0f7759c230664c4dc905f8
注意發生了什麼?該值被簡單地保存為abc,只需直接訪問URL並登錄到WordPress即可:
雖然我們可以在代碼中使用$_POST
代替$_REQUEST
(我們使用$_REQUEST
是為了更容易演示安全問題),但這無濟於事——惡意用戶仍然可以通過自己或誘導您單擊鏈接來讓您向此屏幕發送POST請求,從而導致選項值更改。
這被稱為跨站點請求偽造(或CSRF)。惡意網站、電子郵件、應用程序等會導致用戶的Web瀏覽器執行不需要的操作。
我們現在將創建和驗證WordPress Nonce,以防止這種攻擊成為可能。
如前所述,此過程分為兩個步驟:首先,我們需要創建一個將與我們的表單一起提交的Nonce。其次,我們需要在提交表單時驗證該Nonce。
要在我們的表單中創建Nonce字段,我們可以使用wp_nonce_field()
:
獲取或顯示Nonce隱藏表單字段……用於驗證表單請求的內容是否來自當前站點,而不是其他地方……
在我們的輸入按鈕上方添加以下代碼:
<code class="language-php">// ... (插件代码,与原文相同) ...</code>
wp_nonce_field
接受四個參數——前兩個最重要:
$action
:這決定了我們正在運行的特定操作,並且應該唯一。最好用插件名稱作為操作的前綴,因為可能會有多個操作運行。在本例中,我們正在保存某些內容,因此我們使用了implementing_wordpress_nonces_save
$name
:這決定了此函數創建的隱藏字段的名稱。如上所述,我們已使用插件名稱作為其前綴,因此將其命名為implementing_wordpress_nonces_nonce
如果我們重新加載設置屏幕,更改我們的值並單擊“保存”,您會注意到該值仍然會更改。我們現在需要實現對提交的Nonce字段的檢查,使用wp_verify_nonce( $name, $action )
:
驗證Nonce是否正確且相對於指定操作未過期。該函數用於驗證當前請求中發送的Nonce,通常通過
$_REQUEST
PHP變量訪問。
將我們插件的admin_screen()
函數的“保存設置”部分替換為以下代碼:
<code class="language-php">wp_nonce_field( 'implementing_wordpress_nonces_save', 'implementing_wordpress_nonces_nonce' );</code>
此代碼執行以下幾個操作:
為了確保我們的Nonce正在創建和驗證,讓我們再次嘗試訪問我們的“惡意”直接URL:
https://www.php.cn/link/0e143c3bef0f7759c230664c4dc905f8.
如果我們的Nonce已實現並正在驗證,您將看到“無效的Nonce指定”通知:
...(剩餘部分與原文相同,只是對語言和表達方式進行細微調整,保持原意不變)...
以上是什麼是WordPress Nonces?的詳細內容。更多資訊請關注PHP中文網其他相關文章!