2025年9月29日 星期一

資深 PHP 後端工程師面試指南:資安篇

 

資深 PHP 後端工程師面試指南:資安篇

作為一名資深 PHP 後端工程師,資安知識是面試中不可或缺的一環。面試官通常會關注你對常見安全漏洞的理解、預防措施的實務經驗,以及在 PHP 生態系中應用安全最佳實踐的能力。本文整理了常見的資安問題、核心概念、程式碼範例與準備建議,幫助你在面試中展現專業能力。


一、常見 Web 安全漏洞與防範

以下是 PHP 後端工程師常被問到的資安問題,以及防範措施與程式碼範例:

1. SQL Injection (SQL 注入)

問題:如何防止 SQL 注入?PHP 中有哪些工具或方法可以安全處理資料庫查詢?

解答

  • 使用參數化查詢(Prepared Statements)或 PDO 綁定參數,避免直接拼接用戶輸入。
  • 避免使用已棄用的 mysql_* 函數。
  • 使用 ORM 框架(如 Laravel 的 Eloquent)降低風險。
  • 確保資料庫帳號權限最小化。

範例程式碼

$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $userId]);

2. Cross-Site Scripting (XSS)

問題:什麼是 XSS?如何在 PHP 應用程式中防範 XSS 攻擊?

解答

  • XSS 分為反射型、儲存型和 DOM 型,攻擊者透過注入惡意腳本危害用戶。
  • 防範措施:
    • 對用戶輸入進行過濾與轉義,使用 htmlspecialchars()
    • 使用 Content Security Policy (CSP) 限制腳本來源。
    • 在框架中(如 Laravel),使用 Blade 模板的 {{ }} 自動轉義。

範例程式碼

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

3. Cross-Site Request Forgery (CSRF)

問題:如何在 PHP 應用程式中實現 CSRF 保護?

解答

  • 使用 CSRF Token 確保表單提交來源合法。
  • 在後端驗證 Token 是否與 Session 中的一致。
  • 框架(如 Laravel)提供內建 CSRF 中間件。

範例程式碼

session_start();
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<form method="POST">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
</form>
<?php
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die('CSRF token validation failed');
}

4. Insecure Direct Object References (IDOR)

問題:什麼是 IDOR?如何避免這類漏洞?

解答

  • IDOR 發生在未正確驗證用戶權限,導致存取不屬於用戶的資源。
  • 防範措施:
    • 檢查用戶權限,確保只能存取其有權限的資料。
    • 使用間接參考(如 UUID)而非直接暴露資料庫 ID。

範例程式碼

if ($user->id !== $resource->user_id) {
    throw new UnauthorizedException('Access denied');
}

5. File Upload Vulnerabilities

問題:如何安全處理檔案上傳?

解答

  • 驗證檔案類型、大小和副檔名。
  • 儲存檔案至非公開目錄,透過腳本控制存取。
  • 使用隨機檔名避免覆蓋或可預測路徑。
  • 掃描檔案是否有惡意內容(如使用 ClamAV)。

範例程式碼

$allowedTypes = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['file']['type'], $allowedTypes)) {
    die('Invalid file type');
}

二、身份驗證與授權

1. 安全的身份驗證機制

問題:如何在 PHP 中實現安全的身份驗證?

解答

  • 使用安全的密碼雜湊演算法,如 password_hash()password_verify()
  • 實現多因素認證(MFA),如 TOTP。
  • 使用安全的 Session 管理,啟用 session_regenerate_id()HttpOnlySecure Cookie。

範例程式碼

$password = "user_password";
$hash = password_hash($password, PASSWORD_BCRYPT);
if (password_verify($password, $hash)) {
    echo "Password is valid!";
}

2. 安全的 API 授權機制

問題:如何設計安全的 API 授權?

解答

  • 使用基於角色的存取控制(RBAC)或屬性存取控制(ABAC)。
  • 簽發短效 JWT 並驗證簽名。
  • 實現速率限制防止濫用。

範例程式碼(使用 Firebase JWT):

require 'vendor/autoload.php';
use Firebase\JWT\JWT;

$key = "your_secret_key";
$payload = [
    'iss' => 'your_app',
    'sub' => $userId,
    'exp' => time() + 3600
];
$jwt = JWT::encode($payload, $key, 'HS256');

三、安全配置與環境管理

問題:如何確保 PHP 應用程式的環境安全?

解答

  • 關閉不必要函數(如 exec),在 php.ini 中設置:
    disable_functions = exec,shell_exec,passthru,system
    
  • 設定 display_errors = Off 防止錯誤訊息洩漏。
  • 使用環境變數儲存敏感資訊:
    $dbPassword = getenv('DB_PASSWORD');
    
  • 確保伺服器使用最新 PHP 版本,配置 HTTPS 和強加密 TLS。

四、日誌與監控

問題:如何記錄與監控潛在安全事件?

解答

  • 記錄敏感操作(如登入失敗),使用結構化日誌。
  • 使用 Monolog 等工具記錄日誌。
  • 實現入侵檢測系統(IDS)或使用 WAF。

範例程式碼

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$logger = new Logger('security');
$logger->pushHandler(new StreamHandler('logs/security.log', Logger::WARNING));
$logger->warning('Failed login attempt', ['user' => $username]);

五、進階資安問題

1. 防範反序列化漏洞

問題:如何防範 PHP 反序列化漏洞?

解答

  • 避免使用 unserialize() 處理不受信任輸入。
  • 限制反序列化的類別或改用 JSON 格式。

範例程式碼

$data = unserialize($input, ['allowed_classes' => ['SafeClass']]);

2. 安全的加密機制

問題:如何在 PHP 中實現安全的加密?

解答

  • 使用 sodium 擴展進行現代加密(如 AES-256-GCM)。
  • 避免使用 mcrypt 或弱演算法(如 MD5)。

範例程式碼

$key = sodium_crypto_secretbox_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = sodium_crypto_secretbox('sensitive data', $nonce, $key);

3. 第三方套件安全

問題:如何處理 PHP 應用程式中的第三方套件安全問題?

解答

  • 使用 composer audit 檢查套件漏洞。
  • 定期更新依賴,監控 CVE 資料庫。
  • 使用 Dependabot 或 Snyk 自動檢測漏洞。

六、面試準備建議

  1. 熟悉 OWASP Top 10
    • 深入研究 OWASP Top 10(2021 版),掌握每種漏洞的原理與防範。
  2. 分享實務經驗
    • 準備 1-2 個案例,展示你修補漏洞的經驗(如 SQL 注入或 XSS)。
  3. 框架與工具
    • 熟悉 Laravel、Symfony 的內建安全功能。
    • 了解 OWASP ZAP、Burp Suite 等資安工具。
  4. 程式碼審查
    • 練習找出不安全程式碼的問題並提出改進。
    • 範例問題:
      $id = $_GET['id'];
      $query = "SELECT * FROM users WHERE id = $id";
      
      問題:存在 SQL 注入風險,應改用參數化查詢。
  5. 模擬攻擊與防禦
    • 熟悉如何模擬 XSS、CSRF 攻擊並展示防禦措施。

七、推薦資源

  • 文件與標準
  • 工具
    • PHPStan、Psalm:靜態分析工具。
    • Composer Audit:檢查套件漏洞。
  • 學習資源
    • 《Web Application Security》(O’Reilly)
    • TryHackMe、Hack The Box 的 Web 安全實戰練習。

八、模擬面試問題

  1. 如何設計一個安全的 PHP 登入系統?
  2. 如何修補應用程式中的 SQL 注入漏洞?
  3. 如何安全處理敏感資料(如信用卡號)?
  4. 如何確保用戶提交的 JSON 資料安全?
  5. 如何實現安全的檔案下載功能?

九、總結

資深 PHP 後端工程師需具備深厚的資安知識,涵蓋漏洞防範、身份驗證、環境配置與監控等面向。透過熟悉 OWASP 標準、框架安全功能與實務經驗,你將能在面試中展現專業能力,贏得面試官的青睞。

沒有留言:

張貼留言

熱門文章