核心要點
is_email()
、username_exists()
、term_exists()
、validate_file()
、sanitize_email()
、sanitize_option()
、sanitize_text_field()
、sanitize_hex_color()
、wp_kses_post()
、esc_html()
、esc_url()
、esc_attr()
和esc_textarea()
。 本文是與 SiteGround 合作創作的系列文章的一部分。感謝您支持使 SitePoint 成為可能的合作夥伴。
鑑於 WordPress 佔據了 27% 的網絡份額,安全性是任何在這一廣受歡迎的開源平台上運行網站的人的首要關注點。儘管 WordPress 核心代碼的安全性由專門的開發團隊負責維護,但數千個第三方插件和主題卻並非如此,這些插件和主題擴展了 WordPress 的功能,使其幾乎可以完成任何您想要的操作。僅僅一個存在漏洞的插件或主題就可能對數百萬個網站構成高風險。
除非您使用可靠的託管服務提供商(例如我們的合作夥伴SiteGround),該提供商允許自動更新WordPress 插件並定期進行安全檢查,否則您的網站主題和插件的安全性完全取決於您自己。
在本文中,我將介紹一些準則和 WordPress 函數,您可以在 WordPress 主題開發中應用這些準則和函數,以確保您的產品在編寫時就將用戶的安全放在首位。
安全意識強的開發者的原則
對於專門的 WordPress 插件和主題開發者而言,安全性是他們在編寫每一行代碼時都放在首位的因素。
編寫安全 WordPress 主題的整體方法包括關注以下一般原則:
需要注意的事項
您需要注意的最常見威脅是:
網絡安全一直在發展,因此了解最新的威脅至關重要。在 WordPress 方面,Sucuri 博客是了解漏洞和攻擊的好地方。
數據驗證、清理和轉義
在接受來自任何來源(例如用戶、網絡服務、API 等)的任何輸入數據之前,您必須檢查它是否符合您的預期並且有效。此任務稱為驗證。
例如,如果您通過網站上的表單收集用戶的電子郵件,則您的代碼需要檢查用戶是否輸入了一些文本輸入(例如,不是一些數字或什麼都沒有),並且該輸入對應於有效的電子郵件地址,然後再將該數據輸入數據庫。
您可能認為這種檢查在主題中幾乎不需要。實際上,最好使用插件而不是主題來包含表單。但是,情況並非完全如此。例如,如果您計劃通過自定義器添加主題選項,則可能需要對用戶的輸入執行一些數據驗證。
清理包括過濾或清理來自用戶、網絡服務等的數據,這些數據即將存儲到數據庫中。在此過程中,您可以刪除數據中可能造成危害或不需要的任何內容,例如 JavaScript 語句、特殊字符等。
轉義包括確保數據安全顯示,例如刪除特殊字符、編碼 HTML 字符等。這裡的推薦做法是盡可能晚地進行轉義,即在屏幕上顯示數據之前進行轉義。
您需要在 WordPress 主題中進行大量的清理和轉義。實際上,為了安全起見,最好的方法是清理/轉義所有動態數據,即在 HTML 源代碼中未硬編碼的任何數據。
WordPress 驗證函數
您可以使用許多方便的 PHP 函數執行基本驗證。
例如,要檢查變量是否不存在或其值設置為false,可以使用 empty()
。
但是,為了使驗證變得輕而易舉,WordPress 提供了這些有用的函數。
您可以使用 is_email( $email )
函數檢查數據是否是有效的電子郵件地址。
例如:
<code class="language-php"> if ( is_email( 'test@domain.com' ) ) { echo '有效的电子邮件地址。'; }</code>
要檢查有效的用戶名,WordPress 提供了 username_exists( $username )
:
<code class="language-php"> $username = 'testuser'; if ( username_exists( $username ) ): echo "用户名已存在。"; endif;</code>
要確保標籤、類別或其他分類法術語存在,您可以使用 term_exists( $term, $taxonomy = '', $parent = null )
:
<code class="language-php"> // 检查类别“cats”是否存在 $term = term_exists('cats', 'category'); if ($term !== 0 && $term !== null) { echo "“cats”类别存在。"; }</code>
要確保文件路徑有效(但不是如果它存在),請使用 validate_file( $file, $allowed_files )
:
<code class="language-php"> $path = 'uploads/2017/05/myfile.php'; // 返回 0(有效路径) return validate_file( $path );</code>
WordPress 清理/轉義函數
使用內置的 WordPress 函數來清理和轉義數據是完成這項工作的最快捷、最安全的方法,因此請將其作為您的首選。
以下只是一些我在開發 WordPress 主題時經常使用的函數。
sanitize_email( $email )
刪除在有效電子郵件地址中不允許的所有字符。這是一個來自 Codex 條目的示例:
<code class="language-php"> $sanitized_email = sanitize_email(' admin@example.com! '); // 将输出:admin@example.com echo $sanitized_email;</code>
sanitize_option( $option, $value )
根據選項的性質清理選項值,例如來自自定義器輸入的值。這是一個示例:
<code class="language-php"> sanitize_option( 'admin_email', 'admin@test.com!' );</code>
sanitize_text_field( $str )
清理用戶或數據庫提供的字符串,但您可以使用它來清理任何您希望僅為純文本的數據:
<code class="language-php"> // 输出:标题 echo sanitize_text_field('<h1>标题</h1>');</code>
sanitize_hex_color( $color )
和 sanitize_hex_color_no_hash( $color )
在 WordPress 自定義器的上下文中工作。
當您的主題允許用戶為各種網站元素選擇顏色時,它們非常方便。
第一個函數驗證以 # 符號為前綴的十六進制顏色條目,而第二個函數處理沒有 # 的顏色數據。
來自 WordPress.org 代碼參考的示例:
<code class="language-php"> $wp_customize->add_setting( 'accent_color', array( 'default' => '#f72525', 'sanitize_callback' => 'sanitize_hex_color', ) );</code>
wp_kses_post( $data )
過濾內容,只留下允許的 HTML 標籤。在自定義器上下文中,當您的主題允許用戶輸入一些帶有 HTML 格式的文本時,這非常有用:
<code class="language-php"> function yourtheme_sanitize_html( $input ) { return wp_kses_post( force_balance_tags( $input ) ); }</code>
esc_html( $text )
是一種簡單的轉義 HTML 塊的方法。例如,如果您想在 HTML 標籤內輸出一些文本,以確保此文本本身不包含任何 HTML 標籤或其他無效字符,您可以編寫:
<code class="language-php"> <h2><?php echo esc_html( $title ); ?></h2></code>
esc_url( $url )
在您想要檢查和清理 URL(包括 href 和 src 屬性中的 URL)時非常有用。例如:
<code class="language-php"> <a href="https://www.php.cn/link/9e52112668804599bae71e241e4b4548'https://website.com'%20);%20?>">很棒的网站</a></code>
esc_attr( $text )
用於您的主題動態輸出 HTML 屬性的任何地方:
<code class="language-php"> <a href="https://www.php.cn/link/1649f854581e9c03bc2c4e06023c5b99'/'%20)%20);%20?>" rel="home"></a></code>
您可以使用 esc_textarea( $text )
來轉義用戶在文本區域中鍵入的文本:
<code class="language-php"> <textarea><?php echo esc_textarea( $text ); ?></textarea></code>
資源
以下很棒的資源對我真正掌握在 WordPress 主題中編寫安全代碼非常有幫助:
或者,您可以在我們為您整理的這份方便的比較中了解託管服務提供商如何在 WordPress 安全性方面提供幫助。
如果您對主題開發本身感興趣,您可以學習從頭開始創建一個基本的主題,方法是在 SitePoint 的“構建您的第一個 WordPress 主題”課程中學習:加載播放器……
結論
安全性必須放在所有 WordPress 開發者的首位。 WordPress 通過提供大量您可以插入主題中的現成函數,讓您有一個良好的開端。
因此,使用 WordPress 驗證和清理/轉義函數是您開始編寫安全可靠的 WordPress 主題(用戶將學會信任)的最簡單方法。
在編寫 WordPress 主題或插件時,您對安全性考慮了多少?您如何解決安全問題?
點擊下面的評論框分享!
關於 WordPress 主題驗證和轉義函數的常見問題解答
WordPress 編碼標準是由 WordPress 制定的一套特定規則和指南,以確保 WordPress 代碼的一致性和質量。這些標準很重要,因為它們使代碼更易於閱讀、理解和維護。它們還有助於防止常見的編碼錯誤和安全漏洞。對於開發者而言,遵循這些標準對於確保其主題和插件與 WordPress 及其他主題和插件兼容至關重要。
如果操作不當,編輯 WordPress 代碼可能會很危險。建議在更改主題代碼時使用子主題。這樣,您就可以進行更改而不會影響原始主題。此外,在進行任何更改之前,務必備份您的網站。使用合適的代碼編輯器,而不是 WordPress 編輯器來編輯代碼。最後,在將更改應用於您的實時網站之前,請在暫存網站上測試您的更改。
在定性分析中,代碼用於標記、編譯和組織您的數據,而主題用於識別數據中的模式和關係。代碼通常是表示特定數據片段的單個單詞或短語。另一方面,主題更廣泛,代表從編碼數據中出現的更大的概念或想法。
主題編碼是定性研究中使用的一種方法,用於識別和分析數據中的模式或主題。在 WordPress 中,主題編碼可以指開發具有特定設計或功能的主題的過程。這涉及以反映主題預期設計或功能的方式編寫和組織代碼。
驗證和轉義函數是 WordPress 中的安全措施。驗證是檢查用戶輸入的數據以確保其在處理之前符合特定條件的過程。轉義是通過去除可能導致安全漏洞的有害數據來確保輸出安全的過程。這些函數對於防止 SQL 注入和跨站腳本 (XSS) 等安全問題至關重要。
驗證和轉義數據對於確保 WordPress 網站的安全非常重要。如果沒有這些過程,您的網站可能會受到攻擊,攻擊者會將有害數據注入您的網站,從而導致潛在的數據丟失或未經授權訪問您的網站。
WordPress 提供了一些用於驗證和轉義數據的函數。例如,您可以使用 sanitize_text_field()
函數驗證文本輸入,並使用 esc_html()
函數轉義 HTML 輸出。在處理用戶輸入或將數據輸出到瀏覽器時,務必使用這些函數。
編寫安全 WordPress 代碼的一些最佳實踐包括遵循 WordPress 編碼標準、驗證和轉義所有數據、使用 nonce 驗證請求來源、在執行操作之前檢查用戶權限以及使 WordPress、主題和插件保持最新。
WordPress 開發者手冊是學習 WordPress 編碼標準的絕佳資源。它提供了對標準的詳細解釋和示例。還提供許多在線教程和課程,涵蓋 WordPress 編碼標準。
在為 WordPress 編碼時應避免的一些常見錯誤包括不遵循 WordPress 編碼標準、不驗證或轉義數據、硬編碼 URL、不使用 nonce 進行表單提交以及不使 WordPress、主題和插件保持最新。
以上是用內置的WordPress函數編碼安全主題的詳細內容。更多資訊請關注PHP中文網其他相關文章!