iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Security

資安新手的試煉之路系列 第 13

資安新手的試煉之路 Day 13

  • 分享至 

  • xImage
  •  

今天來講講PHP

PHP 相關的資安知識

PHP 是一種廣泛使用的伺服器端腳本語言,許多動態網站和 Web 應用程序使用 PHP 來處理表單數據、管理會話以及與資料庫進行互動。然而,由於 PHP 的靈活性和廣泛應用,若未進行適當的安全防護,會容易引入許多潛在的安全漏洞。以下介紹幾個常見的 PHP 資安問題及對應的防護措施。

1. SQL 注入(SQL Injection)

問題:SQL 注入是一種通過操縱應用程式構造 SQL 查詢的方式,讓攻擊者可以在資料庫中執行未經授權的查詢。攻擊者可以利用這一漏洞竊取、刪除或修改資料庫中的數據,甚至獲取對伺服器的控制權。

示例

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

在這段程式碼中,攻擊者可以在 usernamepassword 欄位中插入惡意 SQL 語句,從而訪問或修改資料庫內容。

防禦措施

  • 使用 準備好的語句(Prepared Statements)參數化查詢 來防止 SQL 注入。
  • PDO(PHP Data Objects) 和 mysqli 都支持準備好的語句。

安全的範例

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(['username' => $username, 'password' => $password]);

2. 跨站腳本攻擊(XSS)

問題:XSS 攻擊是指攻擊者在網站中注入惡意的 JavaScript 代碼,這些代碼會在用戶的瀏覽器中執行。攻擊者可以利用這一漏洞竊取用戶的身份信息、會話令牌等。

防禦措施

  • 輸出編碼:對所有用戶輸入的數據進行輸出編碼,特別是在 HTML、JavaScript、URL 等上下文中使用的數據。PHP 提供了 htmlspecialchars() 函數來對特殊字符進行編碼,避免瀏覽器將它們解釋為可執行代碼。

範例

echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

3. 檔案包含漏洞(File Inclusion Vulnerability)

問題:PHP 支持動態包含文件(如 include()require()),若開發者將用戶輸入的數據作為文件路徑,攻擊者可能通過檔案包含漏洞加載惡意文件,甚至可以遠端執行代碼。

示例

$page = $_GET['page'];
include($page . ".php");

攻擊者可以通過修改 page 參數來包含其他文件,甚至是伺服器上的敏感文件。

防禦措施

  • 禁止直接根據用戶輸入包含文件,應當對文件名進行白名單驗證,僅允許合法的文件。
  • 使用絕對路徑或對文件路徑進行強制檢查,防止非法文件被包含。
  • 開啟 open_basedir 限制,避免 PHP 腳本訪問指定目錄以外的文件。

4. 會話劫持(Session Hijacking)

問題:會話劫持是一種通過竊取或猜測用戶的會話 ID 來冒充合法用戶的攻擊。PHP 的會話機制($_SESSION)如果沒有妥善保護,可能會使攻擊者通過竊取會話 ID 來控制受害者的會話。

防禦措施

  • 使用 HTTPS 來保護會話 ID 的傳輸,避免會話 ID 在網路中被竊取。
  • 設置 HttpOnly 標記,防止 JavaScript 獲取會話 Cookie。
  • 為會話 ID 設置合理的過期時間,並在用戶登錄或敏感操作後重新生成會話 ID,使用 session_regenerate_id()
  • 限制會話的存取範圍(如 IP 地址或 User-Agent),以減少會話劫持的風險。

5. 跨站請求偽造(Cross-Site Request Forgery, CSRF)

問題:CSRF 攻擊是指攻擊者誘使用戶在已經認證的狀態下執行惡意請求,從而未經授權地操作目標網站上的資源。攻擊者可以利用用戶的認證身份來執行未經同意的操作,如更改密碼或轉賬等。

防禦措施

  • 通過生成並驗證 CSRF Token,在表單提交時附加唯一的隨機 Token,保證請求是由用戶合法發起的。

範例

// 生成 CSRF Token
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// 在表單中包含 CSRF Token
echo '<input type="hidden" name="csrf_token" value="'. $_SESSION['csrf_token'] .'">';

// 驗證 CSRF Token
if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    // 確認操作
} else {
    // 拒絕請求
}

6. 檔案上傳漏洞

問題:PHP 應用程序通常允許用戶上傳文件,如果對文件類型、大小或目錄沒有進行嚴格控制,攻擊者可能上傳惡意腳本並執行。

防禦措施

  • 嚴格限制允許上傳的文件類型和大小。
  • 不要將上傳的文件直接儲存在可執行目錄(如 /var/www/html/uploads),避免它們被當作 PHP 腳本執行。
  • 檢查文件的 MIME 類型、擴展名和內容一致性。

7. 錯誤處理與資訊洩漏

問題:如果 PHP 應用在發生錯誤時將完整的錯誤堆棧顯示給用戶,攻擊者可以利用這些信息瞭解應用的內部結構,進而進行更精確的攻擊。

防禦措施

  • 關閉 PHP 的錯誤顯示(display_errors),將錯誤記錄在伺服器日誌中而不是顯示給用戶。
  • 使用自定義錯誤頁面,避免洩露敏感伺服器信息。

結論

PHP 在開發動態網站和 Web 應用中廣泛應用,但它的靈活性也為安全問題提供了入口。了解 PHP 常見的安全問題並實施對應的防禦措施,對於保護應用程序的安全至關重要。開發者應該遵循安全編碼的最佳實踐,確保應用程序不易受到攻擊。


上一篇
資安新手的試煉之路 Day 12
下一篇
資安新手的試煉之路 Day 14
系列文
資安新手的試煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言