WordPress 安全作為一個過程

已發表: 2022-03-10
快速總結 ↬去年,WordPress 負責 83% 的受感染內容管理網站。 確保您沒有助長這些感染,並了解如何安全地管理 WordPress。

本文由 Sucuri 友情贊助。) WordPress 安全性沒有很好的聲譽。 根據 Alexa 對 +40.000 個 WordPress 網站所做的研究,超過 70% 的 WordPress 網站都存在某種漏洞。 如果你開發 WordPress 主題或插件——或者在你的網站上使用 WordPress——這個數字應該會嚇到你。

你可以做很多事情來確保你不是 70% 的一部分,但這比安裝插件或轉義字符串需要更多的工作。 本文中的很多建議都來自 Sucuri 的 WordPress 安全指南和多年的個人經驗。

WordPress不安全嗎?

WordPress 在內容管理系統中擁有最大的市場份額,在網絡上最受歡迎的 1000 萬個網站中佔有 30% 的市場份額。 這種成功使其成為黑客的大目標。 WordPress 的安全性並不低於其他內容管理系統——它只是更成功。

不到 10% 的 WordPress 黑客攻擊是 WordPress 核心中的漏洞造成的。 其中大部分來自過時的 WordPress 安裝。 發生在 WordPress 核心最新版本中的實際安全漏洞(也稱為零日漏洞)的黑客攻擊數量僅佔所有黑客攻擊的一小部分。

其餘受感染的站點是由插件、主題、託管和用戶引起的。 作為 WordPress 網站開發人員,您可以控制所有這些。 如果這對您來說似乎很麻煩,那麼我可以推薦 Sucuri 的代理計劃。 否則,讓我們自己找出如何處理 WordPress 安全性!

誰在攻擊你,為什麼?

讓我們首先打破一個神話:小型 WordPress 網站仍然是黑客的有吸引力的目標。 基於個人的攻擊非常罕見。 大多數被黑的 WordPress 網站都會被機器人或殭屍網絡自動入侵。

機器人是不斷搜索要入侵的網站的計算機程序。 他們不在乎你是誰; 他們只是在你的防守中尋找弱點。 殭屍網絡結合了許多機器人的計算能力來處理更大的任務。

黑客主要是在尋找進入您的服務器的方法,以便他們可以使用您服務器的計算能力並將其釋放到其他目標或目標上。 黑客出於以下原因想要您的服務器。

發送垃圾郵件

垃圾郵件約佔所有電子郵件的 60%,它必須從某個地方發送。 許多黑客希望通過有缺陷的插件或舊版本的 WordPress 核心進入您的服務器,以便他們可以將您的服務器變成垃圾郵件機器。

攻擊其他網站

分佈式拒絕服務攻擊使用多台計算機以無法跟上的大量流量淹沒網站。 這些攻擊很難緩解,尤其是在正確處理的情況下。 闖入您服務器的黑客可以將其添加到服務器池中以攻擊網站。

竊取資源

挖礦加密貨幣現在非常流行,但需要大量的計算能力。 不想在服務器場上花費大量資金的黑客會闖入未受保護的 WordPress 網站並獲得對服務器或網站訪問者的訪問權並竊取計算能力。

提高 SEO 分數

WordPress 的一個特別流行的黑客攻擊是訪問其數據庫並在每個帖子下方添加一堆(隱藏)文本,鏈接到另一個網站。 儘管谷歌對這種行為越來越警惕,而且黑名單也在增加,但這是一種提高 SEO 分數的非常快速的方法。

### 竊取數據

數據很有價值,尤其是當它與用戶資料和電子商務信息相關聯時。 獲取這些數據並將其出售可以使攻擊者獲得可觀的利潤。

為什麼安全很重要?

除了不讓犯罪分子滿意之外,還有很多原因可以說明您的網站在默認情況下應該是安全的。 我自己清理並處理了很多 WordPress 黑客攻擊,我可以肯定地說它們永遠不會在方便的時候發生。 清理可能需要幾個小時,並且會花費您或您的客戶的錢。

要讓被黑的 WordPress 網站重新啟動並運行,您需要刪除和替換所有第三方代碼(包括 WordPress 核心); 逐行梳理您自己的代碼和服務器上的所有其他文件夾,以確保它們仍然乾淨; 檢查未經授權的用戶是否獲得了訪問權限; 並替換 WordPress、服務器和數據庫中的所有密碼。

大量服務可以為您清理 WordPress 網站,但從長遠來看,預防要好得多。

除了清理成本外,黑客還可能在錯過銷售或潛在客戶方面付出很多代價。 黑客會降低您的搜索排名,從而減少訪問者和轉化次數。

不僅僅是財務成本,被黑客入侵還會損害您的聲譽。 訪問者訪問您的網站是因為他們信任您。 被黑客入侵會損害您的聲譽,並且需要很長時間才能修復。

也存在法律問題的真實可能性,特別是如果您在歐盟有客戶,GDPR 立法將於 2018 年夏季生效。新立法包括對未妥善處理的數據洩露的巨額罰款。

金錢、聲譽和法律問題:糟糕的安全性會讓您付出很多代價。 花一些時間以安全的心態建立您的網站、代碼和團隊肯定會得到回報。

讓我們找出如何防止所有這些討厭的事情發生。

中央情報局三合會

CIA 三元組是每個數字安全項目的基本框架。 它代表機密性、完整性和可用性。 CIA 是一套規則,用於限制對正確方的信息訪問,確保信息可信和準確,並保證對信息的可靠訪問。

對於 WordPress,CIA 框架歸結為以下內容。

保密

確保登錄的用戶分配了正確的角色,並且他們的能力得到了檢查。 只為用戶提供他們需要的最低訪問權限,並確保管理員信息不會洩露給錯誤的一方。 您可以通過強化 WordPress 的管理區域並小心使用用戶名和憑據來做到這一點。

正直

在您的網站上顯示準確的信息,並確保您網站上的用戶交互正確發生。

在前端和後端都接受請求時,請始終檢查意圖是否與實際操作匹配。 發布數據時,請始終使用清理和轉義來過濾代碼中的數據以查找惡意內容。 確保使用 Akismet 等垃圾郵件保護服務刪除垃圾郵件。

可用性

確保您的 WordPress、插件和主題是最新的,並且託管在可靠的(最好是託管的)WordPress 主機上。 每日自動備份還有助於確保您的網站始終可供公眾使用。

這三個元素相互依賴以獲得支持。 如果用戶的機密密碼很容易被盜或被猜到,代碼完整性將無法自行發揮作用。 所有方面對於穩固和安全的平台都很重要。

安全是一項艱鉅的工作。 除了可以在代碼中完成的工作之外,這個框架還有一個巨大的人為因素。 安全是一個持續的過程; 不是一個插件就能解決的。

第 1 部分:誠信——不信任任何事物

驗證用戶操作的意圖以及您正在處理的數據的完整性。 把你內心的嬉皮士扔到門外。 網上沒有任何東西可以信任,因此請仔細檢查您所做的一切是否存在惡意意圖。

數據驗證和清理

WordPress 擅長處理數據。 它確保每次交互都經過驗證,並且每一位數據都經過清理,但這僅在 WordPress 核心中。 如果您正在構建自己的插件或主題,甚至只是檢查一段第三方代碼,那麼了解如何做到這一點至關重要。

 //Cast our variable to a string, and sanitize it. update_post_meta( $post->ID, 'some-meta', sanitize_text_field( (string)$_POST['some-meta'] ) ); //Make sure our variable is an absolute integer. update_post_meta( $post->ID, 'some-int', absint( $_POST['int'] ) );

在此示例中,我們使用 update_post_meta 將兩條數據添加到 WordPress 帖子中。 第一個是字符串; 因此,我們將其轉換為 PHP 中的字符串,並使用sanitize_text_field不需要的字符和標籤,這是 WordPress 的眾多清理功能之一。

我們還在該帖子中添加了一個整數,並使用 absint 來確保這是一個絕對(非負)整數。

使用諸如update_post_meta之類的核心 WordPress 函數比直接使用 WordPress 數據庫更好。 這是因為 WordPress 會檢查需要存儲在數據庫中的所有內容以進行所謂的 SQL 注入。 SQL 注入攻擊通過您網站上的表單運行惡意 SQL 代碼。 該代碼操縱數據庫,例如,破壞一切、洩露用戶數據或創建虛假管理員帳戶。

如果您需要使用自定義表或在 WordPress 中執行複雜的查詢,請使用原生 WPDB 類,並在所有查詢上使用prepare函數來防止 SQL 注入攻擊:

 $tableName = $wpdb->prefix . “my_table”; $sql = $wpdb->prepare( “SELECT * FROM %s”, $tableName ); $results = $wpdb->get_results( $sql );

$wpdb->prepare 會檢查每個變量以確保沒有 SQL 注入攻擊的機會。

逃跑

轉義輸出與清理輸入一樣重要。 在保存數據之前驗證數據很重要,但您不能 100% 確定它仍然是安全的。 什麼都不相信。 WordPress 使用大量過濾器來啟用插件和主題來動態更改數據,因此您的數據也很有可能通過其他插件進行解析。 在將數據添加到主題或插件之前轉義數據是明智之舉。

轉義主要是為了防止跨站點腳本(XSS)攻擊。 XSS 攻擊將惡意代碼注入您網站的前端。 轉義數據的另一個好處是您可以確保您的標記在之後仍然有效。

WordPress 有很多轉義功能。 這是一個簡單的例子:

 <a href=“<?php echo esc_url( $url );?>” title=“<?php echo esc_attr( $title );?>”><?php echo esc_html( $title );?></a>

盡可能晚地逃跑。 這可確保您對數據擁有最終決定權。

保護請求

如果您啟用了 SSL 並且您有一個不錯的主機,那麼 WordPress 管理員請求已經非常安全,但是仍然存在一些漏洞。 您需要檢查用戶的意圖並驗證傳入請求是由實際登錄用戶完成的。

WordPress 使用隨機數驗證意圖。隨機數(或“僅使用一次的數字”)並不是 WordPress 中此 API 的準確描述。 它不僅使用數字,而且更像是跨站點請求偽造 (CSRF) 令牌,您可以在每個現代 Web 框架中找到它。 這些令牌確保黑客無法重複請求。 它不僅僅是一個隨機數,但 WordPress 喜歡向後兼容,所以這個名字就被保留了下來。

隨機數與用戶提出的每個易受攻擊的請求一起發送。 它們附加到 URL 和表單,並且在執行請求之前始終需要在接收端進行檢查。 您可以將 nonce 添加到表單或 URL。 這是表單中使用的示例:

 <form method= “post”> <!-- Add a nonce field: --> <?php wp_nonce_field( 'post_custom_form' );?> <!-- other fields: → ... </form>

在這種情況下,我們只是使用簡單的輔助函數wp_nonce_field() ,它為我們生成兩個隱藏字段,如下所示:

 <input type="hidden" name="_wpnonce" value="e558d2674e" /> <input type="hidden" name="_wp_http_referer" value="/wp-admin/post.php?post=2&action=edit" />

第一個字段通過使用生成的代碼和我們傳遞給函數的'post_custom_form'字符串來檢查意圖。 第二個字段添加了一個引用來驗證請求是否來自 WordPress 安裝。

在表單或 URL 的另一端處理任務之前,您將使用wp_verify_nonce檢查 nonce 及其有效性:

 if( wp_verify_nonce( $_REQUEST['_wpnonce'], 'post_custom_form' ) == false ){ wp_die( “Nonce isn\'t valid” ); }

在這裡,我們用我們的動作名稱檢查隨機數,如果不匹配,我們停止處理表單。

第三方代碼

第三方插件和主題是黑客的溫床。 在確保您的網站安全時,它們也是最難破解的問題。

大多數 WordPress 黑客攻擊是由 WordPress 的插件、主題和過期副本引起的。 沒有任何軟件是 100% 安全的,但是那裡的許多插件和主題要么有一段時間沒有被他們的開發人員更新,要么一開始就不安全。

更少的代碼意味著更少的黑客攻擊。 所以,在安裝另一個插件之前,問問自己是否真的需要它。 有沒有其他方法可以解決這個問題?

如果您確定需要插件或主題,請仔細判斷。 瀏覽 WordPress 的插件目錄時,請查看評級、“最後更新”日期和所需的 PHP 版本。 如果您找到了您要查找的內容並且一切似乎都正常,請在受信任的安全博客(例如 Sucuri 或 WordFence)上搜索任何提及它的內容。

另一種選擇是掃描代碼並確保它包含適當的隨機數、衛生和轉義; 這些通常是編寫良好且安全的代碼的標誌。 您不必了解 PHP 或進行完整的代碼審查。 驗證正確使用 WordPress 安全功能的一種簡單快捷的方法是在插件的代碼中搜索這些字符串:

  • esc_attr
  • esc_html
  • wp_nonce_field
  • wp_nonce_url
  • sanitize_text_field
  • $wpdb->prepare

如果插件不包含所有這些字符串,它仍然是安全的,但如果沒有找到或找到這些字符串的數量很少,那就是一個危險信號。 如果您確實發現了漏洞,請私下與創建者分享,並讓他們有時間修復它。

借助 wpvulndb 等計劃,跟踪 WordPress 插件空間中的漏洞變得越來越容易。

注意:那裡的一些主題將插件版本與其代碼捆綁在一起。 這是 WordPress 沒有很好的開箱即用依賴管理的一個症狀,但它也是一個寫得很糟糕的主題的標誌。 始終避免使用這些主題,因為它們包含無法更新的代碼庫。

主題和插件很少包含僅由一位開發人員編寫的代碼。 Composer 和 NPM使得依賴其他庫變得如此容易,以至於它已成為流行的攻擊媒介。 如果您正在下載一個簡單的 WordPress 主題或插件,這真的不是問題,但如果您正在使用使用 Composer 或 NPM 的工具,那麼檢查它們的依賴關係並沒有什麼壞處。 您可以使用 SensioLabs 提供的免費命令行界面 (CLI) 工具檢查 Composer 依賴項。 Snyk 之類的服務(您可以免費使用,但也有高級選項)使您能夠檢查項目中的每個依賴項。

第 2 部分:可用性:保持簡單

您的主要目標是讓您的網站不受干擾地在線。 即使擁有一流的安全性,您仍然可能會遇到麻煩。 發生這種情況時,出色的備份將為您省去很大的麻煩。

更新

沒有更新就不能存在開源。 大多數對 WordPress 網站的攻擊都發生在核心軟件或插件的過時版本上。 WordPress 核心的安全更新現在會自動處理(除非你禁用了它,你這個怪物!),但插件中的安全更新是另一回事。

使用流行的、受信任的插件進行更新通常是安全的,但所有插件都應在它們在您的網站上上線之前進行測試。 諸如 WP CLI 之類的工具使更新一切變得更加容易。 WordPress 首席開發人員 Mark Jaquith 有一篇非常棒的博客文章,介紹了自動逐步更新所有插件,以便您可以過濾掉可能的錯誤。

用戶、角色和能力

CIA 三合會中的“可用性”與正確掌握信息有關。 我們的主要優先事項是限制後端用戶的能力。 不要給每個人一個管理員帳戶。

WordPress 中的管理員帳戶異常強大。 vanilla WordPress 中甚至還有一個選項可以從 WordPress 管理員帳戶中更改您的完整代碼庫。 (如果這對您來說是新的並且您還沒有禁用它,請這樣做。)

WordPress 中的角色和能力系統功能強大,並且很容易在代碼中進行更改。 在使用 WordPress 時,我創建了很多新角色。 這樣做的主要好處是您可以完全控制各種用戶可以訪問系統的哪些部分,但另一個巨大的好處是它可以防止第三方代碼更改 WordPress 核心的標準功能。

電子郵件

WordPress 通常通過它所在的服務器處理電子郵件,但這會使您的所有電子郵件完全依賴於它所運行的服務器。 使用 SMTP 服務防止您的電子郵件被截獲並被視為垃圾郵件。 許多插件選項可用於確保您的所有郵件都通過安全的 SMTP 連接發送。

但是,您需要訪問域名的 DNS 設置才能添加發件人策略框架 (SPF) 記錄。 所有好的 SMTP 服務都會提供需要添加的準確記錄。 SPF 記錄可確保域授權您的 SMTP 服務以它的名義發送電子郵件。

監控

在線監控您的網站是一項可以完全自動化的 24/7 任務。 對於 WordPress,我們對正常運行時間和文件完整性感興趣。

監控正常運行時間通常是一個好的主機會為你做的事情。 Uptime Robot 等工具增加了更多安全性。 您的前 50 個網站完全免費。

關於文件完整性,如果黑客獲得對您服務器的訪問權限,他們可以更改您的代碼。

在這種情況下,插件可以解決您的問題。 Sucuri 有一個很棒的審計插件。 它會根據已知惡意代碼的龐大數據庫檢查您安裝中的所有文件。 它還會檢查 WordPress 核心是否仍然是 100% 的 WordPress 核心,如果存在漏洞,它會提醒您,以便您盡快修復它。

備份

每個安全過程的最終故障保護是自動備份。 大多數優秀的主機都會為您執行此操作,但如果您的主機不提供備份,還有其他不錯的選擇。 Automattic 製作了一個名為 VaultPress 的工具,並將 BackupBuddy 等工具備份到 Dropbox 帳戶或 Amazon S3 存儲桶。

WordPress 備份空間中的大多數可靠服務要么是高級服務,要么是高級插件。 根據您是否需要完全控制數據,您可能更喜歡雲主機附帶的插件,而不是服務。 不過,任何一個都值得每一分錢。

託管

WordPress 不是您服務器上運行的唯一軟件。 當你在糟糕的主機上時,大量的攻擊向量是開放的。 事實上,糟糕的託管是 WordPress 仍然支持過時版本的 PHP 的主要原因。 在撰寫本文時,WordPress 自己的統計頁面報告說,所有 WordPress 安裝中有 32.5% 運行在不再接收安全更新的 PHP 版本上。

截至 2018 年 5 月 10 日,WordPress 中的 PHP 版本。(查看大圖)

請注意,將近 60% 的安裝在 PHP 5.6 和 7.0 上運行,它們將在今年年底之前收到安全補丁。

但是,託管不僅對於使服務器軟件保持最新很重要。 一個好的主機將提供更多服務,例如自動每日備份、自動更新、文件完整性監控和電子郵件安全。 託管 WordPress 主機和為您提供具有數據庫訪問權限的在線文件夾的主機之間存在很大差異。

最好的建議是找到一個體面的託管 WordPress 主機。 它們的成本略高,但它們為您的 WordPress 網站提供了一個很好的支柱。

第 3 部分:保密

如果您已確保您的代碼庫盡可能安全,並且您在一個很棒的 WordPress 主機上,周圍有惡意軟件掃描程序和備份,那麼您仍然會遇到安全問題,因為人是最糟糕的… 在互聯網安全方面。

保密是關於教育你自己、你的客戶和網站的用戶。

機密數據

您可能不知道,但您的插件和主題可能會顯示有價值的機密數據。 例如,如果您將WP_DEBUG設置為true ,那麼您將向每個黑客展示您網站在服務器上的根路徑。 調試數據不應該在您的生產網站中佔有一席之地。

另一個有價值的數據源是評論和作者頁面。 這些充滿了用戶名,甚至電子郵件地址。 黑客可以將這些與弱密碼結合使用來進入您的網站。 警惕你向外界展示的東西。

另外,請仔細檢查您是否已將wp-config.php放入.gitignore中。

不要單獨編碼

防止大量錯誤潛入代碼庫的一種方法是練習結對編程。 如果你一個人,這要困難得多,但有許多在線社區願意進行快速代碼審計。 例如,WordPress 使用 Slack 來傳達有關其平台開發的所有信息。 你會發現那裡有很多願意提供幫助的人。 速度較慢但更好的選擇是 WordPress 論壇、StackOverflow 和 GitHub 問題,您的問題(和他們的答案!)會保存在那裡,以便其他人可以從中受益。

徵求意見可能很困難,但人們喜歡展示他們的專業知識,而 WordPress 總體上擁有一個非常開放和熱情的社區。 關鍵是,如果您從不要求輸入代碼質量,那麼您將不知道您的代碼是否安全。

登錄名和密碼

您的客戶需要登錄 WordPress 來管理他們的內容。 WordPress 核心盡其所能防止弱密碼通過,但這通常還不夠。

我建議為您的網站添加一個用於雙重身份驗證的插件,並限制登錄嘗試。 更好的是,完全取消密碼並使用魔術鏈接。

信任但要驗證

到目前為止,在本文中,我們還沒有討論過社會工程學。 這是一種正在獲得動力的黑客形式,但它通常不用於入侵 WordPress 網站。 但是,這是在考慮安全性的情況下圍繞您的網站建立文化的絕佳方式。 那是因為對抗社會工程的最佳防禦是“信任但驗證”。

每當客戶、用戶或您的老闆要求與安全相關的事情時,處理它的最佳方法是信任,但首先要驗證他們所說的是否屬實。

客戶可以聲稱他們需要管理員訪問 WordPress,但您的工作是驗證這是否屬實。 他們真的需要訪問權限,還是他們的角色只缺少一項功能? 有沒有辦法在不增加新的攻擊向量的情況下解決這個問題?

當涉及到安全問題時,“信任但驗證”是一個簡單而有效的口頭禪,它確實可以幫助人們加快速度。

結論

WordPress不安全嗎? 不,這不對。 WordPress 核心不斷更新和修復,大多數報告的 WordPress 黑客攻擊並非來自 WordPress 本身。 圍繞 WordPress 的文化是否不安全? 完全正確!

但是,通過對您編寫的每一行代碼、添加的每個用戶、啟用的每個插件以及支付的每筆託管費用都考慮到安全性,您至少可以確保您正在運行一個安全的網站,從而保持您的聲譽和您的數據安全。