WordPress 檔案權限標準設定整理

以下是 WordPress 建議的標準檔案權限設定方式,適合大多數主機環境使用。


一、整個網站權限

# 設定資料夾
find /你的wordpress路徑/ -type d -exec chmod 755 {} \;

# 設定檔案
find /你的wordpress路徑/ -type f -exec chmod 644 {} \;

二、uploads 資料夾

find wp-content/uploads -type d -exec chmod 755 {} \;
find wp-content/uploads -type f -exec chmod 644 {} \;

三、wp-config.php

chmod 600 wp-config.php

或:

chmod 640 wp-config.php

四、檔案擁有者

確認網站檔案擁有者正確,例如:

chown -R www-data:www-data /你的wordpress路徑/

(依主機環境調整使用者名稱)


五、建議安全設定

wp-content/uploads 新增 .htaccess

<Files *.php>
deny from all
</Files>

以上為 WordPress 常見且建議的標準權限設定方式。

使用 Cloudflare WAF 保護 WordPress:阻止 wp-login 攻擊與封鎖 XMLRPC(完整教學)

當你的 WordPress 網站開啟 Cloudflare 橙色雲(Proxy)後,其實 HTTP 攻擊應該在 Cloudflare Edge 層解決,而不是在伺服器層解決

很多人仍然使用 Fail2ban 嘗試封鎖 wp-login 攻擊,但在橙雲模式下:

  • 真正連線來源是 Cloudflare IP
  • iptables 無法阻擋真實攻擊者
  • 即使封鎖 IP 仍然會有流量進來

✅ 正確做法是使用 Cloudflare WAF Custom Rules。

本教學會示範兩條最重要的規則:

  1. 保護 wp-login.php
  2. 封鎖 xmlrpc.php

✅ 第一條規則:保護 wp-login.php

為什麼需要?

WordPress 的登入頁面:

/wp-login.php

是全球機器人暴力破解的主要目標。

即使你沒有公開登入頁,掃描機器仍然會嘗試。


🔧 建立規則步驟

Step 1:進入 Cloudflare

  1. 登入 Cloudflare
  2. 選擇你的網站
  3. 點擊:
Security → WAF → Custom Rules
  1. 點擊:
Create rule

Step 2:設定 Rule Name

請填寫:

WP-Login Protection

Step 3:點擊「Edit expression」

不要使用上方 Select 下拉選單。

請點擊右側:

Edit expression

Step 4:貼上以下 Expression

(http.request.uri.path contains "/wp-login.php")

如果你希望自己的固定 IP 不被影響,可以使用:

(http.request.uri.path contains "/wp-login.php")
and not ip.src in {你的IP地址}

例如:

(http.request.uri.path contains "/wp-login.php")
and not ip.src in {1.2.3.4}

Step 5:選擇 Action

在「Then take action」中選擇:

Managed Challenge

不要使用 Block,除非你 100% 不需要外部登入。


Step 6:點擊 Deploy

完成 ✅


✅ 效果說明

設定後:

  • 大部分 bot 會被 Challenge 阻擋
  • 真人用戶幾乎無感
  • 攻擊流量不再直接打到伺服器
  • CPU 使用率會下降

✅ 第二條規則:封鎖 XMLRPC


為什麼需要?

WordPress 的:

/xmlrpc.php

經常被利用作:

  • 暴力破解
  • Pingback 攻擊
  • DDoS 放大攻擊

如果你沒有使用:

  • Jetpack
  • WordPress App
  • 遠端發佈功能

✅ 建議直接封鎖。


🔧 建立規則步驟

Step 1:Create rule

同樣進入:

Security → WAF → Custom Rules

點擊:

Create rule

Step 2:Rule Name

填寫:

Block XMLRPC

Step 3:Edit expression

貼上:

(http.request.uri.path contains "/xmlrpc.php")

Step 4:Action

選擇:

Block


Step 5:Deploy

完成 ✅


✅ 建議規則順序

在 Custom Rules 頁面,請確保順序如下:

  1. Block XMLRPC
  2. WP-Login Protection

Cloudflare 會由上而下執行規則。


✅ 設定完成後的架構

啟用後流量流程變成:

攻擊者 → Cloudflare WAF → 被挑戰/封鎖 → 無法到達伺服器

而不是:

攻擊者 → 伺服器 → Fail2ban 分析 → 再封鎖

✅ 安全性更高
✅ 伺服器負載更低
✅ 不再需要 Fail2ban API 同步


✅ 常見問題

Q1:會不會影響 Google?

不會。

Cloudflare 會識別合法 bot,Managed Challenge 不會影響正常搜尋引擎。


Q2:是否還需要 Fail2ban?

建議:

  • 保留 Fail2ban 用於 SSH
  • 保護未使用 Cloudflare 的網站
  • 保護 API 服務

但對 HTTP WordPress 攻擊,可以完全交給 Cloudflare。


✅ 總結

只需兩條規則,你就可以:

  • 阻止 90% WordPress 掃描攻擊
  • 減少伺服器負載
  • 不再依賴 API 封鎖
  • 架構更清晰

Cloudflare WAF 應該成為橙雲網站的第一層防線,而不是伺服器。

WordPress 手動安裝教學(Linux 主機)

以下示範如何在 Linux 主機上手動下載並安裝 WordPress。

✅ 前置需求

  • 已安裝 Apache / Nginx
  • 已安裝 PHP
  • 已安裝 MySQL 或 MariaDB
  • 已建立資料庫與資料庫帳號

📥 步驟一:下載 WordPress

cd /tmp
wget https://wordpress.org/latest.tar.gz

說明:
進入 /tmp 目錄並下載最新版 WordPress 壓縮檔。


📦 步驟二:解壓縮檔案

tar -vxf latest.tar.gz

解壓縮後會產生 wordpress 目錄。


📂 步驟三:複製檔案到網站目錄

rsync -av wordpress/ /var/www/html/

說明:
將 WordPress 檔案同步到網站根目錄(此處以 /var/www/html/ 為例)。

⚠️ 如果你的網站目錄不同,請修改為實際目錄路徑。


🔐 步驟四:修改檔案權限

chown -R apache:apache /var/www/html/

說明:
將檔案擁有者改為 Apache 使用者(CentOS / RHEL 常用 apache)。

🔎 如果是 Ubuntu / Debian 系統:

chown -R www-data:www-data /var/www/html/

🗄️ 步驟五:建立資料庫

登入 MySQL:

mysql -u root -p

建立資料庫與使用者:

CREATE DATABASE wordpress;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

🌐 步驟六:完成網頁安裝

  1. 開啟瀏覽器
  2. 前往你的網域或 IP,例如: http://your-server-ip/
  3. 依照畫面輸入資料庫資訊
  4. 完成安裝 🎉

✅ 安裝完成

成功後即可登入後台:

http://your-domain/wp-admin

使用 iptables hashlimit 限制 HTTP 流量與安全回滾方法

在高流量或遭受爬蟲攻擊時,Web Server(如 Apache / Nginx)可能會因為大量連線而消耗過多 PHP-FPM 或系統資源。
Linux iptableshashlimit 模組可以有效限制「每個 IP 的連線速率」,是一種輕量且高效的防護方式。

本文說明:

  • hashlimit 的用途
  • 基本設定方法
  • 測試方式
  • 如何安全取消規則(回滾)

一、什麼是 hashlimit?

hashlimit 是 iptables 的一個 match module。

它的特色是:

✅ 針對「每個來源 IP」獨立計算流量
✅ 不會把所有訪客視為同一個來源
✅ 適合防止單一 IP 短時間內大量請求

-m limit 不同,limit 是全局限制,容易誤傷正常使用者。


二、基本 HTTP 限制範例

以下規則限制:

  • 每個 IP 每秒最多 30 個請求
  • 瞬間最多 80 個 burst
  • 超過後丟棄(DROP)

bash

iptables -A INPUT -p tcp --dport 80 \
-m hashlimit \
--hashlimit 30/sec \
--hashlimit-burst 80 \
--hashlimit-mode srcip \
--hashlimit-name http_limit \
-j ACCEPT

iptables -A INPUT -p tcp --dport 80 -j DROP

參數說明

參數說明
–hashlimit 30/sec每秒最多 30 個封包
–hashlimit-burst 80瞬間可達 80 個
–hashlimit-mode srcip以來源 IP 為單位計算
–hashlimit-name此限制規則的名稱

三、如何確認規則是否生效?

使用:

bash

iptables -L INPUT -n -v

可以看到每條規則的封包計數。

如需查看行號(刪除時會用到):

bash

iptables -L INPUT -n --line-numbers

四、如何安全取消規則?

✅ 方法一(推薦):使用行號刪除

先查看規則:

bash

iptables -L INPUT -n --line-numbers

假設顯示:

basic

num  target
1    ACCEPT  tcp dpt:80 hashlimit ...
2    DROP    tcp dpt:80

刪除方式:

bash

iptables -D INPUT 1
iptables -D INPUT 1

⚠ 注意:刪除第一條後,下面規則會往上移動。


✅ 方法二:使用完整規則刪除

bash

iptables -D INPUT -p tcp --dport 80 \
-m hashlimit \
--hashlimit 30/sec \
--hashlimit-burst 80 \
--hashlimit-mode srcip \
--hashlimit-name http_limit \
-j ACCEPT

iptables -D INPUT -p tcp --dport 80 -j DROP

⚠ 必須與建立規則時完全一致。


五、如果使用 iptables-persistent

若系統有安裝:

iptables-persistent

或使用:

netfilter-persistent

刪除規則後,請記得重新儲存:

bash

iptables-save > /etc/iptables/rules.v4

否則重開機後規則會恢復。


六、安全測試建議(避免誤封)

⚠ 在 Production 環境請勿直接啟用 DROP 規則。

建議測試流程:

1️⃣ 先只加入 hashlimit ACCEPT 規則
2️⃣ 觀察流量與錯誤日誌
3️⃣ 確認正常後再加入 DROP

或先於測試機驗證。


七、適用場景

  • WordPress 遭受爬蟲過度抓取
  • WooCommerce 頁面被大量請求
  • 想降低 PHP-FPM 壓力
  • 防止單一 IP 造成資源耗盡

八、注意事項

  • 若使用 Cloudflare,來源 IP 可能會變成 CDN IP
  • iptables 屬於 L3/L4 防火牆,無法判斷 URL
  • 規則順序非常重要

結語

hashlimit 是一種:

  • 高效
  • 核心層級
  • 不依賴應用程式

的流量控制方式。

但部署前務必測試,並確保有回滾方案,以避免影響正常使用者。

Fixed WordPress Images not showing up with HTTPS

Step 1. Appearance > Theme Editor

Step 2. Find header.php at right side {Theme Files}

In my case, I can’t find header.php. So, I click Writers Blogily.

I found Theme Header (header.php) and click it.

Add a meta in html head

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

click update file button on bottom

Complete! this problem was fixed