資深 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()
和HttpOnly
、Secure
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 自動檢測漏洞。
六、面試準備建議
- 熟悉 OWASP Top 10:
- 深入研究 OWASP Top 10(2021 版),掌握每種漏洞的原理與防範。
- 分享實務經驗:
- 準備 1-2 個案例,展示你修補漏洞的經驗(如 SQL 注入或 XSS)。
- 框架與工具:
- 熟悉 Laravel、Symfony 的內建安全功能。
- 了解 OWASP ZAP、Burp Suite 等資安工具。
- 程式碼審查:
- 練習找出不安全程式碼的問題並提出改進。
- 範例問題:
問題:存在 SQL 注入風險,應改用參數化查詢。$id = $_GET['id']; $query = "SELECT * FROM users WHERE id = $id";
- 模擬攻擊與防禦:
- 熟悉如何模擬 XSS、CSRF 攻擊並展示防禦措施。
七、推薦資源
- 文件與標準:
- OWASP 安全指南(https://owasp.org)
- PHP Security Guide(https://phpsecurity.readthedocs.io)
- 工具:
- PHPStan、Psalm:靜態分析工具。
- Composer Audit:檢查套件漏洞。
- 學習資源:
- 《Web Application Security》(O’Reilly)
- TryHackMe、Hack The Box 的 Web 安全實戰練習。
八、模擬面試問題
- 如何設計一個安全的 PHP 登入系統?
- 如何修補應用程式中的 SQL 注入漏洞?
- 如何安全處理敏感資料(如信用卡號)?
- 如何確保用戶提交的 JSON 資料安全?
- 如何實現安全的檔案下載功能?
九、總結
資深 PHP 後端工程師需具備深厚的資安知識,涵蓋漏洞防範、身份驗證、環境配置與監控等面向。透過熟悉 OWASP 標準、框架安全功能與實務經驗,你將能在面試中展現專業能力,贏得面試官的青睞。
沒有留言:
張貼留言