在密碼學(xué)中,nonce 指的是“使用一次的數(shù)字”,并生成用于保護(hù)表單和 URL 免受惡意黑客攻擊。它通常由隨機(jī)字母和數(shù)字組成,默認(rèn)壽命為一天,用作某些操作和輸入的身份驗(yàn)證工具。
WordPress是采用此安全功能的眾多平臺(tái)之一,盡管對(duì)其進(jìn)行了一些修改。無(wú)論您是希望提高平臺(tái)安全性的網(wǎng)站所有者,還是希望保護(hù)您的插件免受惡意用戶(hù)侵害的 WordPress 開(kāi)發(fā)人員,本文都將幫助您更好地理解 nonce。
下面,我們就來(lái)探索 WordPress nonce 的優(yōu)勢(shì)以及如何在WordPress 網(wǎng)站上創(chuàng)建和驗(yàn)證 nonce 。

什么是 WordPress 中的 Nonce
WordPress nonce 是一個(gè)“使用一次”的安全令牌,用于保護(hù) URL 和表單免受惡意攻擊。它幫助 WordPress 確定請(qǐng)求是否有效,防止未經(jīng)授權(quán)的操作和輸入。也稱(chēng)之為“隨機(jī)數(shù)驗(yàn)證”。
為什么使用 WordPress Nonce
WordPress nonces 保護(hù)平臺(tái)免受各種惡意攻擊,特別是跨站點(diǎn)請(qǐng)求偽造 (CSRF)。這種網(wǎng)絡(luò)攻擊利用 WordPress 安全漏洞誘騙用戶(hù)提交不需要的請(qǐng)求,從更改用戶(hù)的登錄詳細(xì)信息到刪除用戶(hù)帳戶(hù)。
以下是用戶(hù)想要?jiǎng)h除帖子時(shí)由 WordPress 生成的 URL 示例。
http://yourwebsite.com/wp-admin/post.php?post=123&action=trash
如果您執(zhí)行此 URL,WordPress 將檢查其身份驗(yàn)證 cookie 以驗(yàn)證“123”帖子的刪除請(qǐng)求。
問(wèn)題是 CSRF 攻擊很容易將此請(qǐng)求鏈接偽裝成其他東西。當(dāng)用戶(hù)單擊它時(shí),瀏覽器將附加身份驗(yàn)證 cookie 并使其看起來(lái)像一個(gè)有效請(qǐng)求。結(jié)果,WordPress 站點(diǎn)將執(zhí)行惡意 HTTP 請(qǐng)求,從而危及站點(diǎn)的內(nèi)容。
Nonce 通過(guò)向 URL 添加額外的保護(hù)層來(lái)防止 CSRF 攻擊。下面是一個(gè)由 WordPress 網(wǎng)站生成的帶有 nonce 驗(yàn)證的 URL 示例。
http://yourwebsite.com/wp-admin/post.php?post=123&action=trash&_wpnonce=b192fc4204
如果您嘗試在沒(méi)有 WordPress 生成正確 nonce 的情況下訪問(wèn)該 URL,您將看到403 Forbidden以及“您確定要這樣做嗎?”?錯(cuò)誤信息。
請(qǐng)記住,與真正的隨機(jī)數(shù)不同,WordPress nonce 隨機(jī)數(shù)可以多次使用,只要它們?nèi)匀挥行АordPress nonces 也是專(zhuān)門(mén)為每個(gè)會(huì)話生成的,這意味著一旦用戶(hù)登錄或退出頁(yè)面,它們的值將不再有效。
如何在 WordPress 中創(chuàng)建 Nonce
在 WordPress 中創(chuàng)建 nonces 需要將代碼添加到functions.php文件中。您可以使用主機(jī)或服務(wù)器面板的文件管理器編輯文件,或者使用FileZilla 等FTP 客戶(hù)端,甚至 File Manager 或 Filester 等在線文章編輯插件進(jìn)行修改。
要為 URL 創(chuàng)建 nonce,請(qǐng)調(diào)用wp_nonce_url()函數(shù)。在括號(hào)內(nèi)指定基本 URL 和表示 nonce 操作的字符串。這是刪除用戶(hù)帳戶(hù)的隨機(jī)數(shù)示例。
$nonce = wp_nonce_url($bare_url, 'delete-user_'.$user->ID);
您可以通過(guò)調(diào)用wp_nonce_field()函數(shù)向表單添加隨機(jī)數(shù),同時(shí)指定其用戶(hù)操作的字符串。該函數(shù)默認(rèn)創(chuàng)建兩個(gè)隱藏字段——第一個(gè)隱藏字段包含 nonce 值,而第二個(gè)隱藏字段包含當(dāng)前 URL。這是刪除評(píng)論的隨機(jī)數(shù)示例。
$nonce= wp_nonce_field('delete-comment_'.$comment_id);
要在其他上下文中添加 nonce,請(qǐng)使用wp_create_nonce()函數(shù)。與前面的函數(shù)一樣,不要忘記指定表示特定操作的字符串。
$nonce = wp_create_nonce('my-action_'.$post->ID );
nonce 的默認(rèn)生命周期是 24 小時(shí)。使用nonce_life過(guò)濾器以秒為單位修改 nonce 生命周期。
$nonce_life = apply_filters('nonce_life', DAY_IN_SECONDS);
如何在 WordPress 中驗(yàn)證 Nonce
您可以要求 WordPress 檢查嵌入在 URL、表單、AJAX 請(qǐng)求或其他上下文中的 nonce。如果檢查失敗,WordPress 將終止腳本執(zhí)行并返回 403 Forbidden 響應(yīng)。
使用check_admin_referer()函數(shù)來(lái)驗(yàn)證從管理屏幕中的表單傳遞的隨機(jī)數(shù)。指定 nonce 字段名稱(chēng)以獲得最大保護(hù),特別是如果您不使用默認(rèn)的_wpnonce字段名稱(chēng)。
這是一個(gè)驗(yàn)證刪除評(píng)論請(qǐng)求的隨機(jī)數(shù)的快速示例。
check_admin_referer( 'delete-comment_'.$comment_id );
要驗(yàn)證 AJAX 請(qǐng)求中傳遞的 nonce,請(qǐng)調(diào)用check_ajax_referer()函數(shù)并指定表示操作的字符串。
check_ajax_referer( 'process-comment' );
要在另一個(gè)上下文中調(diào)用 nonce 檢查,請(qǐng)使用wp_verify_nonce()函數(shù)并指定用戶(hù)操作的字符串。
wp_verify_nonce( $_REQUEST['my_nonce'], 'process-comment'.$comment_id );
注意:出于安全原因,切勿與其他用戶(hù)共享 nonce。請(qǐng)記住,只要它們?nèi)匀挥行В琖ordPress 隨機(jī)數(shù)就可以多次用于身份驗(yàn)證和授權(quán)。
總結(jié)
WordPress nonces 保護(hù)網(wǎng)站免受惡意用戶(hù)試圖執(zhí)行未經(jīng)授權(quán)的用戶(hù)操作。簡(jiǎn)而言之,nonce 通過(guò)將查詢(xún)字符串嵌入到管理屏幕中的 URL 和表單來(lái)工作,確保請(qǐng)求有效并且來(lái)自合法用戶(hù)。總之,Nonce 可能有助于保護(hù) WordPress 網(wǎng)站免受 CSRF 攻擊。





function.php在哪里?
通常來(lái)說(shuō),每個(gè)主題都會(huì)有一個(gè) function.php 文件,就在你啟用的那個(gè)主題的根文件夾,比如 wp-content/themes/你的主題文件夾/function.php