首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

編寫安全 PHP 應用程式的七大核心習慣

     編輯:PHP 綜合知識

安全非單一技術,而是貫穿開發週期的習慣。本文整理七大核心安全習慣,涵蓋輸入驗證、檔案系統、資料庫、Session、XSS、CSRF、表單驗證,並提供具體防護程式碼模式。

習慣一:嚴格驗證所有輸入

原則:永遠不信任用戶輸入。採用「白名單」而非「黑名單」驗證。

// 錯誤:嘗試過濾惡意字元(黑名單)
$name = str_replace(['<', '>', '"'], '', $_POST['name']);

// 正確:定義允許的格式(白名單)
if (!preg_match('/^[a-zA-Z0-9_\-\s]{1,50}$/', $_POST['username'])) {
    throw new InvalidArgumentException('帳號格式錯誤');
}

// 內建過濾器
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$intId = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, ['min_range' => 1]);

習慣二:保護檔案系統

  • 禁止直接使用用戶輸入作為檔案路徑:include $_GET['page'] → 極度危險。
  • 使用 basename()、realpath() 限制在允許目錄內。
  • 上傳檔案:重新命名、驗證 MIME、儲存於 Webroot 外、提供下載腳本而非直接連結。
// 安全包含檔案
$page = basename($_GET['page'] ?? 'home');
$allowed = ['home', 'about', 'contact'];
if (in_array($page, $allowed)) {
    include "pages/{$page}.php";
}

習慣三:保護資料庫(防 SQL 注入)

唯一正解:預處理語句。

// PDO 範例
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = 1');
$stmt->execute([':email' => $_POST['email']]);
$user = $stmt->fetch();

// 禁止拼接字串
// $sql = "SELECT * FROM users WHERE email = '" . $_POST['email'] . "'"; // 錯誤!

習慣四:保護 Session 資料

  • session.cookie_httponly = 1 防 JavaScript 竊取。
  • session.cookie_secure = 1 僅 HTTPS 傳輸。
  • session.use_strict_mode = 1 拒絕未初始化的 Session ID。
  • 定期 session_regenerate_id(true) 防 Session Fixation。
  • 敏感資料加密儲存(如資料庫 Session handler 使用 AES)。

習慣五:防範跨站腳本攻擊(XSS)

輸出時轉義,而非輸入時過濾。

// HTML 內容
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

// HTML 屬性
echo '';

// JavaScript 內容
echo '';

// 使用模板引擎自動轉義(Twig, Blade, Latte)

習慣六:驗證表單來源(防 CSRF)


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

// 表單隱藏欄位
echo '';

// 驗證
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
        die('CSRF token 驗證失敗');
    }
    // 處理業務邏輯
}

習慣七:針對跨站請求偽造(CSRF)進行保護

同上習慣六,重點在於:

  • 所有狀態改變操作(POST/PUT/DELETE)必須驗證 Token。
  • Token 需不可預測(random_bytes())、綁定 Session、一次性或短時效。
  • SameSite Cookie 屬性:session.cookie_samesite = 'Strict' 或 'Lax' 作為第二道防線。

總結檢查清單

習慣關鍵動作工具/設定
輸入驗證白名單、filter_var、型別檢查PHP Filter, Respect\Validation
檔案系統路徑正規化、上傳隔離basename, realpath, move_uploaded_file
資料庫預處理語句、最小權限帳號PDO, mysqli
SessionHttpOnly, Secure, StrictMode, 再生 IDphp.ini, session_set_save_handler
XSS輸出轉義、CSP 標頭htmlspecialchars, json_encode, Twig/Blade
表單驗證CSRF Token、SameSite Cookierandom_bytes, hash_equals
CSRF同源檢查、雙重提交 CookieSameSite, CSRF Token

安全是系統工程,非單點修補。將這七大習慣內化為團隊開發文化,並持續跟進 CVE、OWASP Top 10、PHP 版本安全公告。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved