解決 WordPress 漏洞的 5 種最佳方法

已發表: 2020-02-01

目前,WordPress 覆蓋了 33% 的網絡。 這意味著大量用戶正在使用它,這肯定會吸引更多的攻擊者和黑客。 因此,有更多的威脅和攻擊,如 SQL 注入攻擊、重定向攻擊、CSRF 攻擊、XSS 攻擊等,導致 WordPress 存在漏洞。 因此,這並不意味著 WordPress 不安全。 我們必須專注於數據清理、數據驗證、數據轉義、使用和驗證 nonce、安全重定向、用戶功能等,以確保 WordPress 安全。 但是,WordPress 中的漏洞使其不安全。 所以,讓我們討論一下 WordPress 安全問題。

漏洞也出現在 WordPress 上。 但是怎麼做?

一方面,由於WordPress 漏洞存在重大威脅和攻擊。 另一方面,我們必須在 WordPress 開發過程中用我們的代碼克服或防止這些攻擊。

即使您不是 WordPress 開發人員,我們也鼓勵您閱讀這篇文章,因為您將能夠了解吸引黑客攻擊您網站的主要攻擊方式。 您還將能夠了解如何了解 WordPress編碼不佳的插件和主題。 如果您經營在線商店,那麼確定安全的最佳 WooCommerce 插件和主題對您很有用。

內容
1 WordPress 安全漏洞
2威脅和攻擊
2.1 WordPress 漏洞——SQL 注入攻擊
2.2數據清理
2.2.1數據清理示例:
2.3 WordPress 漏洞——XSS 攻擊
2.3.1 XSS攻擊示例:
2.4數據驗證
2.4.1數據驗證示例:
2.5數據轉義
2.5.1數據轉義示例:
2.6 WordPress 漏洞——CSRF 攻擊
2.7使用隨機數
2.8驗證 Nonce
2.9 WordPress 漏洞——重定向攻擊
2.10安全重定向
2.11用戶能力漏洞
2.12在 WordPress 中總是返回或退出

WordPress 安全漏洞

易受攻擊的代碼來自哪裡?

首先,我們應該對WordPress 安全問題的所在有一個很好的了解。 WordPress 由 WordPress 核心代碼、主題和插件組成,其中包括 Php、Html、javascript 和其他代碼。

開源社區檢查 WordPress 核心代碼。 有大量的人報告了這個錯誤並修復了這些漏洞,並因此獲得了榮譽。 WordPress 中的漏洞可被 SQL 注入攻擊、CSRF 攻擊、XSS 攻擊、重定向攻擊和其他類似技術利用。 所以,WordPress核心開發的漏洞並不多。

主題通常不與 wp 數據庫交互,網站也不經常更改主題。 由於 Gutenberg 是 WordPress 的默認編輯器,我們需要選擇 Gutenberg Compatible WordPress Themes 以獲得更好的性能和安全性。 因此,它發生的漏洞更少。

另一方面,WordPress 插件具有復雜的功能和行為。 此外,與用戶和數據庫的交互性很高。 該站點確實包含大量具有外部功能的插件。 因此,它們可能會給網站帶來大量漏洞。 插件在 WordPress 中引入了主要漏洞。

WordPress 漏洞 - 威脅和攻擊
WordPress 漏洞 – WPscan.org

根據 wpscan.org 的數據,11% 的漏洞來自主題,而 37% 的漏洞來自 WordPress Core 開發。 同樣,其餘 52% 來自插件。 我假設您已經知道什麼是 WordPress 插件

威脅和攻擊

如果您是 WP 主題或插件開發人員,那麼您必須對威脅和攻擊有充分的了解,以確保您的代碼安全並減少 WordPress 漏洞。

威脅與攻擊-SQL注入-XSS-CSRF-重定向
威脅和攻擊

SQL注入攻擊,XSS攻擊,重定向攻擊,CSRF攻擊等多種攻擊可以通過數據清理,數據驗證,數據轉義,使用和驗證nonce,安全重定向,用戶能力等來預防。

作為開發人員,您的敵人通常是惡意用戶。 此類用戶會損害我們的代碼。 當我們將永不信任用戶輸入納入我們的日常編碼行為時,我們已經在編寫更安全的代碼以減少 WordPress 中的安全問題的過程中完成了一半。 這將使您作為 WordPress 定制器的工作更輕鬆。

WordPress 漏洞 – SQL 注入攻擊

為了檢索關鍵和敏感數據,SQL 注入攻擊將惡意 SQL 代碼注入 WP 數據庫。 他們針對使用 SQL 數據庫的 WordPress 站點——MySQL、Oracle、SQL Server 等。

為此,他們可以訪問密碼、電子郵件地址或任何敏感數據,因為他們可以輕鬆添加、編輯或讀取數據。

我們可以舉一個著名的“鮑比桌”漫畫的例子。

著名的鮑比桌漫畫-威脅和攻擊
著名的鮑比桌漫畫

在這部漫畫中,一位女士保留了他兒子的名字“羅伯特”); 放表學生; --')'; 使用 SQL 命令輸入數據庫時,如果名稱沒有經過清理,將刪除學校的整個學生表。

因此,為了避免 SQL 注入,我們必須清理用戶輸入數據。

讓我們詳細討論數據清理。

數據清理

消毒意味著保護輸入,清理用戶輸入。 此過程從輸入中刪除無效文本、UTF-8 字符或代碼,以減少 WordPress 中的漏洞。

它將 HTML 特定字符轉換為實體,去除所有標籤。 它還刪除了換行符、製表符和額外的空格、去除八位字節,這些都是 WordPress 中主要安全問題的原因。

有很多 WordPress 內置功能來清理數據。 下面的列表中很少有:

  1. sanitize_email():去掉所有不應該出現在電子郵件中的字符
  2. sanitize_text_field():清理字符串(來自用戶輸入/數據庫)
  3. sanitize_file_name():去除字符(從文件名)
  4. sanitize_key():去除除小寫字母數字字符、破折號和下劃線之外的鍵。

數據清理示例:

 $title=sanitize_text_field($_POST['title']); update_post_meta($post->ID,'title',$title);

在這裡,首先,我們正在清理標題。 清理後,我們正在更新 wp 數據庫中的標題值。

 $Name= ' Robert'); DROP TABLE Students; --') '; INSERT INTO Students VALUES ('$Name'); INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --')

在上面的 SQL 命令中,名稱包含插入到學生表中的字符串和特殊字符和實體,名稱為“羅伯特”); 這將關閉插入 SQL 命令,另一個命令以名稱 DROP TABLE Students 的一半運行; --')'; 而這個drop table students刪除了數據庫的所有學生記錄。

因此,如果在將值輸入數據庫之前進行了清理,那麼您就不會丟失整個學生數據庫表。

讓我們看一個下面的例子來進行消毒。


 $Name=sanitize_text_field("' Robert'); DROP TABLE Students; --') ';"); $sql = $wpdb->prepare("INSERT INTO Students VALUES ($Name)"); /* this will only insert 'Robert DROP TABLE Students' */ $wpdb->query($sql);

在上面的示例中,清理已從名稱中刪除了額外的實體和字符,並且只允許將字符串插入數據庫中。 通過這種方式,我們可以安全地插入數據並避免 SQL 注入。

按照此鏈接了解有關保護輸入的更多信息。

WordPress 漏洞 – XSS 攻擊

跨站腳本 (XSS) 攻擊注入易受攻擊的腳本語言 javascript 代碼,以竊取其他用戶的類似數據,如 cookie、會話令牌和其他信息。 如果我們有 cookie 信息,那麼我們可以自動連接。 WordPress 中的安全問題伴隨著 cookie 被盜,因為我們可以輕鬆地使用其他身份登錄。
它在瀏覽器上運行。 數百萬瀏覽該網站的人將受到此攻擊的影響。 毫無疑問,這種攻擊是最嚴重的攻擊之一。

XSS 攻擊示例:

 <script <script type=”text/javascript”>
var hacker ='../hacker.php? cookie_data=' +escape(document.cookie);
</script>
</script>

在這個 XSS 攻擊示例中,cookie 逃逸並被發送到 hacker.php 腳本的變量 'cookie_data'

如果攻擊者將此腳本注入網站代碼中,那麼它將在用戶的瀏覽器中執行,並且 cookie 將被發送給攻擊者,這是一個危險的問題。 所以為了避免這種情況,我們需要驗證。 驗證和清理所有用戶輸入數據並轉義輸出數據。

下面我們來詳細討論。

數據驗證

驗證是檢查用戶輸入。 這樣做是為了檢查用戶是否輸入了有效值。
驗證數據的方法有三種,分別是內置 PHP 函數、核心 WordPress 函數和自定義函數。 永遠不要逃避這一點,以避免 WordPress 漏洞。 下面的列表中很少有:

  1. isset()/empty():檢查變量是否存在
  2. is_email():檢查給定數據是否為電子郵件格式
  3. is_serialized():檢查值是否為字符串

數據驗證示例:

 $number='12323'; if(intval(number)){ //do your things } else{ esc_html_e('Enter valid number','text-domain'); }

上面的例子檢查輸入數據是否為數字,如果是數字,它只會運行程序。 因此,數據驗證有助於減少 WordPress 安全問題。

點擊此鏈接以了解有關數據驗證的更多信息

數據轉義

逃避是確保輸出。 這是去除不需要的數據的過程,例如格式錯誤的 HTML 或腳本標籤。 轉義不僅將特殊的 HTML 字符轉換為 HTML 實體,而且還顯示而不是執行。 這樣做是為了防止 XSS 攻擊,並確保數據以用戶期望的方式顯示。
WordPress 提供了一些輔助函數。 它們用於大多數情況。 他們之中有一些是:

  1. esc_html():轉義 HTML 特定字符
  2. esc_attr():轉義 HTML 標籤屬性的值
  3. esc_url():轉義超文本引用屬性

數據轉義示例:

 $url = "javascript : alert ('Hello')";
<a href= "<?php echo esc_url ($url) ;?>"> Text </a> href= "<?php echo esc_url ($url) ;?>"> Text </a>

在上面的例子中,黑客已經輸入了腳本語言代碼來挑戰 WordPress 網站的安全問題。 所以為了避免這種情況,我們使用 esc_url 來轉義 URL 值,然後我們只在代碼中回顯該值。 這樣,我們就阻止了 XSS 攻擊。

WordPress 漏洞 – CSRF 攻擊

在 WordPress 漏洞中進一步討論,跨站點請求偽造攻擊是一鍵式威脅和攻擊或會話騎乘攻擊。
CSRF 攻擊允許攻擊者在未經用戶同意或不知情的情況下強制登錄用戶執行重要操作。
這裡,授權用戶發送未經授權的命令。
它依賴於這樣的想法,即發送到某個頁面或 URL 的授權用戶可能會做他們沒有意識到他們已經做過的事情。 此外,它可以通過使用 nonce 和驗證 nonce 來修復。

使用隨機數

WP 生成一個稱為 nonce 的安全令牌。 它是一個不重複的唯一編號,僅供您使用,您可以將其用於特定操作。 nonce 值在 24 小時內有效,過期後將由 wp 生成新的。 您也可以設置 nonce 的驗證時間。
它保護 URL 和表單不被濫用,以減少 WordPress 中現有的安全問題。

此外,為了使用 nonce 保護表單,請使用 wp_nonce_field() 函數創建一個隱藏的 nonce 字段:

 <form method="post"> <!-- some inputs here ... --> <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?> </form>

以下是nonce的幾個函數:

  1. wp_nonce_url() – 將 nonce 添加到 URL。
  2. wp_create_nonce() – 以自定義方式使用 nonce 來處理 AJAX 請求。

驗證 Nonce

  1. check_ajax_referer() – 檢查隨機數(但不檢查引用者),如果檢查失敗,則默認終止腳本執行。
  2. wp_verify_nonce() – 驗證隨機數。
 if(isset($_POST['name_of_nonce_field']) && wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action')){ //do something } else{ esc_html_e('Sorry,your nonce did not verify.','text-domain'); }

點擊此鏈接以了解有關nonce的更多信息

WordPress 漏洞 – 重定向攻擊

WordPress 漏洞還會導致網站訪問者自動重定向到惡意網站。
這通常發生在訪問者重定向到任何其他頁面而不是他們請求的頁面或網站時。
如果您的網站流量很高,那麼這種攻擊可能會導致您網站的流量減少。 您甚至不會意識到您的網站訪問者將被重定向到任何其他頁面。 但是,它可以在安全重定向的幫助下修復。

安全重定向

如果您將用戶重定向到任何頁面,則在操作或表單之後,請使用 wp_safe_redirect。 wp_safe_redirect 檢查允許的主機。 如果主機不被允許,那麼它將重定向到站點 URL。 因此,它將防止惡意重定向到另一台主機。 但這不是 wp_redirect 檢查的。 因此,為了減少 WordPress 的安全問題,使用 wp_safe_redirect 是一種更安全的鏈接重定向方式。

 $redirect=admin_url('edit.php'); wp_safe_redirect($redirect);

用戶能力漏洞

除了重定向攻擊、XSS 攻擊、CSRF 攻擊和 SQL 注入攻擊之外,WordPress 也容易受到用戶能力的攻擊。 如果您允許任何用戶來到您的站點提交任何數據,那麼請檢查用戶功能。 否則,您將成為威脅和攻擊的受害者。
用戶角色越高,用戶擁有的能力越多。
有時開發人員只是忘記確保在頁面上提交表單的用戶是否具有執行操作所需的權限。 它將帶來 WordPress 漏洞的共同來源。

 if ( current_user_can( 'edit_posts' ) ) { edit_post_link( esc_html__( 'Edit', 'wporg' ), '', ''); }

我們以Contact Form 7 漏洞(WordPress 漏洞類型)為例

這個插件的激活數是5+百萬用戶。 如果有一個易受攻擊的代碼,那麼它將影響 5+ 百萬人。

特權漏洞-聯繫表 7
Contact Form 7 的特權漏洞

5.0.3 及更早版本中存在功能漏洞。 以貢獻者角色登錄的用戶可以輕鬆地編輯聯繫表單。 默認情況下,只有管理員和編輯角色用戶可以訪問它。
因此,成為黑客的可能性更大。 新版本的插件解決了這些錯誤。

在 WordPress 中始終返回或退出

如果您在編寫任何函數或 ajax 調用時在完成代碼後錯過了返回或死亡。 它可能看起來很簡單,但可能會導致重要的安全問題。

確保你總是在你想要的地方添加回報和死亡。 您可以舉一個 Apple 的 #gotofail 錯誤示例。

 defined( 'ABSPATH' ) defined( 'ABSPATH' ) or die ( "No script kiddies please!" );
function function adls_view() { global $wpdb; { global $wpdb;
            include( 'inc/frontend/smls-detail/smls-grid-inline.php' );
           exit(); }
function function adls_generate_random_string ( $length ){
           $string = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $random_string = '';
            for ( $i = 1; $i <= $length; $i ++ ) { { $random_string .= $string[ rand( 0, 61 ) ];
            }
            return $random_string;
       }
 }

包起來

對於關心安全性的 WordPress 專業人士來說,這是一篇重要的文章。 從這篇文章中,您了解了給 WordPress 帶來漏洞的各種威脅和攻擊。 它包括SQL注入攻擊、XSS攻擊、CSRF攻擊、重定向攻擊等的簡要介紹。

驗證-清理-轉義-Nonce
要記住的要點

還討論了各種技術,例如數據清理、數據驗證、數據轉義、使用和驗證 nonce、安全重定向和用戶功能。 因此,WordPress 中存在安全問題。

總之

  1. 永遠不要相信用戶輸入以避免 WordPress 漏洞。
  2. 驗證、清理所有輸入並轉義所有輸出數據
  3. 讓我們相信 WordPress!

如果您在上述威脅和攻擊方面遇到任何問題,請告訴我們。 我們的專家將根據您的問題為您提供合適的解決方案。